# Lotus Miner: Benchmarks

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.

# Installation

  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 (opens new window):

    git clone https://github.com/filecoin-project/lotus.git ~/lotus
    
    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
    
    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
    
    rm -f lotus-bench
    go build -o lotus-bench ./cmd/lotus-bench
    ...
    go run github.com/GeertJohan/go.rice/rice 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.

# Usage

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

    ./lotus-bench --help
  NAME:
  lotus-bench - Benchmark performance of lotus on your hardware

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

  VERSION:
  1.2.0

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

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

# Commands

# Prove

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

./lotus-bench prove

Available options:

Options Description
--no-gpu Disable gpu usage for the benchmark run (default: false).
--miner-addr value Pass miner address (only necessary if using existing sectorbuilder) (default: "t01000").
--help, -h Show help (default: false).

# Sealing

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

./lotus-bench sealing
2020-11-23T18:05:22.028Z        INFO    lotus-bench     lotus-bench/main.go:78  Starting lotus-bench
...
----
results (v28) (536870912)
seal: addPiece: 21.783625761s (23.5 MiB/s)
seal: preCommit phase 1: 4m45.456592593s (1.794 MiB/s)
seal: preCommit phase 2: 5m39.64126859s (1.507 MiB/s)
seal: commit phase 1: 48.158372ms (10.38 GiB/s)
seal: commit phase 2: 2m10.561079144s (3.922 MiB/s)
seal: verify: 6.236412ms
unseal: 3m52.85376877s  (2.199 MiB/s)

generate candidates: 231.814µs (2.106 TiB/s)
compute winning post proof (cold): 23.405645045s
compute winning post proof (hot): 22.507299071s
verify winning post proof (cold): 257.502167ms
verify winning post proof (hot): 7.473581ms

compute window post proof (cold): 7.132316755s
compute window post proof (hot): 6.893502363s
verify window post proof (cold): 57.524992ms
verify window post proof (hot): 5.629919ms

Available options:

Option Description
--storage-dir value Path to the storage directory that will store sectors long term (default: "~/.lotus-bench").
--sector-size value Size of the sectors in bytes, i.e. 32GiB (default: "512MiB").
--no-gpu Disable gpu usage for the benchmark run (default: false).
--miner-addr value Pass miner address (only necessary if using existing sectorbuilder) (default: "t01000")
--benchmark-existing-sectorbuilder value pass a directory to run post timings on an existing sectorbuilder
--json-out output results in json format (default: false)
--skip-commit2 skip the commit2 (snark) portion of the benchmark (default: false)
--skip-unseal skip the unseal portion of the benchmark (default: false)
--save-commit2-input value Save commit2 input to a file
--num-sectors value (default: 1)
--parallel value (default: 1)
--help, -h show help (default: false)

# Import

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

./lotus-bench import analyze import.car

Available commands:

Command Description
analyze Analyze a .car file.
help Show the help information.

Available options:

Option Description
--start-tipset value start validation at the given tipset key; in format cid1,cid2,cid3...
--end-tipset value halt validation at the given tipset key; in format cid1,cid2,cid3...
--genesis-tipset value genesis tipset key; in format cid1,cid2,cid3...
--start-height value start validation at given height; beware that chain traversal by height is very slow (default: 0)
--end-height value halt validation after given height; beware that chain traversal by height is very slow (default: 0)
--batch-seal-verify-threads value set the parallelism factor for batch seal verification (default: 4)
--repodir value set the repo directory for the lotus bench run (defaults to /tmp)
--syscall-cache value read and write syscall results from datastore
--export-traces should we export execution traces (default: true)
--no-import should 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 value path to CAR file; required for import; on validation, either a CAR path or the --head flag are required
--head value tipset 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, -h show help (default: false)
--version, -v print the version (default: false)