Skip to content

Benchmarking zot with zb

👉 The zb tool is useful for benchmarking OCI registry workloads in scenarios such as the following:

  • comparing configuration changes
  • comparing software versions
  • comparing hardware/deployment environments
  • comparing with other registries

With the zb tool, you can benchmark a zot registry or any other container image registry that conforms to the OCI Distribution Specification published by the Open Container Initiative (OCI).

💡 We recommend installing and benchmarking with zb when you install zot.

How to get zb

The zb project is hosted with zot on GitHub at project-zot. From GitHub, you can download the zb binary or you can build zb from the source. You can also directly run the released docker image.

Supported platforms and architectures

zb is supported for the following operating systems and platform architectures:

OS ARCH Platform
linux amd64 Intel-based Linux servers
linux arm64 ARM-based servers and Raspberry Pi4
darwin amd64 Intel-based MacOS
darwin arm64 ARM-based MacOS

Downloading zb binaries

Download the executable binary for your server platform and architecture under "Assets" on the GitHub zot releases page.

The binary image is named using the target platform and architecture from the Supported platforms and architectures table. For example, the binary for an Intel-based MacOS server is zb-darwin-amd64.

Building zb from source

To build the zb binary, copy or clone the zot project from GitHub and execute the make bench command in the zot directory. Use the same command options that you used to build zot, as shown:

make OS=os ARCH=architecture bench

For example, the following command builds zb for an Intel-based MacOS server:

make OS=darwin ARCH=amd64 bench

In this example, the resulting executable file is zb-darwin-amd64 in the zot/bin directory.

💡 A sample Dockerfile for zb is available at Dockerfile-zb.

Running zb

The original filename of the executable file will reflect the build options, such as zb-linux-amd64. For convenience, you can rename the executable to simply zb.

💡 The instructions and examples in this guide use zb as the name of the executable file.


To view the usage and options of zb, run the command with the --help option:

bin/zb --help

Command output:

      zb <url> [flags]

      -A, --auth-creds string      Use colon-separated BASIC auth creds
      -c, --concurrency int        Number of multiple requests to make at a time (default 1)
      -h, --help                   help for zb
      -o, --output-format string   Output format of test results: stdout (default), json, ci-cd
      -r, --repo string            Use specified repo on remote registry for test data
      -n, --requests int           Number of requests to perform (default 1)
      -s, --src-cidr string        Use specified cidr to obtain ips to make requests from, src-ips and src-cidr are mutually exclusive
      -i, --src-ips string         Use colon-separated ips to make requests from, src-ips and src-cidr are mutually exclusive
      -v, --version                Show the version and exit
      -d, --working-dir string     Use specified directory to store test data


The following example executes a benchmark operation using zb.

bin/zb -c 10 -s -n 1000 http://localhost:8080

You can also run the released docker image.

docker run --net=host -it -c 10 -n 1000 -s http://localhost:8080

Command output:

    Registry URL: http://localhost:8080

    Concurrency Level: 2
    Total requests:    100
    Working dir:

    Test name:            Get Catalog
    Time taken for tests: 45.397205ms
    Complete requests:    100
    Failed requests:      0
    Requests per second:  2202.7788

    2xx responses: 100

    min: 402.259µs
    max: 3.295887ms
    p50: 855.045µs
    p75: 971.709µs
    p90: 1.127389ms
    p99: 3.295887ms

    Test name:            Push Monolith 1MB
    Time taken for tests: 952.336383ms
    Complete requests:    100
    Failed requests:      0
    Requests per second:  105.00491

    2xx responses: 100

    min: 11.125673ms
    max: 26.375356ms
    p50: 18.917253ms
    p75: 21.753441ms
    p90: 24.02137ms
    p99: 26.375356ms


Last update: December 21, 2022