Repository navigation
Description
RPC v2 has to meet the newest Phase 3 targets, which the leads set on 2026-10-21. They are recorded in stellar-experimental/stellar-rpc-benchmarks docs/targets.json.
A ledger closes every 900 ms. It carries up to 9,000 SAC transfers, 5,400 OZ token transfers or 2,700 Soroswap swaps. A client has to get its transaction's result within 2,000 ms at p99, split like this:
sequenceDiagram
participant Client
participant RPC
participant Core
Client->>+RPC: send tx · 25 ms (network)
RPC->>+Core: submit tx
Core->>RPC: response · 10 ms p99 (RPC)
deactivate RPC
RPC-->>Client: submit ack, not counted because core is already working
Note over Core: externalize + emit meta<br/>1,800 ms p99 (Core)
Core->>-RPC: meta stream
activate RPC
Note over RPC: ingest · 105 ms p99 (RPC)
deactivate RPC
Client->>+RPC: getTransaction · 50 ms round trip (network)
RPC->>-Client: result · 10 ms p99 (RPC)
In total, 25 + 10 + 1,800 + 105 + 50 + 10 = 2,000 ms. The network times assume a 50 ms round trip. The response to sendTransaction isn't counted, because core is already working on the transaction by then. Core owns the 1,800 ms. RPC owns three parts:
- Ingesting each ledger: 105 ms at p99.
- Handling sendTransaction: 10 ms at p99.
- Handling getTransaction: 10 ms at p99, while serving 1,000 requests per second for SAC ledgers, 600 for OZ token and 300 for Soroswap.
Each read endpoint also has its own SLA, in docs/sla-derivation.md. For getTransaction it is 20 ms at p99 on hot data, which isn't frozen yet, and 30 ms on cold data, at 300 requests per second.
Where we are
The last benchmark campaign ran on 2026-10-23. It tested commit c772750, from the pending PRs for the GA release (#1087 up to #1126). Among other things, those PRs stop hot ingestion from holding events in memory, which fixed the out-of-memory failures that stopped earlier runs. It ran once, on a c6id.8xlarge with local NVMe, over 10,000 sac-9000 ledgers at one every 900 ms, with diagnostic events still in the ledgers.
- Hot ingestion took 227.6 ms per ledger at p99 (163.0 ms at p50), against the 105 ms target.
- At 1,000 requests per second, getTransaction took 847 ms at p99 on hot data and 932 ms on cold data, against the 10 ms target.
- At 300 requests per second, getTransaction took 42.9 ms at p99 on hot data and 46.5 ms on cold data, against the SLA's 20 ms and 30 ms.
Sub-issues
In priority order:
| Issue | What it covers | Target |
|---|---|---|
| #1148 | The hot ingestion changes in draft PRs #1139 to #1146 | Ingest p99 |
| #1149 | A proposal to store and serve ledgers without diagnostic events | Ingest p99 |
| #1150 | Agreeing with core on the LedgerCloseMeta V3 layout | Ingest p99 and getTransaction p99 |
| #1151 | getTransaction reading only part of a large ledger, on LCM V3 | getTransaction p99 |
| #870 | Benchmarking reads, ingestion, the freeze and the tx-hash index rebuild together on one machine | Both targets, measured at the same time |
| #1152 | Stress ledgers that look like real traffic at Phase 3 density | Measurements that hold up on real traffic |
| #1153 | Running stellar-core on its own machine and streaming ledgers to RPC | Ingest p99, with core's load off the RPC machine |
Related
#905 and #906 are the proofs of concept behind #1151 and #1153.
🤖 Generated with Claude Code
Metadata
Metadata
Assignees
Type
Projects
- StatusShow more project fieldsIn Progress
Activity