Skip to content
This repository was archived by the owner on Jul 17, 2025. It is now read-only.

Commit 1ffc1ec

Browse files
committed
Make memcached naming convention and output csv files consistent
1 parent c783254 commit 1ffc1ec

File tree

3 files changed

+139
-112
lines changed

3 files changed

+139
-112
lines changed

kernel/tests/s11_rackscale_benchmarks.rs

Lines changed: 51 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ use testutils::rackscale_runner::{RackscaleBench, RackscaleRun};
2626
use testutils::runner_args::RackscaleTransport;
2727

2828
use testutils::memcached::{
29-
parse_memcached_output, rackscale_memcached_checkout, MemcachedShardedConfig,
30-
MEMCACHED_MEM_SIZE_MB, MEMCACHED_NUM_QUERIES,
29+
linux_spawn_memcached, parse_memcached_output, rackscale_memcached_checkout,
30+
MemcachedShardedConfig, MEMCACHED_MEM_SIZE_MB, MEMCACHED_NUM_QUERIES,
31+
RACKSCALE_MEMCACHED_CSV_COLUMNS,
3132
};
3233

3334
#[test]
@@ -477,12 +478,12 @@ struct MemcachedInternalConfig {
477478

478479
#[test]
479480
#[cfg(not(feature = "baremetal"))]
480-
fn s11_rackscale_memcached_benchmark_internal() {
481-
rackscale_memcached_benchmark(RackscaleTransport::Shmem);
481+
fn s11_rackscale_shmem_memcached_internal_benchmark() {
482+
rackscale_memcached_internal_benchmark(RackscaleTransport::Shmem);
482483
}
483484

484485
#[cfg(not(feature = "baremetal"))]
485-
fn rackscale_memcached_benchmark(transport: RackscaleTransport) {
486+
fn rackscale_memcached_internal_benchmark(transport: RackscaleTransport) {
486487
let is_smoke = cfg!(feature = "smoke");
487488

488489
let file_name = format!(
@@ -491,6 +492,11 @@ fn rackscale_memcached_benchmark(transport: RackscaleTransport) {
491492
);
492493
let _ignore = std::fs::remove_file(file_name.clone());
493494

495+
let baseline_file_name = "rackscale_baseline_memcached_benchmark.csv";
496+
if cfg!(feature = "baseline") {
497+
let _ignore = std::fs::remove_file(baseline_file_name.clone());
498+
}
499+
494500
let built = BuildArgs::default()
495501
.module("rkapps")
496502
.user_feature("rkapps:memcached-bench")
@@ -525,24 +531,32 @@ fn rackscale_memcached_benchmark(transport: RackscaleTransport) {
525531
.open(file_name)
526532
.expect("Can't open file");
527533
if write_headers {
528-
let row = "git_rev,benchmark,nthreads,mem,queries,time,thpt,num_clients,num_replicas\n";
529-
let r = csv_file.write(row.as_bytes());
534+
let r = csv_file.write(RACKSCALE_MEMCACHED_CSV_COLUMNS.as_bytes());
530535
assert!(r.is_ok());
531536
}
532537

533-
let actual_num_clients = if is_baseline { 0 } else { num_clients };
538+
let os_name = if is_baseline { "nros" } else { "dinos" };
539+
let protocol = if is_baseline {
540+
"internal"
541+
} else if file_name.contains(&RackscaleTransport::Ethernet.to_string()) {
542+
"tcp"
543+
} else {
544+
"shmem"
545+
};
534546

535547
let r = csv_file.write(format!("{},", env!("GIT_HASH")).as_bytes());
536548
assert!(r.is_ok());
549+
537550
let out = format!(
538-
"memcached_internal,{},{},{},{},{},{},{}",
551+
"memcached_internal,{},{},{},{},{},{},{},{}",
552+
os_name,
553+
protocol,
554+
num_clients,
539555
ret.b_threads,
540556
ret.b_mem,
541557
ret.b_queries,
542558
ret.b_time,
543-
ret.b_thpt,
544-
actual_num_clients,
545-
num_clients
559+
ret.b_thpt
546560
);
547561
let r = csv_file.write(out.as_bytes());
548562
assert!(r.is_ok());
@@ -619,18 +633,20 @@ fn rackscale_memcached_benchmark(transport: RackscaleTransport) {
619633
}
620634
}
621635

622-
let bench = RackscaleBench {
636+
let mut bench = RackscaleBench {
623637
test,
624638
cmd_fn,
625639
baseline_timeout_fn,
626640
rackscale_timeout_fn,
627641
mem_fn,
628642
};
629643

644+
bench.run_bench(false, is_smoke);
645+
630646
if cfg!(feature = "baseline") {
647+
bench.test.file_name = baseline_file_name.to_string();
631648
bench.run_bench(true, is_smoke);
632649
}
633-
bench.run_bench(false, is_smoke);
634650
}
635651

636652
#[ignore]
@@ -860,9 +876,7 @@ fn rackscale_memcached_dcm(transport: RackscaleTransport, dcm_config: Option<DCM
860876

861877
#[test]
862878
#[cfg(not(feature = "baremetal"))]
863-
fn s11_rackscale_memcached_benchmark_sharded_linux() {
864-
use std::fs::remove_file;
865-
879+
fn s11_linux_memcached_sharded_benchmark() {
866880
use rexpect::process::signal::Signal::SIGKILL;
867881

868882
let machine = Machine::determine();
@@ -910,86 +924,8 @@ fn s11_rackscale_memcached_benchmark_sharded_linux() {
910924
spawn_command(command, Some(timeout_ms)).expect("failed to spawn memcached")
911925
}
912926

913-
fn spawn_memcached(
914-
id: usize,
915-
config: &MemcachedShardedConfig,
916-
timeout_ms: u64,
917-
) -> Result<PtySession> {
918-
let con_info = if config.protocol == "tcp" {
919-
format!("tcp://localhost:{}", 11212 + id)
920-
} else {
921-
let pathname = config.path.join(format!("memcached{id}.sock"));
922-
if pathname.is_file() {
923-
remove_file(pathname.clone()).expect("Failed to remove path"); // make sure the socket file is removed
924-
}
925-
format!("unix://{}", pathname.display())
926-
};
927-
928-
let mut command = Command::new("bash");
929-
930-
command.args(&[
931-
"scripts/spawn-memcached-process.sh",
932-
id.to_string().as_str(),
933-
con_info.as_str(),
934-
(2 * config.mem_size).to_string().as_str(),
935-
config.num_threads.to_string().as_str(),
936-
]);
937-
command.current_dir(config.path.as_path());
938-
939-
println!("Spawning memcached:\n $ `{:?}`", command);
940-
941-
let mut res = spawn_command(command, Some(timeout_ms))?;
942-
std::thread::sleep(Duration::from_secs(1));
943-
944-
match res.exp_regex(r#"INTERNAL BENCHMARK CONFIGURE"#) {
945-
Ok((_prev, _matched)) => {
946-
println!(" $ OK.");
947-
Ok(res)
948-
}
949-
Err(e) => {
950-
println!(" $ FAILED. {}", e);
951-
Err(e)
952-
}
953-
}
954-
}
927+
let file_name = "linux_memcached_sharded_benchmark.csv";
955928

956-
fn spawn_loadbalancer(config: &MemcachedShardedConfig, timeout_ms: u64) -> Result<PtySession> {
957-
let mut command = Command::new("./loadbalancer/loadbalancer");
958-
command.args(&["--binary"]);
959-
command.arg(format!("--num-queries={}", config.num_queries).as_str());
960-
command.arg(format!("--num-threads={}", config.num_threads).as_str());
961-
command.arg(format!("--max-memory={}", config.mem_size / 8).as_str());
962-
let mut servers = String::from("--servers=");
963-
for i in 0..config.num_servers {
964-
if i > 0 {
965-
servers.push_str(",");
966-
}
967-
if config.protocol == "tcp" {
968-
if config.is_local_host {
969-
servers.push_str(format!("tcp://localhost:{}", 11212 + i).as_str());
970-
} else {
971-
// +1 because tap0 is reserved for the controller.
972-
let ip = 10 + i + 1;
973-
servers.push_str(format!("tcp://172.31.0.{}:{}", ip, 11211).as_str());
974-
}
975-
} else {
976-
servers.push_str(
977-
format!("unix://{}/memcached{}.sock", config.path.display(), i).as_str(),
978-
);
979-
}
980-
}
981-
command.arg(servers.as_str());
982-
command.current_dir(config.path.as_path());
983-
984-
// give the servers some time to be spawned
985-
std::thread::sleep(Duration::from_secs(5));
986-
987-
println!("Spawning Loadbalancer: \n $ `{:?}`", command);
988-
989-
spawn_command(command, Some(timeout_ms))
990-
}
991-
992-
let file_name = "memcached_benchmark_sharded_linux.csv";
993929
let _r = std::fs::remove_file(file_name);
994930

995931
let mut csv_file = OpenOptions::new()
@@ -998,8 +934,7 @@ fn s11_rackscale_memcached_benchmark_sharded_linux() {
998934
.open(file_name)
999935
.expect("Can't open file");
1000936

1001-
let row = "git_rev,benchmark,os,nthreads,protocol,mem,queries,time,thpt\n";
1002-
let r = csv_file.write(row.as_bytes());
937+
let r = csv_file.write(RACKSCALE_MEMCACHED_CSV_COLUMNS.as_bytes());
1003938
assert!(r.is_ok());
1004939

1005940
let max_threads_per_node = if is_smoke {
@@ -1032,9 +967,11 @@ fn s11_rackscale_memcached_benchmark_sharded_linux() {
1032967
parse_memcached_output(&mut pty, &mut output).expect("could not parse output!");
1033968
let r = csv_file.write(format!("{},", env!("GIT_HASH")).as_bytes());
1034969
assert!(r.is_ok());
970+
971+
//git_rev,benchmark,os,protocol,npieces,nthreads,mem,queries,time,thpt
1035972
let out = format!(
1036-
"memcached_sharded,linux,{},{},{},{},{},{}\n",
1037-
res.b_threads, "internal", res.b_mem, res.b_queries, res.b_time, res.b_thpt,
973+
"memcached_sharded,linux,{},{},{},{},{},{},{}\n",
974+
"internal", 1, res.b_threads, res.b_mem, res.b_queries, res.b_time, res.b_thpt,
1038975
);
1039976
let r = csv_file.write(out.as_bytes());
1040977
assert!(r.is_ok());
@@ -1060,22 +997,24 @@ fn s11_rackscale_memcached_benchmark_sharded_linux() {
1060997
let mut memcached_ctrls = Vec::new();
1061998
for i in 0..num_nodes {
1062999
memcached_ctrls.push(
1063-
spawn_memcached(i, &config, timeout_ms).expect("could not spawn memcached"),
1000+
linux_spawn_memcached(i, &config, timeout_ms)
1001+
.expect("could not spawn memcached"),
10641002
);
10651003
}
10661004

1067-
let mut pty =
1068-
spawn_loadbalancer(&config, timeout_ms).expect("failed to spawn load balancer");
1005+
let mut pty = testutils::memcached::spawn_loadbalancer(&config, timeout_ms)
1006+
.expect("failed to spawn load balancer");
10691007
let mut output = String::new();
10701008
use rexpect::errors::ErrorKind::Timeout;
10711009
match parse_memcached_output(&mut pty, &mut output) {
10721010
Ok(res) => {
10731011
let r = csv_file.write(format!("{},", env!("GIT_HASH")).as_bytes());
10741012
assert!(r.is_ok());
10751013
let out = format!(
1076-
"memcached_sharded,linux,{},{},{},{},{},{}\n",
1077-
res.b_threads,
1014+
"memcached_sharded,linux,{},{},{},{},{},{},{}\n",
10781015
protocol,
1016+
config.num_servers,
1017+
res.b_threads,
10791018
res.b_mem,
10801019
res.b_queries,
10811020
res.b_time,
@@ -1102,8 +1041,12 @@ fn s11_rackscale_memcached_benchmark_sharded_linux() {
11021041
let r = csv_file.write(format!("{},", env!("GIT_HASH")).as_bytes());
11031042
assert!(r.is_ok());
11041043
let out = format!(
1105-
"memcached_sharded,linux,{},{},failure,failure,failure,failure\n",
1106-
config.num_servers, protocol,
1044+
"memcached_sharded,linux,{},{},{},{},{},failure,failure\n",
1045+
protocol,
1046+
config.num_servers,
1047+
config.num_threads * config.num_servers,
1048+
config.mem_size,
1049+
config.num_queries,
11071050
);
11081051
let r = csv_file.write(out.as_bytes());
11091052
assert!(r.is_ok());
@@ -1166,6 +1109,7 @@ fn s11_rackscale_memcached_benchmark_sharded_nros() {
11661109
}
11671110
};
11681111

1112+
// TODO: consolidate code with testutils::memcached::spawn_loadbalancer
11691113
fn spawn_loadbalancer(config: &MemcachedShardedConfig, timeout_ms: u64) -> Result<PtySession> {
11701114
let mut command = Command::new("./loadbalancer/loadbalancer");
11711115
command.args(&["--binary"]);

kernel/testutils/src/memcached.rs

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33

44
use std::env;
5+
use std::fs::remove_file;
56
use std::io::Write;
67
use std::path::PathBuf;
78
use std::process::Command;
9+
use std::time::Duration;
810

911
use rexpect::errors::*;
10-
use rexpect::session::PtySession;
12+
use rexpect::session::{spawn_command, PtySession};
1113

1214
pub const MEMCACHED_MEM_SIZE_MB: usize = 4 * 1024;
1315
pub const MEMCACHED_NUM_QUERIES: usize = 1_000_000;
1416

17+
pub const RACKSCALE_MEMCACHED_CSV_COLUMNS: &str =
18+
"git_rev,benchmark,os,protocol,npieces,nthreads,mem,queries,time,thpt\n";
19+
1520
#[derive(Clone)]
1621
pub struct MemcachedShardedConfig {
1722
pub num_servers: usize,
@@ -173,3 +178,81 @@ pub fn rackscale_memcached_checkout(tmpdir: &str) {
173178
panic!("BUILD FAILED");
174179
}
175180
}
181+
182+
pub fn linux_spawn_memcached(
183+
id: usize,
184+
config: &MemcachedShardedConfig,
185+
timeout_ms: u64,
186+
) -> Result<PtySession> {
187+
let con_info = if config.protocol == "tcp" {
188+
format!("tcp://localhost:{}", 11212 + id)
189+
} else {
190+
let pathname = config.path.join(format!("memcached{id}.sock"));
191+
if pathname.is_file() {
192+
remove_file(pathname.clone()).expect("Failed to remove path"); // make sure the socket file is removed
193+
}
194+
format!("unix://{}", pathname.display())
195+
};
196+
197+
let mut command = Command::new("bash");
198+
199+
command.args(&[
200+
"scripts/spawn-memcached-process.sh",
201+
id.to_string().as_str(),
202+
con_info.as_str(),
203+
(2 * config.mem_size).to_string().as_str(),
204+
config.num_threads.to_string().as_str(),
205+
]);
206+
command.current_dir(config.path.as_path());
207+
208+
println!("Spawning memcached:\n $ `{:?}`", command);
209+
210+
let mut res = spawn_command(command, Some(timeout_ms))?;
211+
std::thread::sleep(Duration::from_secs(1));
212+
213+
match res.exp_regex(r#"INTERNAL BENCHMARK CONFIGURE"#) {
214+
Ok((_prev, _matched)) => {
215+
println!(" $ OK.");
216+
Ok(res)
217+
}
218+
Err(e) => {
219+
println!(" $ FAILED. {}", e);
220+
Err(e)
221+
}
222+
}
223+
}
224+
225+
pub fn spawn_loadbalancer(config: &MemcachedShardedConfig, timeout_ms: u64) -> Result<PtySession> {
226+
let mut command = Command::new("./loadbalancer/loadbalancer");
227+
command.args(&["--binary"]);
228+
command.arg(format!("--num-queries={}", config.num_queries).as_str());
229+
command.arg(format!("--num-threads={}", config.num_threads).as_str());
230+
command.arg(format!("--max-memory={}", config.mem_size).as_str());
231+
let mut servers = String::from("--servers=");
232+
for i in 0..config.num_servers {
233+
if i > 0 {
234+
servers.push_str(",");
235+
}
236+
if config.protocol == "tcp" {
237+
if config.is_local_host {
238+
servers.push_str(format!("tcp://localhost:{}", 11212 + i).as_str());
239+
} else {
240+
// +1 because tap0 is reserved for the controller.
241+
let ip = 10 + i + 1;
242+
servers.push_str(format!("tcp://172.31.0.{}:{}", ip, 11211).as_str());
243+
}
244+
} else {
245+
servers
246+
.push_str(format!("unix://{}/memcached{}.sock", config.path.display(), i).as_str());
247+
}
248+
}
249+
command.arg(servers.as_str());
250+
command.current_dir(config.path.as_path());
251+
252+
// give the servers some time to be spawned
253+
std::thread::sleep(Duration::from_secs(5));
254+
255+
println!("Spawning Loadbalancer: \n $ `{:?}`", command);
256+
257+
spawn_command(command, Some(timeout_ms))
258+
}

0 commit comments

Comments
 (0)