SBK

Storage Benchmark Kit

SBM: Storage Benchmark Monitor

SBM is SBK’s distributed measurement aggregator. SBK clients using GrpcLogger send SBP/gRPC latency records to SBM, which merges them into cluster-wide periodic and total statistics.

SBP 4.0 uses one ordered client-streaming RPC per SBK process and packed primitive latency/count fields. GrpcLogger accumulates exact frequencies in a primitive map, submits immutable batches through a bounded sender queue, obeys gRPC flow control, and waits for the final stream acknowledgment during shutdown. SBP 4.0 intentionally removes the earlier unary latency RPC and protobuf map field, so SBK and SBM must use the same SBP major version. SBM explicitly configures and advertises its inbound record limit (maxRecordSizeMB, 16 MiB by default); SBK sends no more than the smaller client/server limit.

SBM does not execute storage operations and does not launch remote processes. Use SBK for load generation and SBK-GEM for SSH orchestration.

Data flow

flowchart LR
    A[SBK client A / GrpcLogger] --> G[SBM gRPC service]
    B[SBK client B / GrpcLogger] --> G
    G --> Q[Concurrent ingestion queues]
    Q --> R[Aggregate recorder]
    R --> O[Prometheus, Local Web Console, or result output]

The default gRPC port is 9717. Container configuration also exposes the configured metrics port. Keep the gRPC service on a trusted benchmark network unless an external security layer is provided.

Build

./gradlew :sbm:check
./gradlew :sbm:installDist

The launcher is generated under sbm/build/install/sbm/bin/sbm.

Run

Display authoritative options:

./sbm/build/install/sbm/bin/sbm -help

Start with defaults:

./sbm/build/install/sbm/bin/sbm

Start the dependency-free SBK Local Web Console instead of Prometheus:

./sbm/build/install/sbm/bin/sbm -out SbmWebLogger -class file -action r

The Local Web Console uses plain HTTP and listens on all interfaces at port 9720 by default. Open http://127.0.0.1:9720 locally or http://<sbm-host>:9720 remotely. It displays aggregate SBM connection, workload, throughput, request-pressure, timeout, and latency-percentile data. It permits one active WebLogger benchmark, keeps completed graphs while a browser remains connected, and exits after one minute with neither an active publisher nor browser activity. An existing idle web console is reused; an active SBK, SBM, or SBK-GEM web console owner causes SBM to exit with an ownership error. The web console does not start SSH or enable TLS; expose it only on a trusted benchmark network.

See the WebLogger guide for web console options, lifecycle, browser leases, security, and a complete distributed example.

Then point one or more installed SBK clients at it:

./build/install/sbk/bin/sbk \
  -class file -file /tmp/sbk.bin \
  -writers 1 -size 4096 -seconds 30 \
  -out GrpcLogger -sbm <sbm-host> -sbmport 9717

Use a hostname or address reachable from every SBK client. Firewalls, containers, and NAT must permit the callback path.

Internal ownership

Class Responsibility
io.sbm.main.SbmMain Executable entry point
io.sbm.api.impl.Sbm Logger discovery, arguments, and benchmark construction
SbmBenchmark gRPC server and aggregate-recorder lifecycle
SbmGrpcService SBP registration, ordered stream validation, and latency-record endpoints
SbmLatencyBenchmark Concurrent queue ingestion and window dispatch
SbmTotalWindowLatencyPeriodicRecorder Periodic and total aggregate windows
SbmPrometheusLogger Aggregated output and metrics
SbmWebLogger Aggregated output and local live web console publication

Protocol sources are under sbk-api/src/main/proto; generated Java/gRPC sources are build products.

Operational checks

Containers and dashboards

The module’s Jib configuration builds an sbm image and declares its service/metrics ports. Repository monitoring assets are under grafana/ and container guidance under dockers/.

Further reading