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.44 | 0.62 | 0.66 | 2.23 | 0.230 | 0.016 | 0.25 |
| within EU (Frankfurt) | 204 | 0.46 | 0.90 | 0.91 | 2.24 | 0.301 | 0.021 | 0.49 |
| within US (N. Virginia) | 204 | 0.45 | 0.71 | 0.75 | 2.11 | 0.216 | 0.015 | 0.35 |
| AP ↔ EU | 102 | 249.61 | 250.45 | 254.21 | 267.68 | 6.551 | 0.649 | 253.79 |
| AP ↔ US | 102 | 203.90 | 211.84 | 211.88 | 219.77 | 5.050 | 0.500 | 211.44 |
| EU ↔ US | 102 | 90.23 | 90.90 | 90.95 | 92.60 | 0.403 | 0.040 | 90.50 |
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 406x, from 0.62 ms within AP to 250.45 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,003 | 32.8% | 994 | 99.1% |
| EU | 1,000 | 32.7% | 991 | 99.1% |
| US | 1,053 | 34.5% | 1,044 | 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) | 98,502 | 38,076 | 98,904 | 98,904 | 98,904 | 3,191 |
| EB full, of the 100,000 B reference cap | 98.5% | 38.1% | 98.9% | 98.9% | 98.9% | 3.2% |
| tx references per EB | 2,662 | 1,029 | 2,673 | 2,673 | 2,673 | 86 |
| bytes per reference | 37.00 | 37.00 | 37.00 | 37.00 | 37.00 | 0.00 |
| derived closure bytes, references × 374 B | 995,640 | 384,846 | 999,702 | 999,702 | 999,702 | 32,258 |
| derived closure full, of the 1,000,000 B transaction cap | 99.6% | 38.5% | 100.0% | 100.0% | 100.0% | 3.2% |
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-06-20-39-a0c13-w45notxsub-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,056 | 50 ms | 1 ms | 30 ms | 34 ms | 40 ms | 548 ms | 2.75 s | 3.02 s | 160 ms |
| slot start to the EB forged, every forging | 3,029 | 37 ms | 2 ms | 18 ms | 21 ms | 25 ms | 539 ms | 2.74 s | 3.01 s | 155 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 | 58679.6 | 58,666 | 58,680 | 58,681 | 58,681 | 58,681 | 58,681 | 58,681 | 2.5 |
| slots it entered | 51 | 58570.8 | 58,140 | 58,580 | 58,586 | 58,590 | 58,596 | 58,596 | 58,596 | 61.6 |
| slots it missed | 51 | 108.8 | 85 | 98 | 107 | 113 | 526 | 526 | 526 | 59.7 |
| missed per 1,000 slots | 51 | 1.9 | 1.4 | 1.7 | 1.8 | 1.9 | 9.0 | 9.0 | 9.0 | 1.0 |
| region | nodes | slots it missed | missed per 1,000 slots | median entry, median node |
|---|---|---|---|---|
| AP | 17 | 2,226 | 2.2 | 1 ms |
| EU | 17 | 1,681 | 1.7 | 1 ms |
| US | 17 | 1,642 | 1.6 | 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,027 | 16 ms | 4 ms | 13 ms | 16 ms | 19 ms | 38 ms | 68 ms | 2.37 s | 51 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 | 151,331 | 1.22 s | 10 ms | 1.10 s | 1.57 s | 1.76 s | 2.65 s | 3.96 s | 390.14 s | 2.28 s |
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Only peers in AP | 50,448 | 1.37 s | 10 ms | 1.34 s | 1.66 s | 1.88 s | 2.68 s | 4.15 s | 390.14 s | 3.88 s |
| Only peers in EU | 50,468 | 1.16 s | 10 ms | 1.10 s | 1.51 s | 1.71 s | 2.65 s | 3.74 s | 6.88 s | 498 ms |
| Only peers in US | 50,415 | 1.13 s | 10 ms | 1.06 s | 1.51 s | 1.69 s | 2.57 s | 3.89 s | 9.43 s | 500 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 937 ms | 1.56 s | 1.47 s |
| EU | 1.63 s | 861 ms | 1.10 s |
| US | 1.51 s | 1.05 s | 813 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 | 985 ms | 544 ms | 1.03 s | 1.08 s | 1.52 s | 1.58 s | 3.20 s | 3.99 s | 310 ms | |
| to 50% of its peers | 1.19 s | 632 ms | 1.10 s | 1.51 s | 1.64 s | 2.00 s | 3.54 s | 4.29 s | 342 ms | |
| to 75% of its peers | 1.48 s | 720 ms | 1.62 s | 1.67 s | 1.76 s | 2.27 s | 3.67 s | 4.58 s | 351 ms | |
| to 90% of its peers | 1.66 s | 779 ms | 1.69 s | 1.92 s | 2.19 s | 2.68 s | 4.44 s | 6.96 s | 447 ms | |
| to 100% of its peers | 2.97 s | 852 ms | 2.07 s | 2.40 s | 3.07 s | 4.59 s | 323.34 s | 390.14 s | 15.66 s |
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 |
|---|---|---|
| never | 7 | 0.0% |
| 1 time | 86,139 | 56.9% |
| 2 times | 30,228 | 20.0% |
| 3 times | 19,675 | 13.0% |
| 4 times or more | 15,289 | 10.1% |
| region | cases | announcements sent | per case | fetches | per case | repeats |
|---|---|---|---|---|---|---|
| AP | 50,455 | 302,746 | 6.00 | 110,047 | 2.18 | 54.2% |
| EU | 50,468 | 302,987 | 6.00 | 82,438 | 1.63 | 38.8% |
| US | 50,415 | 302,668 | 6.00 | 81,368 | 1.61 | 38.0% |
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 | 151,331 | 41 ms | 5 ms | 36 ms | 44 ms | 54 ms | 97 ms | 223 ms | 140.24 s | 364 ms |
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| Only peers in AP | 50,448 | 45 ms | 5 ms | 37 ms | 46 ms | 57 ms | 101 ms | 240 ms | 140.24 s | 627 ms |
| Only peers in EU | 50,468 | 39 ms | 7 ms | 35 ms | 42 ms | 52 ms | 95 ms | 225 ms | 2.47 s | 51 ms |
| Only peers in US | 50,415 | 40 ms | 8 ms | 36 ms | 44 ms | 54 ms | 96 ms | 199 ms | 2.34 s | 50 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 54 ms | 41 ms | 40 ms |
| EU | 40 ms | 39 ms | 37 ms |
| US | 41 ms | 37 ms | 42 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 | 32 ms | 9 ms | 31 ms | 35 ms | 38 ms | 47 ms | 64 ms | 78 ms | 6 ms | |
| to 50% of its peers | 36 ms | 9 ms | 36 ms | 40 ms | 44 ms | 57 ms | 80 ms | 97 ms | 7 ms | |
| to 75% of its peers | 44 ms | 10 ms | 43 ms | 48 ms | 55 ms | 89 ms | 118 ms | 156 ms | 11 ms | |
| to 90% of its peers | 53 ms | 11 ms | 49 ms | 56 ms | 74 ms | 107 ms | 166 ms | 233 ms | 16 ms | |
| to 100% of its peers | 185 ms | 22 ms | 66 ms | 88 ms | 135 ms | 2.10 s | 2.47 s | 140.24 s | 2.57 s |
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 |
|---|---|---|
| never | 7 | 0.0% |
| 1 time | 120,888 | 79.9% |
| 2 times | 20,478 | 13.5% |
| 3 times | 8,577 | 5.7% |
| 4 times or more | 1,388 | 0.9% |
| region | cases | writes | per case |
|---|---|---|---|
| AP | 50,455 | 65,925 | 1.31 |
| EU | 50,468 | 63,671 | 1.26 |
| US | 50,415 | 63,560 | 1.26 |
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 | 151,330 | 833 ms | 12 ms | 731 ms | 1.11 s | 1.41 s | 2.15 s | 3.47 s | 228.67 s | 745 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. 70 of 151,330 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 | 50,447 | 835 ms | 19 ms | 802 ms | 1.20 s | 1.53 s | 2.27 s | 3.66 s | 228.67 s | 1.16 s |
| Only peers in EU | 50,468 | 864 ms | 19 ms | 731 ms | 1.08 s | 1.36 s | 2.06 s | 3.32 s | 7.11 s | 393 ms |
| Only peers in US | 50,415 | 801 ms | 12 ms | 651 ms | 1.05 s | 1.29 s | 2.07 s | 3.33 s | 5.79 s | 415 ms |
| forger down / peer across (mean) | AP | EU | US |
|---|---|---|---|
| AP | 271 ms | 946 ms | 835 ms |
| EU | 1.24 s | 783 ms | 1.00 s |
| US | 952 ms | 857 ms | 562 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 | 589 ms | 16 ms | 555 ms | 667 ms | 918 ms | 1.25 s | 2.64 s | 3.22 s | 256 ms | |
| to 50% of its peers | 839 ms | 42 ms | 784 ms | 1.05 s | 1.18 s | 1.55 s | 2.84 s | 3.45 s | 288 ms | |
| to 75% of its peers | 1.05 s | 52 ms | 1.06 s | 1.26 s | 1.51 s | 1.78 s | 3.47 s | 4.24 s | 352 ms | |
| to 90% of its peers | 1.21 s | 59 ms | 1.19 s | 1.53 s | 1.70 s | 2.18 s | 4.03 s | 5.53 s | 436 ms | |
| to 100% of its peers | 1.77 s | 83 ms | 1.65 s | 2.12 s | 2.57 s | 3.79 s | 6.38 s | 228.67 s | 4.19 s |
| times it obtained it | cases | share of cases |
|---|---|---|
| never | 8 | 0.0% |
| 1 time | 151,330 | 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 | 50,455 | 50,447 | 1.00 |
| EU | 50,468 | 50,468 | 1.00 |
| US | 50,415 | 50,415 | 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,
154,358 of them over 3,027 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 154,358 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 | 154,358 | 48.8% | 0.0% | 46.2% | 72.7% | 86.8% | 96.6% | 100.0% | 100.0% | 26.9% |
| held in the mempool | 154,358 | 28.1% | 0.0% | 15.2% | 35.7% | 92.7% | 100.0% | 100.0% | 100.0% | 31.5% |
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 | 48.8% | 40.1% |
| EU | 48.8% | 12.9% |
| US | 48.8% | 31.3% |
| forger down / peer across | AP | EU | US |
|---|---|---|---|
| AP | 56.7% / 90.1% | 56.8% / 8.8% | 56.8% / 17.0% |
| EU | 38.5% / 9.9% | 38.5% / 21.3% | 38.5% / 10.9% |
| US | 50.9% / 21.2% | 51.0% / 8.8% | 50.9% / 64.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: 2,938 of the run's 3,056 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 | 949 | 455 | 47.9% |
| EU | 958 | 470 | 49.1% |
| US | 1,002 | 499 | 49.8% |
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.
118 endorser blocks were announced only by blocks that part of the cluster never adopted,
and the two carried counts differ by 10, 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,027 | 100.0% | · | · | · |
| A voting window opened | 3,027 | 100.0% | · | · | · |
| Reached quorum | 2,655 | 87.7% | · | · | 39–51 of 51, median 51 |
| Certificate carried by a later block | 1,434 | 47.4% | 54.0% | reached quorum | · |
| Quorum reached, never carried | 1,221 | 40.3% | 46.0% | reached quorum | · |
| Never reached quorum | 372 | 12.3% | · | · | 0–38 of 51, median 0 |
voters declined: chainTipDoesNotAnnounce | 17,158 | · | 90.5% | no-quorum voters | · |
voters declined: tooLate | 104 | · | 0.5% | no-quorum voters | · |
| voters voted for it anyway | 1,706 | · | 9.0% | 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 | 150,200 | 651 ms | 6 ms | 545 ms | 768 ms | 1.07 s | 2.29 s | 6.00 s | 389.67 s | 1.61 s |
| blocks carrying a certificate | 72,775 | 571 ms | 174 ms | 511 ms | 701 ms | 747 ms | 1.21 s | 3.05 s | 389.67 s | 1.87 s |
| blocks carrying none | 77,425 | 726 ms | 6 ms | 586 ms | 1.00 s | 1.17 s | 2.83 s | 6.46 s | 325.01 s | 1.32 s |
Left out: 960 block and peer pairs the block never reached, and 1,640 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 | 390 ms | 17 ms | 357 ms | 396 ms | 616 ms | 1.54 s | 5.51 s | 5.96 s | 359 ms | |
| to 50% of its peers | 651 ms | 151 ms | 518 ms | 693 ms | 954 ms | 1.79 s | 5.80 s | 6.10 s | 377 ms | |
| to 75% of its peers | 861 ms | 166 ms | 739 ms | 1.03 s | 1.11 s | 1.98 s | 6.39 s | 6.82 s | 401 ms | |
| to 90% of its peers | 910 ms | 180 ms | 766 ms | 1.07 s | 1.19 s | 2.41 s | 7.03 s | 7.71 s | 457 ms | |
| to 100% of its peers | 1.57 s | 182 ms | 913 ms | 1.14 s | 2.38 s | 4.35 s | 36.92 s | 389.67 s | 10.84 s |
| blocks carrying a certificate | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 393 ms | 248 ms | 377 ms | 396 ms | 416 ms | 730 ms | 2.69 s | 2.77 s | 150 ms | |
| to 50% of its peers | 560 ms | 321 ms | 501 ms | 659 ms | 689 ms | 960 ms | 2.81 s | 3.27 s | 177 ms | |
| to 75% of its peers | 712 ms | 337 ms | 708 ms | 734 ms | 749 ms | 1.15 s | 3.05 s | 3.51 s | 166 ms | |
| to 90% of its peers | 742 ms | 349 ms | 729 ms | 756 ms | 776 ms | 1.35 s | 3.07 s | 3.57 s | 187 ms | |
| to 100% of its peers | 1.47 s | 361 ms | 764 ms | 803 ms | 2.21 s | 3.12 s | 312.13 s | 389.67 s | 12.98 s |
| blocks carrying none | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to 30% of its peers | 387 ms | 17 ms | 217 ms | 363 ms | 862 ms | 2.14 s | 5.56 s | 5.96 s | 478 ms | |
| to 50% of its peers | 736 ms | 151 ms | 536 ms | 932 ms | 1.12 s | 2.34 s | 6.08 s | 6.10 s | 482 ms | |
| to 75% of its peers | 1.00 s | 166 ms | 1.02 s | 1.08 s | 1.34 s | 3.01 s | 6.44 s | 6.82 s | 495 ms | |
| to 90% of its peers | 1.07 s | 180 ms | 1.06 s | 1.11 s | 1.47 s | 3.20 s | 7.65 s | 7.71 s | 566 ms | |
| to 100% of its peers | 1.66 s | 182 ms | 1.10 s | 1.51 s | 2.54 s | 5.37 s | 36.92 s | 325.01 s | 8.34 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,027 | 37 ms | 2 ms | 18 ms | 21 ms | 25 ms | 539 ms | 2.74 s | 3.01 s | 155 ms |
| to the forger's announcement | 3,027 | 53 ms | 6 ms | 31 ms | 36 ms | 44 ms | 553 ms | 2.75 s | 3.02 s | 163 ms |
| to each peer's references | 151,331 | 1.27 s | 25 ms | 1.14 s | 1.64 s | 1.85 s | 2.84 s | 4.30 s | 390.16 s | 2.29 s |
| to the last peer's references | 3,027 | 3.03 s | 877 ms | 2.12 s | 2.45 s | 3.15 s | 4.74 s | 323.37 s | 390.16 s | 15.66 s |
| to each peer's closure | 151,330 | 2.11 s | 63 ms | 2.04 s | 2.67 s | 3.08 s | 4.09 s | 5.99 s | 398.57 s | 2.54 s |
| to the last peer's closure | 3,027 | 4.33 s | 1.50 s | 3.44 s | 3.86 s | 4.32 s | 6.57 s | 327.22 s | 398.57 s | 16.95 s |
A stage past 1.00 s is a stage the next slot had already begun. 7 of 3,027 endorser blocks were forged past it and 9 announced past it, and 3,022 of them reached their last peer past it. Left out for want of an instant: 7 cases where a peer never fetched the block, 8 where it never held the closure, and 0 blocks the forger never announced.
| samples | mean | min | p50 | p75 | p90 | p99 | p99.9 | max | sd | |
|---|---|---|---|---|---|---|---|---|---|---|
| to each peer's references, only peers in AP | 50,448 | 1.42 s | 27 ms | 1.41 s | 1.70 s | 1.96 s | 3.04 s | 4.41 s | 390.16 s | 3.89 s |
| to each peer's references, only peers in EU | 50,468 | 1.21 s | 25 ms | 1.13 s | 1.55 s | 1.76 s | 2.84 s | 4.18 s | 7.54 s | 523 ms |
| to each peer's references, only peers in US | 50,415 | 1.18 s | 27 ms | 1.09 s | 1.58 s | 1.74 s | 2.72 s | 4.27 s | 9.53 s | 523 ms |
| to each peer's closure, only peers in AP | 50,447 | 2.26 s | 63 ms | 2.27 s | 2.87 s | 3.31 s | 4.35 s | 6.52 s | 398.57 s | 4.27 s |
| to each peer's closure, only peers in EU | 50,468 | 2.08 s | 77 ms | 1.98 s | 2.39 s | 3.01 s | 4.02 s | 5.43 s | 8.78 s | 691 ms |
| to each peer's closure, only peers in US | 50,415 | 1.98 s | 67 ms | 1.88 s | 2.37 s | 2.87 s | 3.86 s | 5.87 s | 10.32 s | 719 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.