Skip to content

Conversation

edg-l
Copy link
Contributor

@edg-l edg-l commented Oct 14, 2025

Motivation

A single script and makefile alias to run a spamoor load test, which automatically runs a ethrex node in the background and runs spamoor with a specific configuration to load test it, along with providing instructions at the end to analize the logs.

Description

Current load test doesn't seem to work, this adds an alternative load test that uses a specialized tool, spamoor (https://github.com/ethpandaops/spamoor) to do this.

Example script run (expand)

➜  ethrex git:(main) ✗ make load-test-spamoor
bash ./tooling/spamoor/load-test.sh
Prompting to delete current ethrex db
Running ethrex as a background process, saving logs to load-test-logs.txt
Ethrex running as pid 94986, waiting 2 seconds for startup...
Starting spamoor...
INFO[0001] starting spamoor run command                  buildtime="2025-10-14T10:20:40Z" version=git-815b818
INFO[0001] initialized client pool with 1 clients (chain id: 65536999)  module=clientpool
INFO[0001] client check completed (1 good clients, 0 bad clients)  module=clientpool
INFO[0001] initialized root wallet (addr: 0x8943545177806ED17B9F23F0a21ee5948eCaa776 balance: 1000000000000000000 ETH, nonce: 0)
INFO[0001] Preparing to run 1 spammer(s)
INFO[0001] Preparing wallets for all spammers...
INFO[0001] funding child wallets... (0/1000)             module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0004] processed block 4:  0 total tx, 0 tx confirmed from 0 wallets (785.041µs, 5.959µs)
INFO[0004] processed block 5:  200 total tx, 200 tx confirmed from 1 wallets (18.077834ms, 12.653125ms)
INFO[0004] funding child wallets... (200/1000)           module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0004] processed block 6:  0 total tx, 0 tx confirmed from 0 wallets (112.167µs, 583ns)
INFO[0007] processed block 7:  0 total tx, 0 tx confirmed from 0 wallets (1.243792ms, 7.083µs)
INFO[0007] processed block 8:  200 total tx, 200 tx confirmed from 1 wallets (17.682208ms, 12.141208ms)
INFO[0007] funding child wallets... (400/1000)           module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0007] processed block 9:  0 total tx, 0 tx confirmed from 0 wallets (101µs, 541ns)
INFO[0010] processed block 10:  0 total tx, 0 tx confirmed from 0 wallets (531.041µs, 6.5µs)
INFO[0011] processed block 11:  200 total tx, 200 tx confirmed from 1 wallets (17.252792ms, 11.776875ms)
INFO[0011] funding child wallets... (600/1000)           module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0011] processed block 12:  0 total tx, 0 tx confirmed from 0 wallets (106.458µs, 1.292µs)
INFO[0014] processed block 13:  0 total tx, 0 tx confirmed from 0 wallets (660.041µs, 9.667µs)
INFO[0014] processed block 14:  200 total tx, 200 tx confirmed from 1 wallets (17.417208ms, 11.970417ms)
INFO[0014] funding child wallets... (800/1000)           module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0014] processed block 15:  0 total tx, 0 tx confirmed from 0 wallets (234.25µs, 1.75µs)
INFO[0017] processed block 16:  0 total tx, 0 tx confirmed from 0 wallets (322.458µs, 4.666µs)
INFO[0017] processed block 17:  200 total tx, 200 tx confirmed from 1 wallets (18.129042ms, 11.061417ms)
INFO[0017] funding child wallets... (1000/1000)          module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0017] processed block 18:  0 total tx, 0 tx confirmed from 0 wallets (144.584µs, 1.042µs)
INFO[0017] initialized 1000 child wallets                module=walletpool name="Spammer 1" scenario=eoatx spammer=0
INFO[0017] Wallets prepared for spammer 0 (Spammer 1)
INFO[0017] Starting all spammers...
INFO[0017] Starting spammer 0: Spammer 1 (eoatx)
INFO[0017] starting scenario: eoatx                      name="Spammer 1" scenario=eoatx spammer=0
INFO[0020] processed block 19:  0 total tx, 0 tx confirmed from 0 wallets (1.113ms, 8.291µs)
INFO[0020] block 19: submitted=5000, pending=5000, confirmed=0, throughput: 5B=0.00 tx/B, 20B=0.00 tx/B, 60B=0.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0021] processed block 20:  4777 total tx, 4777 tx confirmed from 1000 wallets (310.657542ms, 246.756125ms)
INFO[0021] block 20: submitted=2042, pending=2266, confirmed=4777, throughput: 5B=2388.50 tx/B, 20B=2388.50 tx/B, 60B=2388.50 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0021] processed block 21:  223 total tx, 223 tx confirmed from 223 wallets (16.120583ms, 10.950084ms)
INFO[0021] block 21: submitted=346, pending=2389, confirmed=223, throughput: 5B=1666.67 tx/B, 20B=1666.67 tx/B, 60B=1666.67 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=223
INFO[0024] processed block 22:  0 total tx, 0 tx confirmed from 0 wallets (845.083µs, 9.542µs)
INFO[0024] block 22: submitted=2612, pending=5000, confirmed=0, throughput: 5B=1250.00 tx/B, 20B=1250.00 tx/B, 60B=1250.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0024] processed block 23:  1108 total tx, 1108 tx confirmed from 1000 wallets (70.446417ms, 53.749542ms)
INFO[0024] block 23: submitted=450, pending=4344, confirmed=1108, throughput: 5B=1221.60 tx/B, 20B=1221.60 tx/B, 60B=1221.60 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0024] processed block 24:  3892 total tx, 3892 tx confirmed from 1000 wallets (243.565291ms, 189.357458ms)
INFO[0024] block 24: submitted=2238, pending=2689, confirmed=3892, throughput: 5B=2000.00 tx/B, 20B=1666.67 tx/B, 60B=1666.67 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0027] processed block 25:  0 total tx, 0 tx confirmed from 0 wallets (692.75µs, 8.875µs)
INFO[0027] block 25: submitted=2312, pending=5000, confirmed=0, throughput: 5B=1044.60 tx/B, 20B=1428.57 tx/B, 60B=1428.57 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0027] processed block 26:  0 total tx, 0 tx confirmed from 0 wallets (559.625µs, 6.75µs)
INFO[0027] block 26: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1250.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0028] processed block 27:  4504 total tx, 4504 tx confirmed from 1000 wallets (267.433666ms, 238.490167ms)
INFO[0028] block 27: submitted=1820, pending=2317, confirmed=4504, throughput: 5B=1900.80 tx/B, 20B=1611.56 tx/B, 60B=1611.56 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0028] processed block 28:  496 total tx, 496 tx confirmed from 496 wallets (34.539083ms, 24.205375ms)
INFO[0028] block 28: submitted=747, pending=2568, confirmed=496, throughput: 5B=1778.40 tx/B, 20B=1500.00 tx/B, 60B=1500.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=496
INFO[0031] processed block 29:  0 total tx, 0 tx confirmed from 0 wallets (165.75µs, 2.917µs)
INFO[0031] block 29: submitted=2433, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1363.64 tx/B, 60B=1363.64 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0031] processed block 30:  0 total tx, 0 tx confirmed from 0 wallets (198.75µs, 1.875µs)
INFO[0031] block 30: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1250.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0032] processed block 31:  5000 total tx, 5000 tx confirmed from 1000 wallets (314.838333ms, 272.052125ms)
INFO[0032] block 31: submitted=2153, pending=2154, confirmed=5000, throughput: 5B=2000.00 tx/B, 20B=1538.46 tx/B, 60B=1538.46 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0032] processed block 32:  0 total tx, 0 tx confirmed from 0 wallets (85.25µs, 1.042µs)
INFO[0032] block 32: submitted=4, pending=2158, confirmed=0, throughput: 5B=1099.20 tx/B, 20B=1428.57 tx/B, 60B=1428.57 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0035] processed block 33:  0 total tx, 0 tx confirmed from 0 wallets (737.708µs, 7.083µs)
INFO[0035] block 33: submitted=2843, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1333.33 tx/B, 60B=1333.33 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0035] processed block 34:  1125 total tx, 1125 tx confirmed from 1000 wallets (70.740583ms, 55.77025ms)
INFO[0035] block 34: submitted=467, pending=4343, confirmed=1125, throughput: 5B=1225.00 tx/B, 20B=1320.31 tx/B, 60B=1320.31 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0036] processed block 35:  3875 total tx, 3875 tx confirmed from 1000 wallets (239.389292ms, 192.712458ms)
INFO[0036] block 35: submitted=2261, pending=2729, confirmed=3875, throughput: 5B=2000.00 tx/B, 20B=1470.59 tx/B, 60B=1470.59 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0039] processed block 36:  0 total tx, 0 tx confirmed from 0 wallets (788.875µs, 7.208µs)
INFO[0039] block 36: submitted=2272, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1388.89 tx/B, 60B=1388.89 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0039] processed block 37:  0 total tx, 0 tx confirmed from 0 wallets (810.959µs, 3.5µs)
INFO[0039] block 37: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1315.79 tx/B, 60B=1315.79 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0040] processed block 38:  4768 total tx, 4768 tx confirmed from 1000 wallets (297.979042ms, 237.36ms)
INFO[0040] block 38: submitted=1975, pending=2209, confirmed=4768, throughput: 5B=1953.60 tx/B, 20B=1488.40 tx/B, 60B=1488.40 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0040] processed block 39:  232 total tx, 232 tx confirmed from 232 wallets (16.572667ms, 11.497459ms)
INFO[0040] block 39: submitted=358, pending=2334, confirmed=232, throughput: 5B=1775.00 tx/B, 20B=1500.00 tx/B, 60B=1428.57 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=232
INFO[0043] processed block 40:  0 total tx, 0 tx confirmed from 0 wallets (273.542µs, 6.25µs)
INFO[0043] block 40: submitted=2667, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1261.15 tx/B, 60B=1363.64 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0043] processed block 41:  0 total tx, 0 tx confirmed from 0 wallets (390.625µs, 3.667µs)
INFO[0043] block 41: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1304.35 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0044] processed block 42:  5000 total tx, 5000 tx confirmed from 1000 wallets (316.759583ms, 250.889083ms)
INFO[0044] block 42: submitted=2071, pending=2072, confirmed=5000, throughput: 5B=2000.00 tx/B, 20B=1500.00 tx/B, 60B=1458.33 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0044] processed block 43:  0 total tx, 0 tx confirmed from 0 wallets (128.625µs, 1.083µs)
INFO[0044] block 43: submitted=3, pending=2076, confirmed=0, throughput: 5B=1046.40 tx/B, 20B=1444.60 tx/B, 60B=1400.00 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0047] processed block 44:  0 total tx, 0 tx confirmed from 0 wallets (495.584µs, 6.625µs)
INFO[0047] block 44: submitted=2926, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1346.15 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0047] processed block 45:  807 total tx, 807 tx confirmed from 807 wallets (56.704625ms, 39.11375ms)
INFO[0047] block 45: submitted=327, pending=4522, confirmed=807, throughput: 5B=1161.40 tx/B, 20B=1290.35 tx/B, 60B=1326.19 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=807
INFO[0048] processed block 46:  4193 total tx, 4193 tx confirmed from 1000 wallets (258.009ms, 206.336375ms)
INFO[0048] block 46: submitted=2194, pending=2522, confirmed=4193, throughput: 5B=2000.00 tx/B, 20B=1500.00 tx/B, 60B=1428.57 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0051] processed block 47:  0 total tx, 0 tx confirmed from 0 wallets (878.417µs, 9.833µs)
INFO[0051] block 47: submitted=2479, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1274.80 tx/B, 60B=1379.31 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0051] processed block 48:  0 total tx, 0 tx confirmed from 0 wallets (668.041µs, 3.459µs)
INFO[0051] block 48: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1333.33 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0052] processed block 49:  4343 total tx, 4343 tx confirmed from 1000 wallets (274.554833ms, 213.53875ms)
INFO[0052] block 49: submitted=1777, pending=2435, confirmed=4343, throughput: 5B=1868.60 tx/B, 20B=1467.15 tx/B, 60B=1430.42 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=1000
INFO[0052] processed block 50:  657 total tx, 657 tx confirmed from 657 wallets (45.002125ms, 31.988083ms)
INFO[0052] block 50: submitted=982, pending=2760, confirmed=657, throughput: 5B=1838.60 tx/B, 20B=1500.00 tx/B, 60B=1406.25 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=657
INFO[0055] processed block 51:  0 total tx, 0 tx confirmed from 0 wallets (879.042µs, 7.208µs)
INFO[0055] block 51: submitted=2241, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1363.64 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0055] processed block 52:  0 total tx, 0 tx confirmed from 0 wallets (592.584µs, 3.542µs)
INFO[0055] block 52: submitted=0, pending=5000, confirmed=0, throughput: 5B=1000.00 tx/B, 20B=1250.00 tx/B, 60B=1323.53 tx/B  name="Spammer 1" scenario=eoatx spammer=0 wallets=0
INFO[0056] processed block 53:  5000 total tx, 5000 tx confirmed from 1000 wallets (324.24475ms, 246.513208ms)
INFO[0056] scenario eoatx finished.                      name="Spammer 1" scenario=eoatx spammer=0
INFO[0056] All spammers completed

real	0m56.065s
user	0m13.296s
sys	0m2.034s
Load test done
Block execution throughput summary from load-test-logs.txt:
  Average Ggas/s (non-zero): 1.214
  Max Ggas/s: 1.944
  Min Ggas/s: 0.200

+-------+-------+---------+--------+
| Block | Exec% | Merkle% | Store% |
+-------+-------+---------+--------+
|    34 |    57 |      14 |     14 |
|    36 |    60 |      20 |      0 |
|    40 |    60 |      20 |     10 |
|    43 |    81 |      14 |      5 |
|    46 |    80 |      10 |      5 |
|    49 |    74 |       9 |     13 |
|    52 |    75 |      11 |     13 |
|    53 |    60 |      27 |      7 |
|    56 |    74 |      11 |     15 |
|    59 |    66 |      22 |      9 |
|    60 |    71 |      14 |     14 |
|    63 |    73 |      11 |     15 |
|    67 |    73 |      11 |     15 |
|    70 |    66 |      22 |      9 |
|    71 |    71 |      13 |     13 |
|    74 |    73 |      11 |     15 |
|    75 |    50 |      33 |      0 |
|    78 |    73 |      11 |     14 |
|    81 |    62 |      24 |     10 |
|    82 |    71 |      13 |     15 |
+-------+-------+---------+--------+

@github-actions github-actions bot added the L1 Ethereum client label Oct 14, 2025
Copy link

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

@edg-l edg-l force-pushed the spamoor_load_test branch from f00d142 to 591a294 Compare October 14, 2025 11:59
@edg-l edg-l marked this pull request as ready for review October 14, 2025 12:01
@edg-l edg-l requested a review from a team as a code owner October 14, 2025 12:01
@ethrex-project-sync ethrex-project-sync bot moved this to In Review in ethrex_l1 Oct 14, 2025
@@ -0,0 +1,54 @@
DATADIR=/tmp/ethrex-load-test
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what's the benefit of doing this over running kurtosis with spammor? seems like we're reinventing the wheel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

L1 Ethereum client

Projects

Status: In Review

Development

Successfully merging this pull request may close these issues.

2 participants