Overview
Firedancer includes a simple benchmarking tool for measuring the transaction throughput of the validator when it is leader, in transactions per second (TPS). The benchmark tool can be useful for testing local affinity and layout configurations to ensure your hardware is properly configured for optimal performance.How Benchmarking Works
The benchmark runs on a single machine and performs the following steps:- A new genesis is created, and set of accounts are pre-funded
- A set of CPU cores is assigned to generating and signing simple transactions using these accounts as fast as possible
- Another set of CPU cores is assigned to sending these transfers via QUIC over loopback to the locally running validator
- Around once a second, an RPC call is made to get the total count of transactions that have executed on the chain, and this information is printed to the console
The benchmark is currently quite synthetic, as it only measures single node performance, in an idealized case where all transactions are non-conflicting.
Running a Benchmark
The benchmark command is part of thefddev development binary, which can be built with:
Basic Benchmark
Run a benchmark with default settings:default.toml. On a 32 physical core AMD EPYC 7513, the default configuration reaches around 63,000 TPS.
Monitoring During Benchmark
While the benchmark is running, you can monitor tile performance in another terminal:- Tiles at 100% finish - Fully saturated tiles that may be bottlenecks
- High
overnp cnt- Tiles dropping transactions due to overload - High
% backp- Tiles waiting on downstream tiles
Benchmark Configuration
To achieve higher TPS rates, you need to tune several configuration parameters:- AMD Zen3 32-core
- AMD Zen4 64-core
- Intel Icelake 80-core
bench-zen3-32core.toml
Key Configuration Parameters
Genesis Configuration
fund_initial_accounts- More accounts allow more parallel transfers. Use 10,000-32,768 for high TPS testing.hashes_per_tick- Adjust PoH speed for faster block production in testing.
Benchmark-Specific Settings
benchg_tile_count- Number of tiles generating and signing transactionsbenchs_tile_count- Number of tiles sending transactions over QUIClarger_max_cost_per_block- Increases block size limits for testinglarger_shred_limits_per_block- Increases shred limits for testingdisable_blockstore_from_slot- Disables blockstore writes to show pure Firedancer performance
Running with Custom Configuration
Run the benchmark with your custom configuration:Interpreting Results
Example Output
Common Bottlenecks
- Verify Tiles Saturated
- Blockstore Backpressure
- Bank Tiles Saturated
Symptoms:
- All verify tiles at 100% finish
- High
overnp cnton verify tiles - TPS plateaus below expected
verify_tile_count and adjust affinity to provide more CPU cores for verification.Expected Performance
Typical benchmark results on different hardware:| Hardware | Configuration | Expected TPS |
|---|---|---|
| AMD EPYC 7513 (32 cores) | Default | ~63,000 |
| AMD EPYC 7513 (32 cores) | Tuned | ~250,000+ |
| AMD EPYC 9554P (64 cores) | Tuned | ~400,000+ |
| Intel Icelake (80 cores) | Tuned | ~500,000+ |
These are synthetic benchmarks with non-conflicting transactions. Real-world mainnet performance is limited by consensus rules to around 81,000 TPS.
Benchmarking Best Practices
- Use dedicated hardware - Close other applications to avoid interference
- Monitor tile metrics - Use
fdctl monitorto identify bottlenecks - Test incrementally - Adjust one parameter at a time
- Verify core assignment - Check that affinity strings don’t overlap
- Use in-memory storage - Set ledger path to
/dev/shmfor benchmarking - Disable unnecessary features - Turn off RPC history and metadata
- Increase account count - More accounts reduce transaction conflicts
Troubleshooting
Benchmark Won’t Start
- Verify
fddevbinary is built:make -j fddev - Check configuration file syntax is valid TOML
- Ensure sufficient CPU cores for both validator and benchmark tiles
Low TPS Results
- Check for tile saturation with
fdctl monitor - Verify no affinity overlap between validator and Agave
- Increase verify tile count (most common bottleneck)
- Ensure ledger is in memory (
/dev/shm)
TPS Drops Over Time
- Usually indicates blockstore backpressure
- Use
disable_blockstore_from_slot = 1for pure benchmarking - Check disk I/O performance if testing production configuration
Next Steps
After benchmarking:- Identify your optimal tile configuration
- Apply learnings to your production configuration
- Continue monitoring with
fdctl monitorand Prometheus metrics - See Performance Tuning for production optimization strategies