Skip to content

Commit ad0cf1f

Browse files
committed
feat(netbench): Rework run script, support usermode networking + rftrace
Signed-off-by: Jens Reidel <[email protected]>
1 parent 2bdc783 commit ad0cf1f

File tree

6 files changed

+183
-28
lines changed

6 files changed

+183
-28
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/target
2+
tracedir

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ members = [
3535
[patch.crates-io]
3636
socket2 = { git = "https://github.com/hermit-os/socket2.git", branch = "v0.5.x" }
3737
tokio = { git = "https://github.com/hermit-os/tokio.git", branch = "v/tokio-1.45.0" }
38+
39+
[profile.release-debug]
40+
inherits = "release"
41+
debug = true

benches/netbench/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@ clap = { version ="4.5", features = ["derive"] }
1313
core_affinity = "0.8"
1414
hdrhist = "0.5"
1515
hermit_bench_output = "0.1.0"
16+
rftrace = { version = "0.2", optional = true }
17+
rftrace-frontend = { version = "0.2", optional = true }
1618

1719
[target.'cfg(target_os = "hermit")'.dependencies]
1820
hermit = { path = "../../hermit", default-features = false }
1921

2022
[features]
21-
default = ["hermit/acpi", "hermit/pci", "hermit/smp", "hermit/tcp", "hermit/udp"]
23+
default = ["hermit/acpi", "hermit/pci", "hermit/smp", "hermit/tcp", "hermit/udp", "hermit/virtio-net"]
24+
rftrace = ["dep:rftrace", "dep:rftrace-frontend", "hermit/fs", "hermit/instrument"]
25+
dhcp = ["hermit/dhcpv4"]
2226

2327
[[bin]]
2428
name = "tcp-server-bw"

benches/netbench/run.sh

Lines changed: 138 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,155 @@
11
#!/usr/bin/env bash
22

3-
# Usage: run.sh TARGET BIN
4-
# Example: run.sh linux server-bw
5-
# run.sh hermit client-bw
3+
# Usage: run.sh TARGET BIN [--rftrace] [--user-networking]
4+
# Example: run.sh linux tcp-server-bw
5+
# run.sh hermit tcp-client-bw
66

77
set -o errexit
88

9+
rftrace=false
10+
user_networking=false
11+
target=
12+
bin=
13+
14+
while [[ $# -gt 0 ]]; do
15+
case "$1" in
16+
--rftrace)
17+
rftrace=true
18+
shift
19+
;;
20+
--user-networking)
21+
user_networking=true
22+
shift
23+
;;
24+
-*)
25+
echo "Unknown option: $1" >&2
26+
exit 1
27+
;;
28+
*)
29+
if [[ -z "$target" ]]; then
30+
target="$1"
31+
elif [[ -z "$bin" ]]; then
32+
bin="$1"
33+
else
34+
echo "Unexpected argument: $1" >&2
35+
exit 1
36+
fi
37+
shift
38+
;;
39+
esac
40+
done
41+
942
netbench_dir="${0%/*}"
1043
root_dir="$netbench_dir"/../..
1144

12-
bin=$2
1345
args="--bytes 1048576 --rounds 1000"
1446

1547
hermit() {
16-
echo "Building $bin image"
17-
18-
cargo build --manifest-path "$netbench_dir"/Cargo.toml --bin $bin \
19-
-Zbuild-std=core,alloc,std,panic_abort -Zbuild-std-features=compiler-builtins-mem \
20-
--target x86_64-unknown-hermit \
21-
--release
22-
23-
echo "Launching $bin image on QEMU"
24-
25-
qemu-system-x86_64 -cpu host \
26-
-enable-kvm -display none -smp 1 -m 1G -serial stdio \
27-
-kernel "$root_dir"/kernel/hermit-loader-x86_64 \
28-
-initrd "$root_dir"/target/x86_64-unknown-hermit/release/$bin \
29-
-netdev tap,id=net0,ifname=tap10,script=no,downscript=no,vhost=on \
30-
-device virtio-net-pci,netdev=net0,disable-legacy=on \
31-
-append "-- --address 10.0.5.1 $args"
48+
echo "Building $bin image"
49+
50+
rustflags=
51+
52+
cargo_cmd=(
53+
cargo build
54+
--manifest-path "$netbench_dir"/Cargo.toml
55+
--bin "$bin"
56+
-Zbuild-std=core,alloc,std,panic_abort
57+
-Zbuild-std-features=compiler-builtins-mem
58+
--target "$(uname -m)-unknown-hermit"
59+
--profile release-debug
60+
)
61+
62+
features=()
63+
64+
if $rftrace; then
65+
features+=(rftrace)
66+
rustflags="-Zinstrument-mcount"
67+
68+
mkdir -p tracedir
69+
70+
sudo /usr/libexec/virtiofsd \
71+
--socket-path=/tmp/vhostqemu \
72+
--shared-dir=$(pwd)/tracedir \
73+
--announce-submounts \
74+
--sandbox none \
75+
--seccomp none \
76+
--inode-file-handles=never &
77+
sleep 1
78+
79+
sudo chmod 777 /tmp/vhostqemu
80+
fi
81+
82+
if $user_networking; then
83+
features+=(dhcp)
84+
fi
85+
86+
features_str="${features[*]}"
87+
cargo_cmd+=(--features "$features_str")
88+
89+
RUSTFLAGS="$rustflags" "${cargo_cmd[@]}"
90+
91+
echo "Launching $bin image on QEMU"
92+
93+
qemu_cmd=(
94+
qemu-system-$(uname -m)
95+
-cpu host
96+
-enable-kvm
97+
-display none
98+
-smp 1
99+
-m 1G
100+
-serial stdio
101+
-kernel "$root_dir/kernel/hermit-loader-$(uname -m)"
102+
-initrd "$root_dir/target/$(uname -m)-unknown-hermit/release-debug/$bin"
103+
)
104+
105+
if $rftrace; then
106+
qemu_cmd+=(
107+
-chardev socket,id=char0,path=/tmp/vhostqemu
108+
-device vhost-user-fs-pci,queue-size=1024,packed=on,chardev=char0,tag=tracedir
109+
-object memory-backend-file,id=mem,size=1G,mem-path=/dev/shm,share=on
110+
-numa node,memdev=mem
111+
)
112+
fi
113+
114+
if $user_networking; then
115+
qemu_cmd+=(
116+
-netdev user,id=net0,hostfwd=tcp::9975-:9975,hostfwd=udp::9975-:9975,net=192.168.76.0/24,dhcpstart=192.168.76.9
117+
-device virtio-net-pci,netdev=net0,disable-legacy=on
118+
-append "-- --address 127.0.0.1 $args"
119+
)
120+
else
121+
qemu_cmd+=(
122+
-netdev tap,id=net0,ifname=tap10,script=no,downscript=no,vhost=on
123+
-device virtio-net-pci,netdev=net0,disable-legacy=on
124+
-append "-- --address 10.0.5.1 $args"
125+
)
126+
fi
127+
128+
sudo "${qemu_cmd[@]}"
129+
130+
if $rftrace; then
131+
sleep 1
132+
nm -n "$root_dir"/target/$(uname -m)-unknown-hermit/release-debug/$bin >tracedir/$bin.sym
133+
uftrace dump -d tracedir --flame-graph >tracedir/flamegraph.txt
134+
flamegraph.pl tracedir/flamegraph.txt >tracedir/flamegraph.svg
135+
firefox tracedir/flamegraph.svg
136+
fi
32137
}
33138

34139
linux() {
35-
echo "Launching $bin on linux"
140+
echo "Launching $bin on linux"
141+
142+
if $user_networking; then
143+
address=127.0.0.1
144+
else
145+
address=10.0.5.3
146+
fi
36147

37-
cargo run --manifest-path "$netbench_dir"/Cargo.toml --bin $bin \
38-
--release \
39-
--target x86_64-unknown-linux-gnu \
40-
-- \
41-
--address 10.0.5.3 $args
148+
cargo run --manifest-path "$netbench_dir"/Cargo.toml --bin $bin \
149+
--release \
150+
--target $(uname -m)-unknown-linux-gnu \
151+
-- \
152+
--address $address $args
42153
}
43154

44-
$1
155+
$target

benches/netbench/src/rust-tcp-bw/client.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
use std::io::{self, Write};
22

3+
#[cfg(feature = "rftrace")]
4+
extern crate rftrace as _;
35
use clap::Parser;
46
#[cfg(target_os = "hermit")]
57
use hermit as _;
8+
#[cfg(feature = "rftrace")]
9+
use rftrace_frontend as rftrace;
610
use rust_tcp_io_perf::config::Config;
711
use rust_tcp_io_perf::connection;
812

913
fn main() {
14+
#[cfg(feature = "rftrace")]
15+
let events = rftrace::init(100000, false);
16+
1017
let args = Config::parse();
1118

1219
println!("Connecting to the server {}:{}...", args.address, args.port);
@@ -18,6 +25,9 @@ fn main() {
1825
// Create a buffer of 0s, size n_bytes, to be sent over multiple times
1926
let buf = vec![0; args.n_bytes];
2027

28+
#[cfg(feature = "rftrace")]
29+
rftrace::enable();
30+
2131
for _i in 0..args.n_rounds {
2232
let mut pos = 0;
2333

@@ -31,9 +41,16 @@ fn main() {
3141
}
3242
}
3343
stream.flush().expect("Unexpected behaviour");
44+
45+
#[cfg(feature = "rftrace")]
46+
rftrace::disable();
47+
3448
connection::close_connection(&stream);
3549

3650
println!("Sent everything!");
51+
52+
#[cfg(feature = "rftrace")]
53+
rftrace::dump_full_uftrace(events, "/tracedir", "tcp-client-bw").unwrap();
3754
} else {
3855
println!("Couldn't connect to server...");
3956
}

benches/netbench/src/rust-tcp-bw/server.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
use std::io::Read;
22
use std::time::Instant;
33

4+
#[cfg(feature = "rftrace")]
5+
extern crate rftrace as _;
46
use clap::Parser;
57
#[cfg(target_os = "hermit")]
68
use hermit as _;
79
use hermit_bench_output::log_benchmark_data;
10+
#[cfg(feature = "rftrace")]
11+
use rftrace_frontend as rftrace;
812
use rust_tcp_io_perf::config::Config;
913
use rust_tcp_io_perf::connection;
1014

1115
fn main() {
16+
#[cfg(feature = "rftrace")]
17+
let events = rftrace::init(100000, false);
18+
1219
let args = Config::parse();
1320
let tot_bytes = args.n_rounds * args.n_bytes;
1421

@@ -18,6 +25,10 @@ fn main() {
1825
connection::setup(&args, &stream);
1926

2027
let start = Instant::now();
28+
29+
#[cfg(feature = "rftrace")]
30+
rftrace::enable();
31+
2132
for i in 0..args.n_rounds {
2233
print!("round {i}: ");
2334
let round_start = Instant::now();
@@ -27,6 +38,10 @@ fn main() {
2738
let mbits = buf.len() as f64 * 8.0f64 / (1024.0f64 * 1024.0f64 * duration.as_secs_f64());
2839
println!("{mbits} Mbit/s");
2940
}
41+
42+
#[cfg(feature = "rftrace")]
43+
rftrace::disable();
44+
3045
let end = Instant::now();
3146
let duration = end.duration_since(start);
3247

@@ -45,4 +60,7 @@ fn main() {
4560
);
4661

4762
connection::close_connection(&stream);
63+
64+
#[cfg(feature = "rftrace")]
65+
rftrace::dump_full_uftrace(events, "/tracedir", "tcp-server-bw").unwrap();
4866
}

0 commit comments

Comments
 (0)