maxEndorserBlockTxsSize limited · 100.0% full, against 98.9% of maxEndorserBlockReferencesSizemaxEndorserBlockReferencesSize), 1,000,000 B of transactions (maxEndorserBlockTxsSize)MempoolTimeoutCapacity), 1.0 s soft (MempoolTimeoutSoft), 3.0 s hard (MempoolTimeoutHard)TxSubmissionLogicVersion = TxSubmissionLogicV251 pools · 3 regions: AP 17, EU 17, US 17 · torus-dense · 306 producer entries = 204 links (102 reciprocated) · 153 intra-region links, 51 inter-region · every pool has 12 links of its own, 6 out and 6 in, 4 of them reciprocal, so 8 distinct partners · diameter 4, radius 4, mean shortest path 2.48 hops · peer sharing off (PeerSharing false in the node's configuration), so a node talks only and always to its listed producers
Node positions are identical in all three views; hover a node to highlight its links everywhere and read its degrees. Region colours: EU green, US red, AP blue. Links are drawn undirected; direction and each pool's producer list are in the adjacency table.
| Node | Region | Out intra | Out inter | In intra | In inter | Producers (outbound) |
|---|---|---|---|---|---|---|
| node-0 | EU | 4 | 2 | 4 | 2 | node-1, node-2, node-3, node-48, node-15, node-33 |
| node-1 | US | 4 | 2 | 4 | 2 | node-2, node-0, node-4, node-49, node-16, node-34 |
| node-2 | AP | 4 | 2 | 4 | 2 | node-0, node-1, node-5, node-50, node-17, node-35 |
| node-3 | EU | 4 | 2 | 4 | 2 | node-4, node-5, node-6, node-0, node-18, node-36 |
| node-4 | US | 4 | 2 | 4 | 2 | node-5, node-3, node-7, node-1, node-19, node-37 |
| node-5 | AP | 4 | 2 | 4 | 2 | node-3, node-4, node-8, node-2, node-20, node-38 |
| node-6 | EU | 4 | 2 | 4 | 2 | node-7, node-8, node-9, node-3, node-21, node-39 |
| node-7 | US | 4 | 2 | 4 | 2 | node-8, node-6, node-10, node-4, node-22, node-40 |
| node-8 | AP | 4 | 2 | 4 | 2 | node-6, node-7, node-11, node-5, node-23, node-41 |
| node-9 | EU | 4 | 2 | 4 | 2 | node-10, node-11, node-12, node-6, node-24, node-42 |
| node-10 | US | 4 | 2 | 4 | 2 | node-11, node-9, node-13, node-7, node-25, node-43 |
| node-11 | AP | 4 | 2 | 4 | 2 | node-9, node-10, node-14, node-8, node-26, node-44 |
| node-12 | EU | 4 | 2 | 4 | 2 | node-13, node-14, node-15, node-9, node-27, node-45 |
| node-13 | US | 4 | 2 | 4 | 2 | node-14, node-12, node-16, node-10, node-28, node-46 |
| node-14 | AP | 4 | 2 | 4 | 2 | node-12, node-13, node-17, node-11, node-29, node-47 |
| node-15 | EU | 4 | 2 | 4 | 2 | node-16, node-17, node-18, node-12, node-30, node-48 |
| node-16 | US | 4 | 2 | 4 | 2 | node-17, node-15, node-19, node-13, node-31, node-49 |
| node-17 | AP | 4 | 2 | 4 | 2 | node-15, node-16, node-20, node-14, node-32, node-50 |
| node-18 | EU | 4 | 2 | 4 | 2 | node-19, node-20, node-21, node-15, node-33, node-0 |
| node-19 | US | 4 | 2 | 4 | 2 | node-20, node-18, node-22, node-16, node-34, node-1 |
| node-20 | AP | 4 | 2 | 4 | 2 | node-18, node-19, node-23, node-17, node-35, node-2 |
| node-21 | EU | 4 | 2 | 4 | 2 | node-22, node-23, node-24, node-18, node-36, node-3 |
| node-22 | US | 4 | 2 | 4 | 2 | node-23, node-21, node-25, node-19, node-37, node-4 |
| node-23 | AP | 4 | 2 | 4 | 2 | node-21, node-22, node-26, node-20, node-38, node-5 |
| node-24 | EU | 4 | 2 | 4 | 2 | node-25, node-26, node-27, node-21, node-39, node-6 |
| node-25 | US | 4 | 2 | 4 | 2 | node-26, node-24, node-28, node-22, node-40, node-7 |
| node-26 | AP | 4 | 2 | 4 | 2 | node-24, node-25, node-29, node-23, node-41, node-8 |
| node-27 | EU | 4 | 2 | 4 | 2 | node-28, node-29, node-30, node-24, node-42, node-9 |
| node-28 | US | 4 | 2 | 4 | 2 | node-29, node-27, node-31, node-25, node-43, node-10 |
| node-29 | AP | 4 | 2 | 4 | 2 | node-27, node-28, node-32, node-26, node-44, node-11 |
| node-30 | EU | 4 | 2 | 4 | 2 | node-31, node-32, node-33, node-27, node-45, node-12 |
| node-31 | US | 4 | 2 | 4 | 2 | node-32, node-30, node-34, node-28, node-46, node-13 |
| node-32 | AP | 4 | 2 | 4 | 2 | node-30, node-31, node-35, node-29, node-47, node-14 |
| node-33 | EU | 4 | 2 | 4 | 2 | node-34, node-35, node-36, node-30, node-48, node-15 |
| node-34 | US | 4 | 2 | 4 | 2 | node-35, node-33, node-37, node-31, node-49, node-16 |
| node-35 | AP | 4 | 2 | 4 | 2 | node-33, node-34, node-38, node-32, node-50, node-17 |
| node-36 | EU | 4 | 2 | 4 | 2 | node-37, node-38, node-39, node-33, node-0, node-18 |
| node-37 | US | 4 | 2 | 4 | 2 | node-38, node-36, node-40, node-34, node-1, node-19 |
| node-38 | AP | 4 | 2 | 4 | 2 | node-36, node-37, node-41, node-35, node-2, node-20 |
| node-39 | EU | 4 | 2 | 4 | 2 | node-40, node-41, node-42, node-36, node-3, node-21 |
| node-40 | US | 4 | 2 | 4 | 2 | node-41, node-39, node-43, node-37, node-4, node-22 |
| node-41 | AP | 4 | 2 | 4 | 2 | node-39, node-40, node-44, node-38, node-5, node-23 |
| node-42 | EU | 4 | 2 | 4 | 2 | node-43, node-44, node-45, node-39, node-6, node-24 |
| node-43 | US | 4 | 2 | 4 | 2 | node-44, node-42, node-46, node-40, node-7, node-25 |
| node-44 | AP | 4 | 2 | 4 | 2 | node-42, node-43, node-47, node-41, node-8, node-26 |
| node-45 | EU | 4 | 2 | 4 | 2 | node-46, node-47, node-48, node-42, node-9, node-27 |
| node-46 | US | 4 | 2 | 4 | 2 | node-47, node-45, node-49, node-43, node-10, node-28 |
| node-47 | AP | 4 | 2 | 4 | 2 | node-45, node-46, node-50, node-44, node-11, node-29 |
| node-48 | EU | 4 | 2 | 4 | 2 | node-49, node-50, node-0, node-45, node-12, node-30 |
| node-49 | US | 4 | 2 | 4 | 2 | node-50, node-48, node-1, node-46, node-13, node-31 |
| node-50 | AP | 4 | 2 | 4 | 2 | node-48, node-49, node-2, node-47, node-14, node-32 |
cardano-cli ping round trips over the node-to-node handshake, measured at cluster start by every pool against its producers: 918 samples over 6 region pairs. Milliseconds.
| Link | n | min | median | mean | max | SD | SEM | TCP connect |
|---|---|---|---|---|---|---|---|---|
| within AP (Sydney) | 204 | 0.41 | 0.61 | 0.65 | 1.74 | 0.166 | 0.012 | 0.26 |
| within EU (Frankfurt) | 204 | 0.53 | 0.84 | 0.88 | 1.95 | 0.265 | 0.019 | 0.50 |
| within US (N. Virginia) | 204 | 0.51 | 0.73 | 0.77 | 1.72 | 0.171 | 0.012 | 0.37 |
| AP ↔ EU | 102 | 249.78 | 250.41 | 252.60 | 266.47 | 5.035 | 0.499 | 252.14 |
| AP ↔ US | 102 | 206.67 | 213.59 | 213.99 | 221.58 | 5.389 | 0.534 | 213.51 |
| EU ↔ US | 102 | 90.17 | 91.00 | 91.04 | 92.40 | 0.396 | 0.039 | 90.55 |
Not an ICMP ping: cardano-cli ping opens a TCP connection and runs the node-to-node handshake, so each sample is an application-level round trip through both nodes' network stacks and mux, which is what the Cardano protocols actually experience. The TCP connect column is the bare TCP round trip from the same tool, the closest stand-in for a raw ping. SEM = SD / sqrt(n). The spread is 412x, from 0.61 ms within AP to 250.41 ms between AP and EU, and it is the floor under every interval in this report.
The load generator, a closed-loop driver. A workload is a self-contained circuit: its own disjoint partition of funds, single-use UTxOs, its own builder turning funds into transactions, its own token-bucket rate limit, its own injection targets and its own observer following the chain. Every transaction spends funds and creates outputs, and an output becomes spendable again only once that workload's observer has seen its transaction reach the confirmation depth, so the transactions form chains gated by the chain itself and the funds budget is the buffer bridging confirmation latency. With on_exhaustion = error the generator fails the run the moment a node asks for transactions and it has none to hand over, whatever left it empty: too small an initial budget, funds not coming back from confirmation, a builder that cannot keep pace, or simply a target pulling faster than the loop can refill. It is one guard against the whole class of not keeping up, and it is loud rather than a quiet slowdown.
value, every transaction 2-in 2-out with 2 destination signing key per builder, fee 1,000,000token_bucket, scope per_target, at 3.28 tx/s per target, 167.1 tx/s offered in aggregate (62.48 KB/s at the 374 B measured transaction size)on_confirm at confirmation depth 3, over a nodetonode observergenesis-funds (genesis_utxo_keys), scope per_workload, so a fund returned by a workload can only be taken up by that same workloadon_exhaustion = error · max_batch_size = 0The generator runs on its own machine in eu-central-1, which forges nothing, so every transaction crosses the network before the pool that must place it in a block ever sees it: the round trip a workload pays is the EU row for its target's region in the table above. Each workload holds two buffers of its own, funds waiting to be built and built transactions waiting to be delivered.
Every EB forging found, nothing filtered. A block that lost its height battle, that was rolled away from, or that no other node ever adopted still counts.
| region | RBs forged | share of all RBs | includes EB hash | of its own RBs |
|---|---|---|---|---|
| AP | 1,065 | 32.4% | 1,059 | 99.4% |
| EU | 1,146 | 34.8% | 1,140 | 99.5% |
| US | 1,080 | 32.8% | 1,070 | 99.1% |
What an endorser block holds. An endorser block is a list of (tx hash, size) references and nothing else, so its size is that list's size.
| mean | min | p50 | p90 | max | sd | |
|---|---|---|---|---|---|---|
| EB size (bytes) | 97,968 | 15,617 | 98,904 | 98,904 | 98,904 | 6,311 |
| EB full, of the 100,000 B reference cap | 98.0% | 15.6% | 98.9% | 98.9% | 98.9% | 6.3% |
| tx references per EB | 2,647 | 422 | 2,673 | 2,673 | 2,673 | 170 |
| bytes per reference | 37.00 | 37.00 | 37.00 | 37.00 | 37.01 | 0.00 |
| derived closure bytes, references × 374 B | 990,244 | 157,828 | 999,702 | 999,702 | 999,702 | 63,794 |
| derived closure full, of the 1,000,000 B transaction cap | 99.0% | 15.8% | 100.0% | 100.0% | 100.0% | 6.4% |
The transaction closure is what binds this run. Its transactions are 374 B each, so its largest endorser block holds 2,673 of them: 98,904 B of references against the 100,000 B cap (98.9%), and 999,702 B of transactions against the 1,000,000 B the closure allows (100.0%). The one that reaches 100% is the one that stopped the endorser block from growing.
The other run of this pair, 2026-11-09-16-29-2a1ad-w45ezenotxsu-value-leios-workload-all-n2n-100k1m-2i2o2w-nomadperf-dira-nom, is the control for exactly this: its transactions are 374 B, its largest endorser block holds 2,673 references for 98,904 B (98.9% of the reference cap), and their closure is 999,702 B (100.0% of the closure cap). With 374 B transactions the closure fills first, with 374 B transactions the closure does, off the same two caps. So the same cap binds in both, and the transaction size did not move it.
A slot's start is fixed by the protocol, the system start plus the slot length, and everything here is measured against it. A node traces every slot it enters, so a slot with no trace is one it never entered, and each node is counted over its own window, from the first slot it entered to its last.
One value per block, from the start of its own slot to its forging: every ranking block in the first row, every forging that carries an endorser block in the second, so a hash forged twice counts twice. Section 6 measures that second stage again from the same origin but counts each hash once, at its first forging, which is why its samples are fewer.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| slot start to the ranking block forged | 3,291 | 62 ms | 1 ms | 30 ms | 35 ms | 45 ms | 586 ms | 3.14 s | 5.65 s | 218 ms |
| slot start to the EB forged, every forging | 3,269 | 49 ms | 2 ms | 19 ms | 22 ms | 31 ms | 571 ms | 3.13 s | 5.64 s | 216 ms |
Every row holds one value per node, counted over that node's own window, so the samples are nodes and the spread is across the cluster rather than over time.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| slots in its own window | 51 | 64073.9 | 64,072 | 64,074 | 64,074 | 64,075 | 64,076 | 64,076 | 64,076 | 0.8 |
| slots it entered | 51 | 63979.6 | 63,957 | 63,982 | 63,985 | 63,989 | 63,997 | 63,997 | 63,997 | 9.2 |
| slots it missed | 51 | 94.4 | 77 | 93 | 100 | 107 | 117 | 117 | 117 | 8.8 |
| missed per 1,000 slots | 51 | 1.5 | 1.2 | 1.5 | 1.6 | 1.7 | 1.8 | 1.8 | 1.8 | 0.1 |
| region | nodes | slots it missed | missed per 1,000 slots | median entry, median node |
|---|---|---|---|---|
| AP | 17 | 1,724 | 1.6 | 1 ms |
| EU | 17 | 1,559 | 1.4 | 1 ms |
| US | 17 | 1,530 | 1.4 | 1 ms |
The load as it ran, per minute: the generator's own side first, then what the nodes' mempools did with it. Every row is split, the first hour on the left and the rest of the run on the right, each half on the scale its own window needs. A region's band runs from the lowest of its 17 nodes to the highest, the line inside it is their mean and the dashed line the mean over all 51. Hover a row for the values at that minute.
The generator's own traces: the closed loop of funds, what it delivered, how fast, and what each target asked for and did not get.
The nodes' own traces: what each mempool held, how fast transactions entered and left it, and what it turned away.
Three instants are used:
Consensus.LeiosKernel.BlockForged)LeiosNotify.Remote.Send.BlockAnnouncement)LeiosFetch.Remote.Receive.Block)Where an endorser block's hash was forged more than once, and so referenced by more than one ranking block, the first forging is the one used and the later ones are ignored: the instants this section reads are the first for that hash and node, so they belong to the first forging.
The forger alone: from forging the endorser block to sending its first announcement of it.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Forger: forged to its first announcement | 3,261 | 15 ms | 3 ms | 13 ms | 16 ms | 20 ms | 43 ms | 71 ms | 1.93 s | 34 ms |
From the forger's first announcement of the endorser block to that endorser block first arriving at a peer. Repeated deliveries of the same endorser block are counted under Activity, never timed here.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| announced, to the EB arriving at a node | 163,050 | 1.18 s | 9 ms | 1.09 s | 1.51 s | 1.78 s | 2.73 s | 5.41 s | 11.13 s | 550 ms |
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Only peers in AP | 54,380 | 1.28 s | 10 ms | 1.22 s | 1.62 s | 1.86 s | 2.92 s | 5.54 s | 9.88 s | 559 ms |
| Only peers in EU | 54,303 | 1.14 s | 10 ms | 1.09 s | 1.41 s | 1.73 s | 2.67 s | 5.36 s | 8.96 s | 538 ms |
| Only peers in US | 54,367 | 1.11 s | 9 ms | 1.05 s | 1.36 s | 1.69 s | 2.67 s | 5.39 s | 11.13 s | 536 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 854 ms | 1.53 s | 1.42 s |
| EU | 1.57 s | 856 ms | 1.09 s |
| US | 1.38 s | 1.04 s | 805 ms |
One value per endorser block: the delay by which that share of the other nodes had first received it, measured from the forger's first announcement as above. The 100% row holds each endorser block's slowest node, so it sits above the table of every node and endorser block.
| mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | ||
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 944 ms | 549 ms | 816 ms | 1.08 s | 1.44 s | 1.71 s | 4.98 s | 7.16 s | 369 ms | |
| to 50% of its peers | 1.16 s | 636 ms | 1.09 s | 1.45 s | 1.64 s | 2.06 s | 5.15 s | 7.44 s | 398 ms | |
| to 75% of its peers | 1.46 s | 712 ms | 1.38 s | 1.67 s | 1.86 s | 2.58 s | 5.39 s | 7.86 s | 403 ms | |
| to 90% of its peers | 1.62 s | 734 ms | 1.54 s | 1.90 s | 2.19 s | 2.92 s | 6.65 s | 8.24 s | 499 ms | |
| to 100% of its peers | 2.04 s | 816 ms | 1.90 s | 2.35 s | 3.03 s | 4.99 s | 9.30 s | 11.13 s | 859 ms |
The same events counted instead of timed, and counted per peer and endorser block: for one endorser block, how many announcements that peer sent out, and how many times it fetched the endorser block. Anything above one is a repeat the protocol paid for. The two announcement figures below count every node, each forger's own sends included; the regional table counts the receiving peers only, which is why its rows add to one node less.
Inbound: the node pulling the endorser block from a peer. One means it fetched it once, more than one means it fetched the same endorser block again.
| times it fetched it | cases | share of cases |
|---|---|---|
| 1 time | 111,159 | 68.2% |
| 2 times | 24,036 | 14.7% |
| 3 times | 14,565 | 8.9% |
| 4 times or more | 13,290 | 8.2% |
| region | cases | announcements sent | per case | fetches | per case | repeats |
|---|---|---|---|---|---|---|
| AP | 54,380 | 327,083 | 6.01 | 105,213 | 1.93 | 48.3% |
| EU | 54,303 | 326,598 | 6.01 | 79,736 | 1.47 | 31.9% |
| US | 54,367 | 327,018 | 6.02 | 77,925 | 1.43 | 30.2% |
A delivered endorser block is not yet held: until its write is durable the body still reads as not-held, which is why the same endorser block can be fetched again meanwhile. Consensus.LeiosKernel.BlockAcquired is the moment that ends: the node has the reference list stored and claims to hold it, registering which referenced transactions it still needs. This is the step from arrival to that claim, which includes waiting for the single writer, and how often the same endorser block was stored again.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| the EB arriving, to the node writing it | 163,050 | 49 ms | 7 ms | 40 ms | 51 ms | 89 ms | 125 ms | 540 ms | 2.74 s | 58 ms |
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Only peers in AP | 54,380 | 50 ms | 7 ms | 41 ms | 53 ms | 88 ms | 130 ms | 754 ms | 2.74 s | 63 ms |
| Only peers in EU | 54,303 | 49 ms | 7 ms | 40 ms | 51 ms | 91 ms | 123 ms | 262 ms | 2.34 s | 55 ms |
| Only peers in US | 54,367 | 48 ms | 8 ms | 39 ms | 49 ms | 87 ms | 122 ms | 520 ms | 2.23 s | 56 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 51 ms | 50 ms | 49 ms |
| EU | 50 ms | 49 ms | 45 ms |
| US | 49 ms | 48 ms | 48 ms |
One value per endorser block: the delay by which that share of the other nodes had first stored it, each measured from that node's own fetch of the endorser block. The 100% row holds each endorser block's slowest node, so it sits above the table of every node and endorser block.
| mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | ||
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 39 ms | 10 ms | 35 ms | 39 ms | 51 ms | 90 ms | 92 ms | 94 ms | 15 ms | |
| to 50% of its peers | 46 ms | 10 ms | 40 ms | 44 ms | 87 ms | 93 ms | 95 ms | 105 ms | 18 ms | |
| to 75% of its peers | 54 ms | 11 ms | 47 ms | 55 ms | 92 ms | 101 ms | 127 ms | 140 ms | 20 ms | |
| to 90% of its peers | 63 ms | 12 ms | 53 ms | 72 ms | 97 ms | 131 ms | 167 ms | 197 ms | 23 ms | |
| to 100% of its peers | 162 ms | 15 ms | 74 ms | 117 ms | 166 ms | 2.06 s | 2.34 s | 2.74 s | 348 ms |
Counted per peer and endorser block, like section 2: how many times a peer wrote the same endorser block down. This one is local, nothing crosses the network.
| times it was written | cases | share of cases |
|---|---|---|
| 1 time | 139,115 | 85.3% |
| 2 times | 16,434 | 10.1% |
| 3 times | 6,353 | 3.9% |
| 4 times or more | 1,148 | 0.7% |
| region | cases | writes | per case |
|---|---|---|---|
| AP | 54,380 | 67,357 | 1.24 |
| EU | 54,303 | 64,187 | 1.18 |
| US | 54,367 | 64,121 | 1.18 |
An endorser block is a list of references. The transactions themselves are a separate transfer, and a node has the closure once it holds all of them: Consensus.LeiosKernel.BlockTxsAcquired. Counted per peer and endorser block, on the same endorser blocks as sections 2 and 3.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| EB fetched to the closure obtained | 163,050 | 787 ms | 8 ms | 644 ms | 1.01 s | 1.29 s | 2.15 s | 4.02 s | 10.35 s | 426 ms |
A voter has until 7 s after the announcing block's slot onset to hold and validate the transactions: lHdrWait 3 s then lVoteWindow 4 s, both fixed in LeiosVoting.hs rather than read from genesis. 215 of 163,050 closures were obtained later than that, counted from that slot's own start.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Only peers in AP | 54,380 | 793 ms | 8 ms | 655 ms | 1.04 s | 1.35 s | 2.28 s | 4.33 s | 6.74 s | 484 ms |
| Only peers in EU | 54,303 | 798 ms | 11 ms | 673 ms | 1.01 s | 1.23 s | 1.96 s | 3.67 s | 10.35 s | 375 ms |
| Only peers in US | 54,367 | 771 ms | 11 ms | 604 ms | 994 ms | 1.23 s | 2.07 s | 4.03 s | 10.31 s | 410 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 427 ms | 827 ms | 752 ms |
| EU | 1.08 s | 780 ms | 942 ms |
| US | 826 ms | 787 ms | 598 ms |
One value per endorser block: the delay by which that share of the other nodes had first obtained the closure, each measured from that node's own fetch of the endorser block. The 100% row holds each endorser block's slowest node, so it sits above the table of every node and endorser block.
| mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | ||
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 626 ms | 14 ms | 551 ms | 643 ms | 978 ms | 1.24 s | 3.59 s | 4.20 s | 248 ms | |
| to 50% of its peers | 771 ms | 18 ms | 721 ms | 959 ms | 1.12 s | 1.55 s | 4.00 s | 4.44 s | 303 ms | |
| to 75% of its peers | 941 ms | 27 ms | 937 ms | 1.16 s | 1.42 s | 1.80 s | 4.45 s | 5.14 s | 377 ms | |
| to 90% of its peers | 1.08 s | 34 ms | 1.03 s | 1.34 s | 1.62 s | 2.22 s | 4.66 s | 5.60 s | 454 ms | |
| to 100% of its peers | 1.55 s | 41 ms | 1.40 s | 1.97 s | 2.52 s | 3.76 s | 6.72 s | 10.35 s | 750 ms |
| times it obtained it | cases | share of cases |
|---|---|---|
| 1 time | 163,050 | 100.0% |
| 2 times | 0 | 0.0% |
| 3 times | 0 | 0.0% |
| 4 times or more | 0 | 0.0% |
| region | cases | closures obtained | per case |
|---|---|---|---|
| AP | 54,380 | 54,380 | 1.00 |
| EU | 54,303 | 54,303 | 1.00 |
| US | 54,367 | 54,367 | 1.00 |
When a node takes an endorser block it checks the transactions it names against its own
mempool, and the kernel reports what it found
(Consensus.LeiosKernel.BodyHits): one case per peer and endorser block,
166,311 of them over 3,261 endorser blocks.
Both rows are the same division: transactions the node had, over transactions the block names. For several cases together, add the tops, add the bottoms, divide once.
Do not add the two rows. Held in the mempool plus fetched is already all of them, in every one of the 166,311 cases, so the cache row counts transactions the mempool already had.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| tracked in the cache | 166,311 | 66.4% | 0.0% | 68.9% | 83.4% | 92.3% | 98.6% | 100.0% | 100.0% | 21.1% |
| held in the mempool | 166,311 | 24.2% | 0.0% | 13.2% | 31.1% | 75.2% | 100.0% | 100.0% | 100.0% | 28.1% |
One case is one peer and one endorser block, and the share is against that block's own reference list, 2,673 references at the median.
| region of the checking node | tracked in the cache | held in the mempool |
|---|---|---|
| AP | 66.4% | 34.5% |
| EU | 66.4% | 11.7% |
| US | 66.4% | 26.5% |
| forger down / peer across | AP | EU | US |
|---|---|---|---|
| AP | 71.2% / 78.2% | 71.2% / 8.0% | 71.3% / 14.7% |
| EU | 59.8% / 9.2% | 59.8% / 18.7% | 59.8% / 10.2% |
| US | 68.6% / 18.0% | 68.6% / 8.1% | 68.6% / 55.3% |
Each cell is for endorser blocks forged in the row's region and checked by a node in the column's, so the diagonal is same-region. Both shares are totals over totals, every case of that pair pooled, not a mean of the cases.
The same shortfall over the run, per minute. The first chart is one dot per endorser block, the share of what it named that its peers were missing. The other three take the peers of one region and split that share by the forger's region: each line is that minute's cases pooled and the band runs from the lowest of the seventeen peers to the highest. Hover a row for the values at that minute.
Counted on the blocks the whole cluster took. A block qualifies when all 50 nodes other than its forger adopted it, every peer it has of the 51 in the cluster: 3,174 of the run's 3,291 walkable blocks. Both sides of the ratio are held to it, so an announcement made by a block only part of the cluster held, and a certificate carried by one, are both out. No battle or fork filter is applied: nothing here asks what happened at a contested height. The blocks come from every forging the logs can place on a chain, both sides of a fork included, and the test above is adoption by every peer, not having won the height.
| region of the announcer | EBs announced | certified | share |
|---|---|---|---|
| AP | 1,022 | 312 | 30.5% |
| EU | 1,087 | 207 | 19.0% |
| US | 1,035 | 297 | 28.7% |
Hover a stage for what it counts and which trace says so. The stages down to Never reached quorum count endorser blocks; the rows under it count voter decisions, one per trace event, which is why they sum past 100%. Nothing is gated here, not even the run's opening epochs: every endorser block any ranking
block announced is counted, which is why this table is wider than the cards above.
117 endorser blocks were announced only by blocks that part of the cluster never adopted,
and the two carried counts differ by 0, certificates whose carrier was not adopted
by every peer. tooLate is the voter's own refusal, counted once per voter and
endorser block and only on the ones that never reached quorum: a node logs it when the window
had already shut before it began, whether or not it ever held the transactions, so it is not
section 4's late closures.
| stage | count | % of announced | % of its group | group | votes received |
|---|---|---|---|---|---|
| Endorser blocks announced | 3,261 | 100.0% | · | · | · |
| A voting window opened | 3,261 | 100.0% | · | · | · |
| Reached quorum | 1,396 | 42.8% | · | · | 39–51 of 51, median 50 |
| Certificate carried by a later block | 816 | 25.0% | 58.5% | reached quorum | · |
| Quorum reached, never carried | 580 | 17.8% | 41.5% | reached quorum | · |
| Never reached quorum | 1,865 | 57.2% | · | · | 0–38 of 51, median 9 |
voters declined: chainTipDoesNotAnnounce | 17,575 | · | 18.5% | no-quorum voters | · |
voters declined: tooLate | 56,472 | · | 59.3% | no-quorum voters | · |
| voters voted for it anyway | 21,154 | · | 22.2% | no-quorum voters | · |
Every ranking block against every peer that adopted it: from the block's slot start to that peer's own adoption, one value per pair. Nothing here is a per-block figure, so a block the whole cluster took contributes as many values as it had peers.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| all blocks | 161,459 | 738 ms | 6 ms | 653 ms | 975 ms | 1.20 s | 2.75 s | 7.71 s | 16.52 s | 603 ms |
| blocks carrying a certificate | 41,378 | 560 ms | 140 ms | 511 ms | 704 ms | 749 ms | 1.14 s | 3.04 s | 4.89 s | 251 ms |
| blocks carrying none | 120,081 | 799 ms | 6 ms | 758 ms | 1.06 s | 1.33 s | 3.03 s | 8.01 s | 16.52 s | 673 ms |
Left out: 1,647 block and peer pairs the block never reached, and 1,444 with no adoption instant.
One value per ranking block: the delay by which that share of its own peers had adopted it, from the block's slot start. One table per population, named in its first column.
| all blocks | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 422 ms | 16 ms | 326 ms | 415 ms | 728 ms | 2.07 s | 6.44 s | 8.23 s | 486 ms | |
| to 50% of its peers | 751 ms | 147 ms | 547 ms | 930 ms | 1.15 s | 2.46 s | 6.70 s | 8.72 s | 511 ms | |
| to 75% of its peers | 1.02 s | 155 ms | 966 ms | 1.07 s | 1.37 s | 2.83 s | 7.99 s | 9.54 s | 539 ms | |
| to 90% of its peers | 1.08 s | 155 ms | 1.03 s | 1.11 s | 1.52 s | 3.15 s | 8.53 s | 10.91 s | 615 ms | |
| to 100% of its peers | 1.34 s | 155 ms | 1.09 s | 1.41 s | 2.40 s | 4.89 s | 10.58 s | 16.52 s | 962 ms |
| blocks carrying a certificate | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 384 ms | 173 ms | 375 ms | 392 ms | 407 ms | 743 ms | 2.77 s | 2.77 s | 152 ms | |
| to 50% of its peers | 561 ms | 289 ms | 502 ms | 662 ms | 693 ms | 926 ms | 3.02 s | 3.02 s | 182 ms | |
| to 75% of its peers | 715 ms | 308 ms | 710 ms | 736 ms | 749 ms | 992 ms | 3.09 s | 3.09 s | 168 ms | |
| to 90% of its peers | 739 ms | 313 ms | 732 ms | 759 ms | 774 ms | 1.09 s | 3.17 s | 3.17 s | 176 ms | |
| to 100% of its peers | 984 ms | 327 ms | 771 ms | 801 ms | 2.27 s | 3.06 s | 4.89 s | 4.89 s | 623 ms |
| blocks carrying none | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 435 ms | 16 ms | 219 ms | 564 ms | 881 ms | 2.44 s | 6.46 s | 8.23 s | 556 ms | |
| to 50% of its peers | 817 ms | 147 ms | 659 ms | 959 ms | 1.26 s | 2.63 s | 7.12 s | 8.72 s | 569 ms | |
| to 75% of its peers | 1.12 s | 155 ms | 1.05 s | 1.10 s | 1.48 s | 3.01 s | 8.14 s | 9.54 s | 581 ms | |
| to 90% of its peers | 1.20 s | 155 ms | 1.08 s | 1.21 s | 1.61 s | 3.42 s | 8.83 s | 10.91 s | 666 ms | |
| to 100% of its peers | 1.47 s | 155 ms | 1.12 s | 1.55 s | 2.52 s | 5.32 s | 10.61 s | 16.52 s | 1.03 s |
The same stages as the sections above, each from the start of the slot the endorser block belongs to instead of from the stage before it, so they read against each other and against the protocol's windows. A slot is 1.00 s.
A row naming each peer holds one value per peer and endorser block, never the first peer alone; one naming the last peer holds one per endorser block, that block's slowest. Every endorser block the run forged is in, counted once.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to the endorser block forged | 3,261 | 49 ms | 2 ms | 19 ms | 22 ms | 31 ms | 571 ms | 3.13 s | 5.64 s | 216 ms |
| to the forger's announcement | 3,261 | 65 ms | 6 ms | 32 ms | 37 ms | 50 ms | 602 ms | 3.14 s | 5.65 s | 219 ms |
| to each peer's references | 163,050 | 1.24 s | 24 ms | 1.13 s | 1.57 s | 1.89 s | 3.18 s | 6.24 s | 11.91 s | 603 ms |
| to the last peer's references | 3,261 | 2.10 s | 842 ms | 1.97 s | 2.43 s | 3.13 s | 5.34 s | 9.46 s | 11.91 s | 918 ms |
| to each peer's closure | 163,050 | 2.03 s | 72 ms | 1.91 s | 2.44 s | 2.94 s | 4.50 s | 7.30 s | 15.30 s | 790 ms |
| to the last peer's closure | 3,261 | 3.21 s | 1.59 s | 3.20 s | 3.69 s | 4.24 s | 6.64 s | 11.92 s | 15.30 s | 1.06 s |
A stage past 1.00 s is a stage the next slot had already begun. 15 of 3,261 endorser blocks were forged past it and 16 announced past it, and 3,258 of them reached their last peer past it.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to each peer's references, only peers in AP | 54,380 | 1.35 s | 27 ms | 1.27 s | 1.67 s | 1.96 s | 3.31 s | 6.57 s | 11.56 s | 610 ms |
| to each peer's references, only peers in EU | 54,303 | 1.21 s | 29 ms | 1.13 s | 1.52 s | 1.86 s | 3.08 s | 6.19 s | 9.07 s | 592 ms |
| to each peer's references, only peers in US | 54,367 | 1.18 s | 24 ms | 1.09 s | 1.48 s | 1.80 s | 3.10 s | 6.26 s | 11.91 s | 594 ms |
| to each peer's closure, only peers in AP | 54,380 | 2.14 s | 72 ms | 2.08 s | 2.69 s | 3.15 s | 4.70 s | 7.38 s | 15.30 s | 882 ms |
| to each peer's closure, only peers in EU | 54,303 | 2.00 s | 72 ms | 1.86 s | 2.27 s | 2.86 s | 4.29 s | 7.20 s | 13.01 s | 718 ms |
| to each peer's closure, only peers in US | 54,367 | 1.95 s | 77 ms | 1.83 s | 2.29 s | 2.80 s | 4.40 s | 7.29 s | 13.78 s | 746 ms |
Every time a node abandoned a chain it already had for a better one, counted once for each node that did it (ChainDB.AddBlockEvent.SwitchedToAFork). A contest is one pair of tips, so a contest the whole cluster lived through counts once. Both rates below are contests per 1,000 blocks on the chain, so runs of different length compare directly.
The slot rate is the control and the height rate is the signal: two leaders in one slot is fixed by activeSlotsCoeff and cannot be engineered away, while a height battle is a node forging on a parent a sibling already had, which is propagation losing a race and is free to move. Reading the height rate without the control beside it cannot tell a propagation regression from a run that simply drew more forks.