From 62574a118c46bcf3e332480595ea04fa2ca33bd1 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 14:19:50 +0200 Subject: [PATCH 01/11] updated flake, renamed rust example to bythebook --- flake.lock | 18 +++++++++--------- flake.nix | 3 +++ wrk/rust/{hello => bythebook}/.gitignore | 0 wrk/rust/{hello => bythebook}/Cargo.toml | 0 wrk/rust/{hello => bythebook}/hello.html | 0 wrk/rust/{hello => bythebook}/src/lib.rs | 0 wrk/rust/{hello => bythebook}/src/main.rs | 0 7 files changed, 12 insertions(+), 9 deletions(-) rename wrk/rust/{hello => bythebook}/.gitignore (100%) rename wrk/rust/{hello => bythebook}/Cargo.toml (100%) rename wrk/rust/{hello => bythebook}/hello.html (100%) rename wrk/rust/{hello => bythebook}/src/lib.rs (100%) rename wrk/rust/{hello => bythebook}/src/main.rs (100%) diff --git a/flake.lock b/flake.lock index a85db44..6081b1c 100644 --- a/flake.lock +++ b/flake.lock @@ -92,11 +92,11 @@ }, "locked": { "dir": "contrib", - "lastModified": 1691226237, - "narHash": "sha256-/+JDL1T9dFh2NqCOXqsLSNjrRcsKAMWdJiARq54qx6c=", + "lastModified": 1692702614, + "narHash": "sha256-FeY8hAB77tnUTDbK6WYA+DG3Nx5xQrbOC17Cfl3pTm4=", "owner": "neovim", "repo": "neovim", - "rev": "42630923fc00633d806af97c1792b2ed4a71e1cc", + "rev": "014b87646fc3273a09d6b20ebb648a8eb24a0a98", "type": "github" }, "original": { @@ -108,11 +108,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1691235410, - "narHash": "sha256-kdUw6loESRxuQEz+TJXE9TdSBs2aclaF1Yrro+u8NlM=", + "lastModified": 1692698134, + "narHash": "sha256-YtMmZWR/dlTypOcwiZfZTMPr3tj9fwr05QTStfSyDSg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d814a2776b53f65ea73c7403f3efc2e3511c7dbb", + "rev": "a16f7eb56e88c8985fcc6eb81dabd6cade4e425a", "type": "github" }, "original": { @@ -184,11 +184,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1691237213, - "narHash": "sha256-RReB+o6jjJXjCHHJSny0p7NR/kNOu57jXEDX7jq9bp0=", + "lastModified": 1692663634, + "narHash": "sha256-wioqr80UOA0tNXaJy4D0i9fFaLG2RoQi5e9Dpd4WojE=", "owner": "mitchellh", "repo": "zig-overlay", - "rev": "a9d85674542108318187831fbf376704b71590f3", + "rev": "d666e5137fe0c43353c555fb47748813084decab", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 8d95a14..2adee62 100644 --- a/flake.nix +++ b/flake.nix @@ -65,6 +65,9 @@ pkgs.zlib pkgs.icu pkgs.openssl + + pkgs.neofetch + pkgs.util-linux # lscpu ]; buildInputs = with pkgs; [ diff --git a/wrk/rust/hello/.gitignore b/wrk/rust/bythebook/.gitignore similarity index 100% rename from wrk/rust/hello/.gitignore rename to wrk/rust/bythebook/.gitignore diff --git a/wrk/rust/hello/Cargo.toml b/wrk/rust/bythebook/Cargo.toml similarity index 100% rename from wrk/rust/hello/Cargo.toml rename to wrk/rust/bythebook/Cargo.toml diff --git a/wrk/rust/hello/hello.html b/wrk/rust/bythebook/hello.html similarity index 100% rename from wrk/rust/hello/hello.html rename to wrk/rust/bythebook/hello.html diff --git a/wrk/rust/hello/src/lib.rs b/wrk/rust/bythebook/src/lib.rs similarity index 100% rename from wrk/rust/hello/src/lib.rs rename to wrk/rust/bythebook/src/lib.rs diff --git a/wrk/rust/hello/src/main.rs b/wrk/rust/bythebook/src/main.rs similarity index 100% rename from wrk/rust/hello/src/main.rs rename to wrk/rust/bythebook/src/main.rs From 2739decb366120e0cba369815cc8be13342934e3 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 14:20:10 +0200 Subject: [PATCH 02/11] zig wrk example: reduce # of workers --- wrk/zig/main.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrk/zig/main.zig b/wrk/zig/main.zig index 4570cbe..d902747 100644 --- a/wrk/zig/main.zig +++ b/wrk/zig/main.zig @@ -19,6 +19,6 @@ pub fn main() !void { // start worker threads zap.start(.{ .threads = 4, - .workers = 4, + .workers = 2, // empirical tests: yield best perf on my machine }); } From 02b92d1f5c6c822f50022143cd44d19fe0f74564 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 14:20:38 +0200 Subject: [PATCH 03/11] wrk/measure.sh (@alexpyatttaev): pin processes to cpus --- wrk/measure.sh | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/wrk/measure.sh b/wrk/measure.sh index f3c06b4..aa674c5 100755 --- a/wrk/measure.sh +++ b/wrk/measure.sh @@ -6,6 +6,9 @@ DURATION_SECONDS=10 SUBJECT=$1 +TSK_SRV="taskset -c 0,1,2,3" +TSK_LOAD="taskset -c 4,5,6,7" + if [ "$SUBJECT" = "" ] ; then echo "usage: $0 subject # subject: zig or go" exit 1 @@ -13,61 +16,68 @@ fi if [ "$SUBJECT" = "zig" ] ; then zig build -Doptimize=ReleaseFast wrk > /dev/null - ./zig-out/bin/wrk & + $TSK_SRV ./zig-out/bin/wrk & PID=$! URL=http://127.0.0.1:3000 fi if [ "$SUBJECT" = "zigstd" ] ; then zig build -Doptimize=ReleaseFast wrk_zigstd > /dev/null - ./zig-out/bin/wrk_zigstd & + $TSK_SRV ./zig-out/bin/wrk_zigstd & PID=$! URL=http://127.0.0.1:3000 fi if [ "$SUBJECT" = "go" ] ; then cd wrk/go && go build main.go - ./main & + $TSK_SRV ./main & PID=$! URL=http://127.0.0.1:8090/hello fi if [ "$SUBJECT" = "python" ] ; then - python wrk/python/main.py & + $TSK_SRV python wrk/python/main.py & PID=$! URL=http://127.0.0.1:8080 fi if [ "$SUBJECT" = "sanic" ] ; then - python wrk/sanic/sanic-app.py & + $TSK_SRV python wrk/sanic/sanic-app.py & PID=$! URL=http://127.0.0.1:8000 fi if [ "$SUBJECT" = "rust" ] ; then - cd wrk/rust/hello && cargo build --release - ./target/release/hello & + cd wrk/rust/bythebook && cargo build --release + $TSK_SRV ./target/release/hello & + PID=$! + URL=http://127.0.0.1:7878 +fi + +if [ "$SUBJECT" = "rust2" ] ; then + cd wrk/rust/clean && cargo build --release + $TSK_SRV ./target/release/hello & PID=$! URL=http://127.0.0.1:7878 fi if [ "$SUBJECT" = "axum" ] ; then cd wrk/axum/hello-axum && cargo build --release - ./target/release/hello-axum & + $TSK_SRV ./target/release/hello-axum & PID=$! URL=http://127.0.0.1:3000 fi if [ "$SUBJECT" = "csharp" ] ; then cd wrk/csharp && dotnet publish csharp.csproj -o ./out - ./out/csharp --urls "http://127.0.0.1:5026" & + $TSK_SRV ./out/csharp --urls "http://127.0.0.1:5026" & PID=$! URL=http://127.0.0.1:5026 fi if [ "$SUBJECT" = "cpp" ] ; then cd wrk/cpp && zig build -Doptimize=ReleaseFast - ./zig-out/bin/cpp-beast 127.0.0.1 8070 . & + $TSK_SRV ./zig-out/bin/cpp-beast 127.0.0.1 8070 . & PID=$! URL=http://127.0.0.1:8070 fi @@ -76,7 +86,7 @@ sleep 1 echo "========================================================================" echo " $SUBJECT" echo "========================================================================" -wrk -c $CONNECTIONS -t $THREADS -d $DURATION_SECONDS --latency $URL +$TSK_LOAD wrk -c $CONNECTIONS -t $THREADS -d $DURATION_SECONDS --latency $URL kill $PID From 8b82cae541a5caa3e084a90d146726b0819109a1 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 14:22:21 +0200 Subject: [PATCH 04/11] added @alexpyattaev clean rust bench version --- wrk/rust/clean/.gitignore | 14 +++++ wrk/rust/clean/Cargo.toml | 9 ++++ wrk/rust/clean/hello.html | 1 + wrk/rust/clean/src/lib.rs | 101 +++++++++++++++++++++++++++++++++++++ wrk/rust/clean/src/main.rs | 41 +++++++++++++++ 5 files changed, 166 insertions(+) create mode 100644 wrk/rust/clean/.gitignore create mode 100644 wrk/rust/clean/Cargo.toml create mode 100644 wrk/rust/clean/hello.html create mode 100644 wrk/rust/clean/src/lib.rs create mode 100644 wrk/rust/clean/src/main.rs diff --git a/wrk/rust/clean/.gitignore b/wrk/rust/clean/.gitignore new file mode 100644 index 0000000..6985cf1 --- /dev/null +++ b/wrk/rust/clean/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/wrk/rust/clean/Cargo.toml b/wrk/rust/clean/Cargo.toml new file mode 100644 index 0000000..c9ba87b --- /dev/null +++ b/wrk/rust/clean/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "hello" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# crossbeam = { version = "0.8.2", features = ["crossbeam-channel"] } diff --git a/wrk/rust/clean/hello.html b/wrk/rust/clean/hello.html new file mode 100644 index 0000000..a2b3773 --- /dev/null +++ b/wrk/rust/clean/hello.html @@ -0,0 +1 @@ +Hello from RUST! diff --git a/wrk/rust/clean/src/lib.rs b/wrk/rust/clean/src/lib.rs new file mode 100644 index 0000000..6e5d88d --- /dev/null +++ b/wrk/rust/clean/src/lib.rs @@ -0,0 +1,101 @@ +//Crossbeam should, but does not make this faster. +//use crossbeam::channel::bounded; +use std::{net::TcpStream, sync::mpsc, thread}; +type Job = (fn(TcpStream), TcpStream); + +type Sender = mpsc::Sender; +//type Sender = crossbeam::channel::Sender; + +type Receiver = mpsc::Receiver; +//type Receiver = crossbeam::channel::Receiver; + +pub struct ThreadPool { + workers: Vec, + senders: Vec, + + next_sender: usize, +} + +impl ThreadPool { + /// Create a new ThreadPool. + /// + /// The size is the number of threads in the pool. + /// + /// # Panics + /// + /// The `new` function will panic if the size is zero. + pub fn new(size: usize) -> ThreadPool { + assert!(size > 0); + + let mut workers = Vec::with_capacity(size); + let mut senders = Vec::with_capacity(size); + + for id in 0..size { + //let (sender, receiver) = bounded(2); + let (sender, receiver) = mpsc::channel(); + senders.push(sender); + workers.push(Worker::new(id, receiver)); + } + + ThreadPool { + workers, + senders, + next_sender: 0, + } + } + /// round robin over available workers to ensure we never have to buffer requests + pub fn execute(&mut self, handler: fn(TcpStream), stream: TcpStream) { + let job = (handler, stream); + self.senders[self.next_sender].send(job).unwrap(); + //self.senders[self.next_sender].try_send(job).unwrap(); + self.next_sender += 1; + if self.next_sender == self.senders.len() { + self.next_sender = 0; + } + } +} + +impl Drop for ThreadPool { + fn drop(&mut self) { + self.senders.clear(); + + for worker in &mut self.workers { + println!("Shutting down worker {}", worker.id); + if let Some(thread) = worker.thread.take() { + thread.join().unwrap(); + } + } + } +} + +struct Worker { + id: usize, + thread: Option>, +} + +impl Worker { + fn new(id: usize, receiver: Receiver) -> Worker { + let thread = thread::spawn(move || Self::work(receiver)); + + Worker { + id, + thread: Some(thread), + } + } + + fn work(receiver: Receiver) { + loop { + let message = receiver.recv(); + match message { + Ok((handler, stream)) => { + // println!("Worker got a job; executing."); + handler(stream); + } + Err(_) => { + // println!("Worker disconnected; shutting down."); + break; + } + } + } + } +} diff --git a/wrk/rust/clean/src/main.rs b/wrk/rust/clean/src/main.rs new file mode 100644 index 0000000..d6138d9 --- /dev/null +++ b/wrk/rust/clean/src/main.rs @@ -0,0 +1,41 @@ +use hello::ThreadPool; +use std::io::prelude::*; +use std::net::TcpListener; +use std::net::TcpStream; + +fn main() { + let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); + //Creating a massive amount of threads so we can always have one ready to go. + let mut pool = ThreadPool::new(128); + + // for stream in listener.incoming().take(2) { + for stream in listener.incoming() { + let stream = stream.unwrap(); + //handle_connection(stream); + pool.execute(handle_connection, stream); + } + + println!("Shutting down."); +} + +fn handle_connection(mut stream: TcpStream) { + stream.set_nodelay(true).expect("set_nodelay call failed"); + let mut buffer = [0; 1024]; + let nbytes = stream.read(&mut buffer).unwrap(); + if nbytes == 0 { + return; + } + + let status_line = "HTTP/1.1 200 OK"; + + let contents = "HELLO from RUST!"; + + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); + + stream.write_all(response.as_bytes()).unwrap(); +} From 61fabea500607327d5f005f9dfc68ec8e7e8949c Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 15:25:42 +0200 Subject: [PATCH 05/11] added measure_all and graph.py thx @112RG's hyperbench --- .gitignore | 2 ++ flake.nix | 1 + wrk/graph.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++ wrk/measure_all.sh | 9 +++++ 4 files changed, 94 insertions(+) create mode 100644 wrk/graph.py create mode 100755 wrk/measure_all.sh diff --git a/.gitignore b/.gitignore index b7cbd80..6b2dd8e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ scratch docs/ .DS_Store .vs/ +**/*.perflog +wrk/*.png diff --git a/flake.nix b/flake.nix index 2adee62..f278263 100644 --- a/flake.nix +++ b/flake.nix @@ -48,6 +48,7 @@ wrk python39 python39Packages.sanic + python39Packages.matplotlib poetry poetry pkgs.rustc diff --git a/wrk/graph.py b/wrk/graph.py new file mode 100644 index 0000000..617a590 --- /dev/null +++ b/wrk/graph.py @@ -0,0 +1,82 @@ +import re +import os +import matplotlib.pyplot as plt +from matplotlib.ticker import FuncFormatter +from collections import defaultdict +import statistics + +directory = "./" # Replace with the actual directory path + +requests_sec = defaultdict(list) +transfers_sec = defaultdict(list) + +mean_requests = {} +mean_transfers = {} + + +def plot(kind='', title='', ylabel='', means=None): + # Sort the labels and requests_sec lists together based on the requests_sec values + labels = [] + values = [] + + # silly, I know + for k, v in means.items(): + labels.append(k) + values.append(v) + + # sort the labels and value lists + labels, values = zip(*sorted(zip(labels, values), key=lambda x: x[1], reverse=True)) + + # Plot the graph + plt.figure(figsize=(10, 6)) # Adjust the figure size as needed + bars = plt.bar(labels, values) + plt.xlabel("Subject") + plt.ylabel(ylabel) + plt.title(title) + plt.xticks(rotation=45) # Rotate x-axis labels for better readability + + # Display the actual values on top of the bars + for bar in bars: + yval = bar.get_height() + plt.text(bar.get_x() + bar.get_width() / 2, yval, f'{yval:,.2f}', ha='center', va='bottom') + + plt.tight_layout() # Adjust the spacing of the graph elements + plt.savefig(f"{kind.lower()}_graph.png") # Save the graph as a PNG file + + +if __name__ == '__main__': + # Iterate over the files in the directory + for filename in os.listdir(directory): + if filename.endswith(".perflog"): + label = os.path.splitext(filename)[0] + file_path = os.path.join(directory, filename) + + with open(file_path, "r") as file: + lines = file.readlines() + for line in lines: + # Extract the Requests/sec value using regular expressions + match = re.search(r"Requests/sec:\s+([\d.]+)", line) + if match: + requests_sec[label].append(float(match.group(1))) + match = re.search(r"Transfer/sec:\s+([\d.]+)", line) + if match: + value = float(match.group(1)) + if 'KB' in line: + value *= 1024 + elif 'MB' in line: + value *= 1024 * 1024 + value /= 1024.0 * 1024 + transfers_sec[label].append(value) + + # calculate means + for k, v in requests_sec.items(): + mean_requests[k] = statistics.mean(v) + + for k, v in transfers_sec.items(): + mean_transfers[k] = statistics.mean(v) + + # save the plots + plot(kind='req_per_sec', title='Requests/sec Comparison', + ylabel='requests/sec', means=mean_requests) + plot(kind='xfer_per_sec', title='Transfer/sec Comparison', + ylabel='transfer/sec [MB]', means=mean_transfers) diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh new file mode 100755 index 0000000..7a533ba --- /dev/null +++ b/wrk/measure_all.sh @@ -0,0 +1,9 @@ +#! /usr/bin/env bash +SUBJECTS="zig go python sanic rust rust2 axum csharp cpp" + +for S in $SUBJECTS; do + L="$S.perflog" + for R in 1 2 3 ; do + ./wrk/measure.sh $S | tee -a $L + done +done From 9fe223cdb982a1b6879a1d53f5795831642895ba Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 15:45:00 +0200 Subject: [PATCH 06/11] improve measure_all.sh and graph.py --- wrk/graph.py | 12 ++++++++++-- wrk/measure_all.sh | 11 ++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/wrk/graph.py b/wrk/graph.py index 617a590..b446d98 100644 --- a/wrk/graph.py +++ b/wrk/graph.py @@ -5,7 +5,7 @@ from matplotlib.ticker import FuncFormatter from collections import defaultdict import statistics -directory = "./" # Replace with the actual directory path +directory = "./wrk" # Replace with the actual directory path requests_sec = defaultdict(list) transfers_sec = defaultdict(list) @@ -41,10 +41,18 @@ def plot(kind='', title='', ylabel='', means=None): plt.text(bar.get_x() + bar.get_width() / 2, yval, f'{yval:,.2f}', ha='center', va='bottom') plt.tight_layout() # Adjust the spacing of the graph elements - plt.savefig(f"{kind.lower()}_graph.png") # Save the graph as a PNG file + png_name = f"{directory}/{kind.lower()}_graph.png" + plt.savefig(png_name) # Save the graph as a PNG file + print(f"Generated: {png_name}") if __name__ == '__main__': + if not os.path.isdir(".git"): + print("Please run from root directory of the repository!") + print("e.g. python wrk/graph.py") + import sys + sys.exit(1) + # Iterate over the files in the directory for filename in os.listdir(directory): if filename.endswith(".perflog"): diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh index 7a533ba..0a67338 100755 --- a/wrk/measure_all.sh +++ b/wrk/measure_all.sh @@ -1,9 +1,18 @@ #! /usr/bin/env bash + +if [ ! -d ".git" ] ; then + echo "This script must be run from the root directory of the repository!" + echo "./wrk/measure_all.sh" + exit 1 +fi + SUBJECTS="zig go python sanic rust rust2 axum csharp cpp" for S in $SUBJECTS; do L="$S.perflog" for R in 1 2 3 ; do - ./wrk/measure.sh $S | tee -a $L + ./wrk/measure.sh $S | tee -a wrk/$L done done + +echo "Finished" From ee20bce22dc23008591e6e1154ad15504f90fe20 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 15:59:36 +0200 Subject: [PATCH 07/11] renamed the rust versions in perftests --- wrk/measure.sh | 4 ++-- wrk/measure_all.sh | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/wrk/measure.sh b/wrk/measure.sh index aa674c5..238fa00 100755 --- a/wrk/measure.sh +++ b/wrk/measure.sh @@ -47,14 +47,14 @@ if [ "$SUBJECT" = "sanic" ] ; then URL=http://127.0.0.1:8000 fi -if [ "$SUBJECT" = "rust" ] ; then +if [ "$SUBJECT" = "rust-bythebook" ] ; then cd wrk/rust/bythebook && cargo build --release $TSK_SRV ./target/release/hello & PID=$! URL=http://127.0.0.1:7878 fi -if [ "$SUBJECT" = "rust2" ] ; then +if [ "$SUBJECT" = "rust-clean" ] ; then cd wrk/rust/clean && cargo build --release $TSK_SRV ./target/release/hello & PID=$! diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh index 0a67338..c8350a1 100755 --- a/wrk/measure_all.sh +++ b/wrk/measure_all.sh @@ -6,7 +6,9 @@ if [ ! -d ".git" ] ; then exit 1 fi -SUBJECTS="zig go python sanic rust rust2 axum csharp cpp" +SUBJECTS="zig go python sanic rust-bythebook rust-clean axum csharp cpp" + +rm -f wrk/*.perflog for S in $SUBJECTS; do L="$S.perflog" From 49b2762ecbe29bbccbe4ef1f40ff36a7810b636d Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 16:32:43 +0200 Subject: [PATCH 08/11] renamed wrk test cpp -> cpp-beast --- wrk/measure.sh | 2 +- wrk/measure_all.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wrk/measure.sh b/wrk/measure.sh index 238fa00..23cae4d 100755 --- a/wrk/measure.sh +++ b/wrk/measure.sh @@ -75,7 +75,7 @@ if [ "$SUBJECT" = "csharp" ] ; then URL=http://127.0.0.1:5026 fi -if [ "$SUBJECT" = "cpp" ] ; then +if [ "$SUBJECT" = "cpp-beast" ] ; then cd wrk/cpp && zig build -Doptimize=ReleaseFast $TSK_SRV ./zig-out/bin/cpp-beast 127.0.0.1 8070 . & PID=$! diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh index c8350a1..258bd60 100755 --- a/wrk/measure_all.sh +++ b/wrk/measure_all.sh @@ -6,7 +6,7 @@ if [ ! -d ".git" ] ; then exit 1 fi -SUBJECTS="zig go python sanic rust-bythebook rust-clean axum csharp cpp" +SUBJECTS="zig go python sanic rust-bythebook rust-clean axum csharp cpp-beast" rm -f wrk/*.perflog From f10b76f2295089d85e734fe03c18100980fff34b Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 16:45:00 +0200 Subject: [PATCH 09/11] renamed bench targets to make langs more clear --- wrk/measure.sh | 6 +++--- wrk/measure_all.sh | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/wrk/measure.sh b/wrk/measure.sh index 23cae4d..b1c1694 100755 --- a/wrk/measure.sh +++ b/wrk/measure.sh @@ -14,7 +14,7 @@ if [ "$SUBJECT" = "" ] ; then exit 1 fi -if [ "$SUBJECT" = "zig" ] ; then +if [ "$SUBJECT" = "zig-zap" ] ; then zig build -Doptimize=ReleaseFast wrk > /dev/null $TSK_SRV ./zig-out/bin/wrk & PID=$! @@ -41,7 +41,7 @@ if [ "$SUBJECT" = "python" ] ; then URL=http://127.0.0.1:8080 fi -if [ "$SUBJECT" = "sanic" ] ; then +if [ "$SUBJECT" = "python-sanic" ] ; then $TSK_SRV python wrk/sanic/sanic-app.py & PID=$! URL=http://127.0.0.1:8000 @@ -61,7 +61,7 @@ if [ "$SUBJECT" = "rust-clean" ] ; then URL=http://127.0.0.1:7878 fi -if [ "$SUBJECT" = "axum" ] ; then +if [ "$SUBJECT" = "rust-axum" ] ; then cd wrk/axum/hello-axum && cargo build --release $TSK_SRV ./target/release/hello-axum & PID=$! diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh index 258bd60..b85c296 100755 --- a/wrk/measure_all.sh +++ b/wrk/measure_all.sh @@ -6,13 +6,14 @@ if [ ! -d ".git" ] ; then exit 1 fi -SUBJECTS="zig go python sanic rust-bythebook rust-clean axum csharp cpp-beast" +SUBJECTS="zig-zap go python python-sanic rust-bythebook rust-clean rust-axum csharp cpp-beast" rm -f wrk/*.perflog for S in $SUBJECTS; do L="$S.perflog" - for R in 1 2 3 ; do + # for R in 1 2 3 ; do + for R in 1 ; do ./wrk/measure.sh $S | tee -a wrk/$L done done From 7fff5a8c5df8abc1c7a84df314647f4fe49d2808 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 16:45:27 +0200 Subject: [PATCH 10/11] reverted hack --- wrk/measure_all.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrk/measure_all.sh b/wrk/measure_all.sh index b85c296..3e0d4be 100755 --- a/wrk/measure_all.sh +++ b/wrk/measure_all.sh @@ -12,8 +12,7 @@ rm -f wrk/*.perflog for S in $SUBJECTS; do L="$S.perflog" - # for R in 1 2 3 ; do - for R in 1 ; do + for R in 1 2 3 ; do ./wrk/measure.sh $S | tee -a wrk/$L done done From 6562d9ed3e4237b0cf3030c60f6d0e64a9e34144 Mon Sep 17 00:00:00 2001 From: Rene Schallner Date: Tue, 22 Aug 2023 17:55:35 +0200 Subject: [PATCH 11/11] re-wrote blazingly-fast.md --- blazingly-fast.md | 690 +++++------------- wrk/samples/laptop_req_per_sec_graph.png | Bin 0 -> 51068 bytes wrk/samples/laptop_xfer_per_sec_graph.png | Bin 0 -> 38914 bytes wrk/samples/workstation_req_per_sec_graph.png | Bin 0 -> 49067 bytes .../workstation_xfer_per_sec_graph.png | Bin 0 -> 38878 bytes 5 files changed, 196 insertions(+), 494 deletions(-) create mode 100644 wrk/samples/laptop_req_per_sec_graph.png create mode 100644 wrk/samples/laptop_xfer_per_sec_graph.png create mode 100644 wrk/samples/workstation_req_per_sec_graph.png create mode 100644 wrk/samples/workstation_xfer_per_sec_graph.png diff --git a/blazingly-fast.md b/blazingly-fast.md index 5929728..9caa04b 100644 --- a/blazingly-fast.md +++ b/blazingly-fast.md @@ -1,543 +1,245 @@ # ⚑blazingly fast⚑ -I conducted a series of quick tests, using wrk with simple HTTP servers written -in GO and in zig zap. I made sure that all servers only output 17 bytes of HTTP -body. +Initially, I conducted a series of quick tests, using wrk with simple HTTP +servers written in GO and in zig zap. I made sure that all servers only output +17 bytes of HTTP body. Just to get some sort of indication, I also included measurements for python since I used to write my REST APIs in python before creating zig zap. You can check out the scripts I used for the tests in [./wrk](wrk/). -## results +## Why -You can see the verbatim output of `wrk`, and some infos about the test machine -below the code snippets. +I aimed to enhance the performance of my Python + Flask backends by replacing +them with a Zig version. To evaluate the success of this transition, I compared +the performance of a static HTTP server implemented in Python and its Zig +counterpart, which showed significant improvements. -**Update**: I was intrigued comparing to a basic rust HTTP server. -Unfortunately, knowing nothing at all about rust, I couldn't find one and hence -tried to go for the one in [The Rust Programming -Language](https://doc.rust-lang.org/book/ch20-00-final-project-a-web-server.html). -Wanting it to be of a somewhat fair comparison, I opted for the multi-threaded -example. It didn't work out-of-the-box, but I got it to work and changed it to -not read files but outputting a static text just like in the other examples. -**maybe someone with rust experience** can have a look at my -[wrk/rust/hello](wrk/rust/hello) code and tell me why it's surprisingly slow, as -I expected it to be faster than the basic GO example. I'll enable the -GitHub discussions for this matter. My suspicion is bad performance of the -mutexes. +To further assess the Zig server's performance, I compared it with a Go +implementation, to compare against a widely used industry-standard. I expected +similar performance levels but was pleasantly surprised when Zap outperformed Go +by approximately 30% on my test machine. -![](wrk_tables.png) +Intrigued by Rust's reputed performance capabilities, I also experimented with a +Rust version. The results of this experiment are discussed in the +[Flaws](#flaws) section below. -### requests / sec +## What -![](wrk_requests.png) +So, what are the benchmarks testing? -### transfer MB / sec +- simple http servers that reply to GET requests with a constant, 17-bytes long response +- 4 cores are assigned to the subject under test (the respective server) +- 4 cores are assigned to `wrk` + - using 4 threads + - aiming at 400 concurrent connections -![](wrk_transfer.png) +## How +I have fully automated the benchmarks and graph generation. -## zig code +To generate the data: -zig version .11.0-dev.1265+3ab43988c - -```zig -const std = @import("std"); -const zap = @import("zap"); - -fn on_request_minimal(r: zap.SimpleRequest) void { - _ = r.sendBody("Hello from ZAP!!!"); -} - -pub fn main() !void { - var listener = zap.SimpleHttpListener.init(.{ - .port = 3000, - .on_request = on_request_minimal, - .log = false, - .max_clients = 100000, - }); - try listener.listen(); - - std.debug.print("Listening on 0.0.0.0:3000\n", .{}); - - // start worker threads - zap.start(.{ - .threads = 4, - .workers = 4, - }); -} +```console +$ ./wrk/measure_all.sh ``` -## go code +To generate the graphs: -go version go1.16.9 linux/amd64 - -```go -package main - -import ( - "fmt" - "net/http" -) - -func hello(w http.ResponseWriter, req *http.Request) { - fmt.Fprintf(w, "hello from GO!!!\n") -} - -func main() { - print("listening on 0.0.0.0:8090\n") - http.HandleFunc("/hello", hello) - http.ListenAndServe(":8090", nil) -} +```console +$ python wrk/graph.py ``` -## python code +For dependencies, please see the [flake.nix](./flake.nix#L46). -python version 3.9.6 +## Flaws -```python -# Python 3 server example -from http.server import BaseHTTPRequestHandler, HTTPServer +The benchmarks have limitations, such as the lack of request latencies. The Rust +community has often criticized these benchmarks as biased. However, no such +criticisms have come from the Go or Python communities. -hostName = "127.0.0.1" -serverPort = 8080 +In response to the Rust community's concerns, we've added three Rust +implementations for comparison: + +- A standard version from [the Rust book](https://doc.rust-lang.org/book/ch20-00-final-project-a-web-server.html). +- An "axum" version to highlight Rust's speed. +- A refined version of the Rust book version. + +Originally, the goal was to compare "batteries included" versions, which created +a disparity by comparing the optimized zap / facil.io code with basic bundled +functionalities. These tests were for personal interest and not meant to be +definitive benchmarks. + +To address this bias, we've added the Rust-axum and Python-sanic benchmarks. For +more information, refer to the relevant discussions and pull requests. -class MyServer(BaseHTTPRequestHandler): - def do_GET(self): - self.send_response(200) - self.send_header("Content-type", "text/html") - self.end_headers() - self.wfile.write(bytes("HI FROM PYTHON!!!", "utf-8")) +## More benchmarks? - def log_message(self, format, *args): - return +I often receive requests or PRs to include additional benchmarks, which a lot of +times I find to be either ego-driven or a cause for unnecessary disputes. People +tend to favor their preferred language or framework. Zig, Rust, C, and C++ are +all capable of efficiently creating fast web servers, with different frameworks +potentially excelling in certain benchmarks. My main concern was whether Zap, +given its current level of abstraction, could compete with standard web servers. +This question has been answered, and I see no need for further benchmarks. -if __name__ == "__main__": - webServer = HTTPServer((hostName, serverPort), MyServer) - print("Server started http://%s:%s" % (hostName, serverPort)) +## The computer makes the difference - try: - webServer.serve_forever() - except KeyboardInterrupt: - pass - - webServer.server_close() - print("Server stopped.") -``` - -## rust code - -[main.rs](wrk/rust/hello/src/main.rs) - -```rust -use hello::ThreadPool; -use std::io::prelude::*; -use std::net::TcpListener; -use std::net::TcpStream; - -fn main() { - let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); - let pool = ThreadPool::new(4); - - // for stream in listener.incoming().take(2) { - for stream in listener.incoming() { - let stream = stream.unwrap(); - - pool.execute(|| { - handle_connection(stream); - }); - } - - println!("Shutting down."); -} - -fn handle_connection(mut stream: TcpStream) { - let mut buffer = [0; 1024]; - stream.read(&mut buffer).unwrap(); +After automating the performance benchmarks, I gathered data from three +different computers. It's interesting to see the variation in relative numbers. - let status_line = "HTTP/1.1 200 OK"; +### The test machine (graphs in the README) - let contents = "HELLO from RUST!"; +To be added when I get home. - let response = format!( - "{}\r\nContent-Length: {}\r\n\r\n{}", - status_line, - contents.len(), - contents - ); +### Workstation at work - stream.write_all(response.as_bytes()).unwrap(); - stream.flush().unwrap(); -} -``` +A beast. Many cores (which we don't use). -[lib.rs](wrk/rust/hello/src/lib.rs) +![](./wrk/samples/workstation_req_per_sec_graph.png) -```rust -use std::{ - sync::{mpsc, Arc, Mutex}, - thread, -}; - -pub struct ThreadPool { - workers: Vec, - sender: Option>, -} - -type Job = Box; - -impl ThreadPool { - /// Create a new ThreadPool. - /// - /// The size is the number of threads in the pool. - /// - /// # Panics - /// - /// The `new` function will panic if the size is zero. - pub fn new(size: usize) -> ThreadPool { - assert!(size > 0); - - let (sender, receiver) = mpsc::channel(); - - let receiver = Arc::new(Mutex::new(receiver)); - - let mut workers = Vec::with_capacity(size); - - for id in 0..size { - workers.push(Worker::new(id, Arc::clone(&receiver))); - } - - ThreadPool { - workers, - sender: Some(sender), - } - } - - pub fn execute(&self, f: F) - where - F: FnOnce() + Send + 'static, - { - let job = Box::new(f); - - self.sender.as_ref().unwrap().send(job).unwrap(); - } -} - -impl Drop for ThreadPool { - fn drop(&mut self) { - drop(self.sender.take()); - - for worker in &mut self.workers { - println!("Shutting down worker {}", worker.id); - - if let Some(thread) = worker.thread.take() { - thread.join().unwrap(); - } - } - } -} - -struct Worker { - id: usize, - thread: Option>, -} - -impl Worker { - fn new(id: usize, receiver: Arc>>) -> Worker { - let thread = thread::spawn(move || loop { - let message = receiver.lock().unwrap().recv(); - - match message { - Ok(job) => { - // println!("Worker got a job; executing."); - - job(); - } - Err(_) => { - // println!("Worker disconnected; shutting down."); - break; - } - } - }); - - Worker { - id, - thread: Some(thread), - } - } -} -``` - -## wrk output - -wrk version: `wrk 4.1.0 [epoll] Copyright (C) 2012 Will Glozer` +![](./wrk/samples/workstation_xfer_per_sec_graph.png) ``` -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh zig -Listening on 0.0.0.0:3000 -======================================================================== - zig -======================================================================== -Running 10s test @ http://127.0.0.1:3000 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 331.40us 115.09us 8.56ms 91.94% - Req/Sec 159.51k 9.44k 175.23k 56.50% - Latency Distribution - 50% 312.00us - 75% 341.00us - 90% 375.00us - 99% 681.00us - 6348945 requests in 10.01s, 0.94GB read -Requests/sec: 634220.13 -Transfer/sec: 96.17MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh zig -Listening on 0.0.0.0:3000 -======================================================================== - zig -======================================================================== -Running 10s test @ http://127.0.0.1:3000 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 322.43us 103.25us 3.72ms 86.57% - Req/Sec 166.35k 2.89k 182.78k 68.00% - Latency Distribution - 50% 297.00us - 75% 330.00us - 90% 482.00us - 99% 657.00us - 6619245 requests in 10.02s, 0.98GB read -Requests/sec: 660803.71 -Transfer/sec: 100.20MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh zig -Listening on 0.0.0.0:3000 -======================================================================== - zig -======================================================================== -Running 10s test @ http://127.0.0.1:3000 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 325.47us 105.86us 4.03ms 87.27% - Req/Sec 164.60k 4.69k 181.85k 84.75% - Latency Distribution - 50% 300.00us - 75% 333.00us - 90% 430.00us - 99% 667.00us - 6549594 requests in 10.01s, 0.97GB read -Requests/sec: 654052.56 -Transfer/sec: 99.18MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh go -listening on 0.0.0.0:8090 -======================================================================== - go -======================================================================== -Running 10s test @ http://127.0.0.1:8090/hello - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 680.63us 692.05us 12.09ms 88.04% - Req/Sec 126.49k 4.28k 139.26k 71.75% - Latency Distribution - 50% 403.00us - 75% 822.00us - 90% 1.52ms - 99% 3.34ms - 5033360 requests in 10.01s, 643.22MB read -Requests/sec: 502584.84 -Transfer/sec: 64.23MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh go -listening on 0.0.0.0:8090 -======================================================================== - go -======================================================================== -Running 10s test @ http://127.0.0.1:8090/hello - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 683.97us 695.78us 10.01ms 88.04% - Req/Sec 126.31k 4.34k 137.63k 65.00% - Latency Distribution - 50% 408.00us - 75% 829.00us - 90% 1.53ms - 99% 3.34ms - 5026848 requests in 10.01s, 642.39MB read -Requests/sec: 502149.91 -Transfer/sec: 64.17MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh go -listening on 0.0.0.0:8090 -======================================================================== - go -======================================================================== -Running 10s test @ http://127.0.0.1:8090/hello - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 688.89us 702.75us 12.70ms 88.09% - Req/Sec 126.06k 4.20k 138.00k 70.25% - Latency Distribution - 50% 414.00us - 75% 836.00us - 90% 1.54ms - 99% 3.36ms - 5015716 requests in 10.01s, 640.97MB read -Requests/sec: 500968.28 -Transfer/sec: 64.02MB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh python -Server started http://127.0.0.1:8080 -======================================================================== - python -======================================================================== -Running 10s test @ http://127.0.0.1:8080 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 12.89ms 101.69ms 1.79s 97.76% - Req/Sec 1.83k 2.11k 7.53k 82.18% - Latency Distribution - 50% 215.00us - 75% 260.00us - 90% 363.00us - 99% 485.31ms - 34149 requests in 10.02s, 4.33MB read - Socket errors: connect 0, read 34149, write 0, timeout 15 -Requests/sec: 3407.63 -Transfer/sec: 442.60KB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh python -Server started http://127.0.0.1:8080 -======================================================================== - python -======================================================================== -Running 10s test @ http://127.0.0.1:8080 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 9.87ms 90.32ms 1.79s 98.21% - Req/Sec 2.16k 2.17k 7.49k 80.10% - Latency Distribution - 50% 234.00us - 75% 353.00us - 90% 378.00us - 99% 363.73ms - 43897 requests in 10.02s, 5.57MB read - Socket errors: connect 0, read 43897, write 0, timeout 14 -Requests/sec: 4379.74 -Transfer/sec: 568.85KB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh python -Server started http://127.0.0.1:8080 -======================================================================== - python -======================================================================== -Running 10s test @ http://127.0.0.1:8080 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 3.98ms 51.85ms 1.66s 99.16% - Req/Sec 2.69k 2.58k 7.61k 51.14% - Latency Distribution - 50% 234.00us - 75% 357.00us - 90% 381.00us - 99% 568.00us - 50165 requests in 10.02s, 6.36MB read - Socket errors: connect 0, read 50165, write 0, timeout 9 -Requests/sec: 5004.06 -Transfer/sec: 649.95KB -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ +[rene@nixos:~]$ neofetch --stdout +rene@nixos +---------- +OS: NixOS 23.05.2947.475d5ae2c4cb (Stoat) x86_64 +Host: LENOVO 1038 +Kernel: 6.1.46 +Uptime: 26 mins +Packages: 5804 (nix-system), 566 (nix-user) +Shell: bash 5.2.15 +Terminal: /dev/pts/2 +CPU: Intel Xeon Gold 5218 (64) @ 3.900GHz +GPU: NVIDIA Quadro P620 +GPU: NVIDIA Tesla M40 +Memory: 1610MiB / 95247MiB - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh rust - Finished release [optimized] target(s) in 0.00s -======================================================================== - rust -======================================================================== -Running 10s test @ http://127.0.0.1:7878 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 1.20ms 1.38ms 208.35ms 99.75% - Req/Sec 34.06k 2.00k 38.86k 75.25% - Latency Distribution - 50% 1.32ms - 75% 1.63ms - 90% 1.87ms - 99% 2.32ms - 1356449 requests in 10.01s, 71.15MB read - Socket errors: connect 0, read 1356427, write 0, timeout 0 -Requests/sec: 135446.00 -Transfer/sec: 7.10MB - - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh rust - Finished release [optimized] target(s) in 0.00s -======================================================================== - rust -======================================================================== -Running 10s test @ http://127.0.0.1:7878 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 1.21ms 592.89us 10.02ms 63.64% - Req/Sec 32.93k 2.91k 37.94k 80.50% - Latency Distribution - 50% 1.31ms - 75% 1.64ms - 90% 1.90ms - 99% 2.48ms - 1311445 requests in 10.02s, 68.79MB read - Socket errors: connect 0, read 1311400, write 0, timeout 0 -Requests/sec: 130904.50 -Transfer/sec: 6.87MB - - -(base) rs@ryzen:~/code/github.com/renerocksai/zap$ ./wrk/measure.sh rust - Finished release [optimized] target(s) in 0.00s -======================================================================== - rust -======================================================================== -Running 10s test @ http://127.0.0.1:7878 - 4 threads and 400 connections - Thread Stats Avg Stdev Max +/- Stdev - Latency 1.26ms 2.88ms 211.74ms 99.92% - Req/Sec 33.92k 2.04k 38.99k 74.00% - Latency Distribution - 50% 1.34ms - 75% 1.66ms - 90% 1.91ms - 99% 2.38ms - 1350527 requests in 10.02s, 70.84MB read - Socket errors: connect 0, read 1350474, write 0, timeout 0 -Requests/sec: 134830.39 -Transfer/sec: 7.07MB - +[rene@nixos:~]$ lscpu +Architecture: x86_64 + CPU op-mode(s): 32-bit, 64-bit + Address sizes: 46 bits physical, 48 bits virtual + Byte Order: Little Endian +CPU(s): 64 + On-line CPU(s) list: 0-63 +Vendor ID: GenuineIntel + Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz + CPU family: 6 + Model: 85 + Thread(s) per core: 2 + Core(s) per socket: 16 + Socket(s): 2 + Stepping: 7 + CPU(s) scaling MHz: 57% + CPU max MHz: 3900,0000 + CPU min MHz: 1000,0000 + BogoMIPS: 4600,00 + Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs b + ts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_ + deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpri + ority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xs + avec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke avx512_vnni md_clear flush_l1d arch_capabi + lities +Virtualization features: + Virtualization: VT-x +Caches (sum of all): + L1d: 1 MiB (32 instances) + L1i: 1 MiB (32 instances) + L2: 32 MiB (32 instances) + L3: 44 MiB (2 instances) +NUMA: + NUMA node(s): 2 + NUMA node0 CPU(s): 0-15,32-47 + NUMA node1 CPU(s): 16-31,48-63 +Vulnerabilities: + Gather data sampling: Mitigation; Microcode + Itlb multihit: KVM: Mitigation: VMX disabled + L1tf: Not affected + Mds: Not affected + Meltdown: Not affected + Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable + Retbleed: Mitigation; Enhanced IBRS + Spec rstack overflow: Not affected + Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl + Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization + Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence + Srbds: Not affected + Tsx async abort: Mitigation; TSX disabled ``` -## test machine + +### Work Laptop + +Very strange. It absolutely **LOVES** zap 🀣! + +![](./wrk/samples/laptop_req_per_sec_graph.png) + +![](./wrk/samples/laptop_xfer_per_sec_graph.png) ``` - β–—β–„β–„β–„ β–—β–„β–„β–„β–„ β–„β–„β–„β–– rs@ryzen - β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™ β–Ÿβ–ˆβ–ˆβ–ˆβ–› -------- - β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™β–Ÿβ–ˆβ–ˆβ–ˆβ–› OS: NixOS 22.05 (Quokka) x86_64 - β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› Host: Micro-Star International Co., Ltd. B550-A PRO (MS-7C56) - β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–› β–Ÿβ–™ Kernel: 6.0.15 - β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™ β–Ÿβ–ˆβ–ˆβ–™ Uptime: 7 days, 5 hours, 29 mins - β–„β–„β–„β–„β–– β–œβ–ˆβ–ˆβ–ˆβ–™ β–Ÿβ–ˆβ–ˆβ–ˆβ–› Packages: 5950 (nix-system), 893 (nix-user), 5 (flatpak) - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–œβ–ˆβ–ˆβ–› β–Ÿβ–ˆβ–ˆβ–ˆβ–› Shell: bash 5.1.16 - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–œβ–› β–Ÿβ–ˆβ–ˆβ–ˆβ–› Resolution: 3840x2160 -β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–™ DE: none+i3 -β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› WM: i3 - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–Ÿβ–™ β–Ÿβ–ˆβ–ˆβ–ˆβ–› Terminal: Neovim Terminal - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–Ÿβ–ˆβ–ˆβ–™ β–Ÿβ–ˆβ–ˆβ–ˆβ–› CPU: AMD Ryzen 5 5600X (12) @ 3.700GHz - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–œβ–ˆβ–ˆβ–ˆβ–™ ▝▀▀▀▀ GPU: AMD ATI Radeon RX 6700/6700 XT / 6800M - β–œβ–ˆβ–ˆβ–› β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› Memory: 10378MiB / 32033MiB - β–œβ–› β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–› - β–Ÿβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™ - β–Ÿβ–ˆβ–ˆβ–ˆβ–›β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™ - β–Ÿβ–ˆβ–ˆβ–ˆβ–› β–œβ–ˆβ–ˆβ–ˆβ–™ β–œβ–ˆβ–ˆβ–ˆβ–™ - ▝▀▀▀ β–€β–€β–€β–€β–˜ β–€β–€β–€β–˜ +➜ neofetch --stdout +rs@nixos +-------- +OS: NixOS 23.05.2918.4cdad15f34e6 (Stoat) x86_64 +Host: LENOVO 20TKS0W700 +Kernel: 6.1.45 +Uptime: 1 day, 4 hours, 50 mins +Packages: 6259 (nix-system), 267 (nix-user), 9 (flatpak) +Shell: bash 5.2.15 +Resolution: 3840x1600, 3840x2160 +DE: none+i3 +WM: i3 +Terminal: tmux +CPU: Intel i9-10885H (16) @ 5.300GHz +GPU: NVIDIA GeForce GTX 1650 Ti Mobile +Memory: 4525MiB / 31805MiB + + +➜ lscpu +Architecture: x86_64 +CPU op-mode(s): 32-bit, 64-bit +Address sizes: 39 bits physical, 48 bits virtual +Byte Order: Little Endian +CPU(s): 16 +On-line CPU(s) list: 0-15 +Vendor ID: GenuineIntel +Model name: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz +CPU family: 6 +Model: 165 +Thread(s) per core: 2 +Core(s) per socket: 8 +Socket(s): 1 +Stepping: 2 +CPU(s) scaling MHz: 56% +CPU max MHz: 5300.0000 +CPU min MHz: 800.0000 +BogoMIPS: 4800.00 +Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp pku ospke sgx_lc md_clear flush_l1d arch_capabilities +Virtualization: VT-x +L1d cache: 256 KiB (8 instances) +L1i cache: 256 KiB (8 instances) +L2 cache: 2 MiB (8 instances) +L3 cache: 16 MiB (1 instance) +NUMA node(s): 1 +NUMA node0 CPU(s): 0-15 +Vulnerability Gather data sampling: Mitigation; Microcode +Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled +Vulnerability L1tf: Not affected +Vulnerability Mds: Not affected +Vulnerability Meltdown: Not affected +Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable +Vulnerability Retbleed: Mitigation; Enhanced IBRS +Vulnerability Spec rstack overflow: Not affected +Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl +Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization +Vulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence +Vulnerability Srbds: Mitigation; Microcode +Vulnerability Tsx async abort: Not affected ``` diff --git a/wrk/samples/laptop_req_per_sec_graph.png b/wrk/samples/laptop_req_per_sec_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..84595178815bcaa1a635b6cd663a3a8b2006ae2a GIT binary patch literal 51068 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 literal 0 HcmV?d00001 diff --git a/wrk/samples/laptop_xfer_per_sec_graph.png b/wrk/samples/laptop_xfer_per_sec_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b2ea6511df96edb11fb108624adb7e455154c7 GIT binary patch literal 38914 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 literal 0 HcmV?d00001 diff --git a/wrk/samples/workstation_xfer_per_sec_graph.png b/wrk/samples/workstation_xfer_per_sec_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..91e55cc6386cbbc731638eb2a4d58a3e1e3b0f96 GIT binary patch literal 38878 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

yeRrxOETKt^9n61dpEUGC`dvL`6-R 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