You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
sudo ./scripts/install-deps.sh # auto-detects package manager
mkdir build &&cd build && cmake .. && make -j$(nproc)
./servmark --validate # pre-flight system check
./servmark --dry-run # list all benchmarks
./servmark --category C1 # single category
./servmark --threads 8 # 8 parallel instances, SMT-aware pinning
./servmark # full default run (peak mode, tier 1)
CLI Options
--config <file> Config file (searches: $XDG_CONFIG_HOME, /etc, cwd)
--mode <peak|sustained> Run mode (default: peak)
--validate System readiness check only
--tier <1|2|3> Filter by tier (default: 1)
--category <C1..C15> Filter by category
--benchmark <name> Run a single benchmark by name
--threads <N> Parallel instances, SMT-aware (default: auto)
--cpu-pin <spec> CPU pinning: auto|auto-all|auto-numa|<list>
--numa-topo <spec> NUMA topology: N|@file|cpu_range:nid,...
--membind <policy> Memory policy: local|interleave|<node_id>
--mitigations-off Run with mitigations=off reference
--output-dir <dir> Output directory, auto-created (default: .)
--reference <file> Frozen reference for cross-machine scoring
--dry-run List benchmarks without running
--list-categories List category names and weights
--list-topology Show CPU/NUMA/cache topology
--min-iterations <N> Override per-benchmark min iterations
--max-iterations <N> Override per-benchmark max iterations
--convergence <F> Override convergence SEM/mean target
--max-runtime <sec> Override per-benchmark max runtime
--cooldown <sec> Override cooldown between benchmarks
--version Print version
--help Show usage
CPU / NUMA Binding
Manual control for large multi-socket servers:
# CPU instance pinning (which CPUs benchmarks run on)
./servmark --cpu-pin auto # SMT-aware physical cores (default)
./servmark --cpu-pin auto-all # all logical CPUs (include HT)
./servmark --cpu-pin auto-numa # one CPU per NUMA node
./servmark --cpu-pin "0,2,4,6"# explicit CPU list
./servmark --cpu-pin "0-7"# range
./servmark --cpu-pin "0-3,8-11"# mixed# NUMA topology override (which NUMA node each CPU belongs to)
./servmark --numa-topo 2 # auto-split interleaved across 2 nodes
./servmark --numa-topo @topo.cfg # load from file (# comments ok)
./servmark --numa-topo "18:0,19:0,20:1"# inline cpu_range:nid pairs# Memory allocation policy
./servmark --membind local# bind to CPU's local node (default)
./servmark --membind interleave # stripe across all nodes
./servmark --membind 0 # bind explicitly to node 0
Topology override rebuilds system_info.numa_nodes[] — all NUMA benchmarks see the user-specified layout. Memory policy uses set_mempolicy() before benchmark init() so all malloc/mmap obey the binding.
Requirements
Dependency
Ubuntu/Debian
CentOS/RHEL/Fedora
openSUSE
Arch
Alpine
Compiler
build-essential
gcc gcc-c++ make
gcc gcc-c++ make
gcc make
gcc g++ make
CMake (>=3.16)
cmake
cmake
cmake
cmake
cmake
pkg-config
pkg-config
pkgconfig
pkg-config
pkg-config
pkgconfig
hwloc
libhwloc-dev
hwloc-devel
hwloc-devel
hwloc
hwloc-dev
libnuma
libnuma-dev
numactl-devel
libnuma-devel
numactl
numactl-dev
OpenSSL
libssl-dev
openssl-devel
libopenssl-devel
openssl
openssl-dev
libzstd
libzstd-dev
libzstd-devel
libzstd-devel
zstd
zstd-dev
Per-package install: each dependency installed individually — a missing optional package (e.g. hwloc-devel) won't block the rest.
SSB_BENCHMARK_REGISTER emits a GCC __attribute__((constructor)) that auto-registers at load time. No central benchmark list — create a .c file, add to the module's CMakeLists.txt.
Execution Flow
main.c loads config, CLI overrides config values
harness_run() probes system, filters benchmarks by tier/category/name
Benchmark warmup: bench->warmup() (lightweight priming), then 2x full measure() (discarded)