Skip to content

Epic: Meet the Phase 3 targets #1147

Open
0 of 6 issues completed
Open

Description

@tamirms

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)
Loading

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

No one assigned

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions