Benchmarking tool for Solana Geyser gRPC endpoints. Compares two endpoints simultaneously to measure actual performance differences.
cargo build --release- All 6 slot stages: FirstShredReceived, CreatedBank, Completed, Processed, Confirmed, Finalized
- Download time (FirstShredReceived > Completed)
- Replay time (CreatedBank > Processed)
- Account update propagation delays (optional)
thorofare --endpoint1 endpoint1.com:10000 --endpoint2 endpoint2.com:10000Required:
--endpoint1- First endpoint (host:port)--endpoint2- Second endpoint (host:port)
Optional:
--x-token1- Auth token for endpoint1--x-token2- Auth token for endpoint2--slots- Number of slots to collect (default: 1000)--with-accounts- Track account updates--account-owner- Filter by program ID (requires --with-accounts) (default: Raydium AMM V4)--config- Config file (default: config.toml)--output- Output file (default: benchmark_results.json)
With auth tokens:
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--x-token1 YOUR_TOKEN_1 \
--x-token2 YOUR_TOKEN_2Track Raydium account updates:
thorofare \
--endpoint1 endpoint1.com:10000 \
--endpoint2 endpoint2.com:10000 \
--with-accounts \
--account-owner 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8Generates JSON with:
- Slot timing comparisons
- P50/P90/P99 percentiles
- Account update delays (if enabled)
- Ping latencies
You can visualize here https://thorofare.triton.one/
See config.toml for gRPC tuning options. Most important:
tcp_nodelay = truefor low latencyinitial_connection_window_sizefor heavy subscriptionsinitial_connection_window_sizefor heavy subscriptions (Recommend reading: https://httpwg.org/specs/rfc9113.html#rfc.section.6.9.1, for window size)
PRs welcome. Keep it simple:
- Fork and create a branch
- Make your changes
- Test against at least 2 different endpoints
- Submit PR :D