Lotus comes with a benchmarking tool that can be used to test how long each resource-intensive mining operation takes. This guide describes how to install the benchmarking tool, and some basic operations.


  1. You must have the Lotus repository on your computer. If you do not have an existing copy of the repository, clone it from GitHub:

    git clone ~/lotus

    This will output something like:

    Cloning into '/root/lotus'...
    remote: Enumerating objects: 93, done.
    Resolving deltas: 100% (51531/51531), done.
  2. The lotus binary must be built and within the ~/lotus repository folder. If you just cloned the repository or have misplaced the lotus binary, build the project:

    cd ~/lotus
    make clean all && make install

    This will output something like:

    rm -rf  build/.filecoin-install build/.update-modules  lotus lotus-miner lotus-worker lotus-shed lotus-gateway lotus-seed lotus-pond lotus-townhall lotus-fountain lotus-chainwatch lotus-bench lotus-stats lotus-pcr lotus-health lotus-wallet testground
    make -C extern/filecoin-ffi/ clean
    install -C ./lotus /usr/local/bin/lotus
    install -C ./lotus-miner /usr/local/bin/lotus-miner
    install -C ./lotus-worker /usr/local/bin/lotus-worker
  3. Call make lotus-bench to build the Lotus benchmark binary:

    make lotus-bench

    This will output something like:

    rm -f lotus-bench
    go build -o lotus-bench ./cmd/lotus-bench
    go run append --exec lotus-bench -i ./build

    This will produce a lotus-bench binary in the current folder.

  4. You can now run lotus-bench against your system.


Use the self-documenting feature of the tool to explore the different commands.

    ./lotus-bench --help

This will output something like:

  lotus-bench - Benchmark performance of lotus on your hardware

  lotus-bench [global options] command [command options] [arguments...]


  prove    Benchmark a proof computation
  import   benchmark chain import and validation
  help, h  Shows a list of commands or help for one command

  --help, -h     show help (default: false)
  --version, -v  print the version (default: false)



Benchmark a proof computation using lotus-bench prove [command options] [arguments...]. For example:

./lotus-bench prove

Available options:

--no-gpuDisable gpu usage for the benchmark run (default: false).
--miner-addr valuePass miner address (only necessary if using existing sectorbuilder) (default: “t01000”).
--help, -hShow help (default: false).


Benchmark a sealing computation using lotus-bench sealing [command options] [arguments...]. For example:

./lotus-bench sealing

This will output something like:

2022-04-13T18:37:41.141+0200	INFO	lotus-bench	lotus-bench/main.go:103	Starting lotus-bench
results (v28) SectorSize:(536870912), SectorNumber:(1)
seal: addPiece: 1.815989865s (281.9 MiB/s)
seal: preCommit phase 1: 23.512164789s (21.78 MiB/s)
seal: preCommit phase 2: 11.748902504s (43.58 MiB/s)
seal: commit phase 1: 18.391743ms (27.19 GiB/s)
seal: commit phase 2: 5.698575481s (89.85 MiB/s)
seal: verify: 1.536285ms
unseal: 26.136081682s  (19.59 MiB/s)

generate candidates: 101.562µs (4.808 TiB/s)
compute winning post proof (cold): 665.669815ms
compute winning post proof (hot): 624.667643ms
verify winning post proof (cold): 17.949129ms
verify winning post proof (hot): 1.26867ms

compute window post proof (cold): 446.549819ms
compute window post proof (hot): 450.785891ms
verify window post proof (cold): 8.572963ms
verify window post proof (hot): 1.517569ms

Available options:

--storage-dir valuePath to the storage directory that will store sectors long term (default: “~/.lotus-bench”).
--sector-size valueSize of the sectors in bytes, i.e. 32GiB (default: “512MiB”).
--no-gpuDisable gpu usage for the benchmark run (default: false).
--miner-addr valuePass miner address (only necessary if using existing sectorbuilder) (default: “t01000”)
--benchmark-existing-sectorbuilder valuepass a directory to run post timings on an existing sectorbuilder
--json-outoutput results in json format (default: false)
--skip-commit2skip the commit2 (snark) portion of the benchmark (default: false)
--skip-unsealskip the unseal portion of the benchmark (default: false)
--save-commit2-input valueSave commit2 input to a file
--num-sectors value(default: 1)
--parallel value(default: 1)
--help, -hshow help (default: false)


Benchmark chain import and validation using lotus-bench import command [command options] [arguments...]. For example:

./lotus-bench import analyze

Available commands:

analyzeAnalyze a .car file.
helpShow the help information.

Available options:

--start-tipset valuestart validation at the given tipset key; in format cid1,cid2,cid3…
--end-tipset valuehalt validation at the given tipset key; in format cid1,cid2,cid3…
--genesis-tipset valuegenesis tipset key; in format cid1,cid2,cid3…
--start-height valuestart validation at given height; beware that chain traversal by height is very slow (default: 0)
--end-height valuehalt validation after given height; beware that chain traversal by height is very slow (default: 0)
--batch-seal-verify-threads valueset the parallelism factor for batch seal verification (default: 4)
--repodir valueset the repo directory for the lotus bench run (defaults to /tmp)
--syscall-cache valueread and write syscall results from datastore
--export-tracesshould we export execution traces (default: true)
--no-importshould we import the chain? if set to true chain has to be previously imported (default: false)
--global-profile(default: true)
--only-import(default: false)
--use-pebble(default: false)
--use-native-badger(default: false)
--car valuepath to CAR file; required for import; on validation, either a CAR path or the –head flag are required
--head valuetipset key of the head, useful when benchmarking validation on an existing chain store, where a CAR is not available; if both –car and –head are provided, –head takes precedence over the CAR root; the format is cid1,cid2,cid3…
--help, -hshow help (default: false)
--version, -vprint the version (default: false)


The list of known-to-work supported GPUs is in the hardware-requirements.

Enabling a custom GPU

If you want to test a GPU that is not explicitly supported, set the following environment variable:


Here is an example of trying a GeForce GTX 1660 Ti with 1536 cores:

export BELLMAN_CUSTOM_GPU="NVIDIA GeForce 3090 Ti:10752"

Testing whether the GPU is used

First, to watch GPU utilization run nvtop in one terminal, then in a separate terminal, run the benchmarking tool to simulate sealing of a sector of small size:

./lotus-bench sealing --sector-size=2KiB

This process uses a fair amount of GPU, and generally takes ~4 minutes to complete. If you do not see any activity in nvtop from lotus during the entire process, it is likely something is misconfigured with your GPU.

Edit this page on GitHub