Site icon Chainstack

Solana RPC on Chainstack in 2026: higher limits, GPA and more

Solana RPC on Chainstack in 2026: higher limits, GPA improvements and more

If you tried Chainstack for Solana earlier and moved on, it was probably for one of three reasons:

We spent the last few months on exactly those problems. This is the story of what we changed, why, and the numbers that came out of it.

One number sums it up: median getLatestBlockhash latency in Chainstack Cloud Frankfurt dropped from about 17 ms to about 2 ms once we moved Solana to our new architecture.

TL;DR

Why we rebuilt our Solana infrastructure

Solana is hard on shared infrastructure. A handful of heavy methods can starve everything else on the same node, so adding more nodes of the same kind never fixed the real problem.

When we traced it, the cause was not capacity, it was contention. On an RPC node, an expensive indexed scan can hold the account-index lock, which stalls the index’s own updates, and tie up the node’s RPC worker threads so every other request queues behind it. We watched getTokenAccountsByOwner sit at an 18-second weighted-mean response time, with p99 pegged at the 30-second mark, while basic methods on the very same node answered in 20–40 ms. A customer’s trading system marked the endpoint unhealthy after 5 seconds and failed all traffic over to another provider.

That finding shaped everything below. The goal was simple: make Solana stable first, then raise the limits safely.

What changed: 8 key improvements for Solana

1. Solana is fully on GEN 2.0: latency from tens of milliseconds to about 2 ms

Solana Mainnet Global Nodes now run entirely on GEN 2.0, our new Global Node architecture. Every region that serves Solana RPC is on the new stack, and all Solana traffic is served on the new path.

The old stack sent your request through an edge proxy layer before it reached the node, and that layer alone added about 15 ms in Frankfurt. GEN 2.0 removes it: DNS sends your request to the nearest healthy region, and it goes straight to our load balancer, where method-aware routing (see below) picks the right pool. The Frankfurt median came out about 9x lower. Other regions vary. The Frankfurt figures come from the public Solana RPC latency monitor; the Chainstack Compare dashboard shows a blended view across methods. Both also show tail latency (p95 and p99), which is spikier than the median and still varies by region.

getLatestBlockhash latency for Chainstack on the public Solana RPC dashboard (solana.com/data), Frankfurt, around the GEN 2.0 switch.
getLatestBlockhash latency on Chainstack nodes around the GEN 2.0 switch.

2. Method-aware routing: getSupply from 2 to 300 RPS

Capacity used to scale per node. A cheap call like getBlockTime and a heavy one like getSupply shared the same pool, so the heavy method set the ceiling for everything.

We split Solana into separate node pools and send each method to the pool that fits it:

A burst of heavy scans now slows your light calls much less. In our tests, light methods kept answering in tens of milliseconds while scans were busy.

Isolation also let us raise per-method limits we could never touch before, because a heavy method can no longer take the whole node down with it. We removed the per-region overrides too, so the limits are the same in every region.

Per-method RPS limits on Solana Mainnet Global Nodes, before and now.

The biggest jump is on the heaviest method: getSupply went from 2 to 300 RPS. These are per-method limits on Solana Mainnet Global Nodes, and your plan’s overall RPS limit still applies on top.

3. getProgramAccounts: rebuilt indexes and a cache that learns

getProgramAccounts failed most often, so it got the most work. We rebuilt the account indexes in-house and preload them at node startup, then layered a cache on top that we improved in three stages.

p95 latency for getProgramAccounts on the public Chainstack Grafana dashboard, measured from the EU probe, from September 28 to October 12, 2026. The chart shows Chainstack; the image also shows a comparison table across providers for the same period.

A few rules worth knowing:

4. getProgramAccounts: limits by program size

A program with a handful of accounts and a program with hundreds of millions used to be treated the same. Limits are now set per program by size, and requests with filters get a higher limit than requests without. Every size bucket used to be clamped to 1 RPS. Here is the before and after.

Program size (accounts)With filters (before → now)Without filters (before → now)
Under 10K1 → 20 RPS1 → 10 RPS
10K–30K1 → 15 RPS1 → 5 RPS
30K–60K1 → 15 RPS1 → 3 RPS
60K–200K1 → 15 RPS1 → 2 RPS
200K–500K1 → 10 RPS1 → 2 RPS
500K–1M1 → 5 RPS1 → 2 RPS
1M and more1 RPS → 3 requests per 20 seconds1 RPS → 2 requests per 20 seconds

Large programs are now limited more tightly than before, and we would rather say that than hide it: a single scan of a program with a million or more accounts can occupy a node. Cached programs have their own, higher per-program limits.

5. Scans that abort in 60 seconds instead of hanging

The scan methods now run under a 60-second execution limit and a per-request memory limit. The limits are enforced inside the node itself, with our own patches on top of Agave, so a scan stops at the source instead of being cut off by a proxy in front of it.

Before turning this on, we checked two weeks of real traffic. Successful scans that take longer than 60 seconds were under 0.01% of all scan requests, and almost all longer scans were already failing on the client side. The limit turns a multi-minute hang into a fast, clear error.

What happens to a scan request on Solana Mainnet Global Nodes: a queue wait of up to 15 seconds, a run of up to 60 seconds with a memory limit, and error -32012 instead of a hang.

6. Newer client, new hardware, faster heavy reads

Solana Mainnet Global Nodes now run Agave v4.3.0, tuned for RPC load: thread pools sized per node role, larger account caches and, on the scan pool, an account index that is preloaded at startup.

We also moved part of our Frankfurt, New York and Singapore capacity to new bare-metal servers (latest-generation CPUs, much more memory and faster networking) with striped NVMe storage, and began retiring the weakest clusters.

The preloaded index had the biggest effect on heavy reads. These are p95 figures from our own measurements at the time of the rollout:

Methodp95 beforep95 after
getProgramAccounts25–60 secondsunder 2 seconds
getTokenAccountsByOwnerup to 2 minutesabout 1 second

Some very large scans, for example scans of large programs filtered only by dataSize, can still take seconds. Narrow them with memcmp filters.

7. A steadier shred feed: gaps down from 12–17% to 3–5%

Shreds are the pieces of a block that arrive through Solana’s block-distribution network. When a piece never arrives, the node has to repair or reconstruct it, which burns CPU and delays the block reaching your requests. A dedicated shred feed fills those gaps.

We moved to a new dedicated shred feed across five clusters, with no node restarts and no customer impact. The share of block data the node had to rebuild itself dropped on every cluster.

ClusterGap beforeGap after
Chainstack Cloud London12.20%3.73%
Chainstack Cloud Frankfurt 116.65%5.36%
Chainstack Cloud Frankfurt 212.27%4.49%
Chainstack Cloud New York13.73%3.31%
Chainstack Cloud Singapore11.62%4.39%
Share of block data the node had to rebuild itself, per cluster, before and after we moved to a new dedicated shred feed.

For an outside view, look at block lag on our public Grafana dashboards for the EU, US West and Asia probes. From September 28 to October 12, Chainstack nodes were at the chain tip (block lag under 3 slots) 95% of the time when measured from the EU, 61% from Asia (Singapore) and 57% from US West. Chainstack ranked second in every region, behind one provider and far ahead of the other three. These are probe measurements, so treat them as indicative. The measurement covers the whole stack, so it does not isolate the shred feed, but it shows how current the data is when your request arrives.

Block lag by provider on the public Chainstack Grafana dashboard, measured from the EU probe, September 28 to October 12, 2026. Green means under 3 slots behind the chain tip.

8. Yellowstone gRPC: 2, 7, and 25 concurrent streams

If Yellowstone gRPC limits pushed you away, the plans now include more concurrent streams:

Yellowstone add-on tierStreams beforeStreams now
$49 per month12
$149 per month57
$449 per month2525 (unchanged)

Here is why this matters. Some gRPC clients update their filters by tearing down a subscription and opening a new one every few minutes. At a one-stream limit, there is no room to hold the old stream open while the new one comes up, so the reconnect drops data. Two concurrent streams give that overlap. The higher tiers are for workloads that track many programs and accounts across more parallel streams.

Stream events are unlimited on all three tiers, and Yellowstone is available on Solana Mainnet from the Growth plan.

A client that briefly disconnects can also catch up: on Global Nodes, from_slot replays roughly the last 100 slots from a server-side buffer. It is a recovery tool, not a historical backfill. Dedicated Nodes can be configured with a deeper buffer.

What is still ahead

We are indexing the next group of heavier methods so their limits can rise too, and we are continuing to improve Yellowstone streaming. We will publish those changes the same way, with the numbers.

Get started with Solana on Chainstack

Start free: the Developer plan includes 3M Request Units a month, and it is the quickest way to try Solana on Chainstack. To rerun the heavy scans and streams that failed for you, you need a paid plan, because getProgramAccounts, getSupply, getTokenAccountsByOwner and Yellowstone gRPC are not on Developer.

Use the promo code FASTSOLANA at checkout to get 50% off the Growth plan for 3 months.

Solana Mainnet is limited to 5 RPS on the Developer plan and 50 RPS on Growth. If you need steady throughput without watching Request Units, the Unlimited Node add-on is a flat monthly fee tied to an RPS tier, available from the Growth plan.

FAQ

What are the rate limits for Solana on Chainstack?

They are set per method on Solana Mainnet Global Nodes, for example 500 RPS for getBlockTime, 400 for getBlock and 300 for getMultipleAccounts. getProgramAccounts depends on program size. Your plan limit also applies: 5 RPS on Developer and 50 RPS on Growth for Solana Mainnet. Requests over a limit return HTTP 429 with error -32005, and a getProgramAccounts request to a program with no assigned size tier is limited to 2 RPS.

Why did my getProgramAccounts request return error -32012?

One of three things happened: the scan ran longer than 60 seconds, it used more memory than the per-request limit, or it waited more than 15 seconds for a free scan slot. Narrow the query with dataSize or memcmp filters. If the request was dropped from the queue, retry with exponential backoff.

Can I use getProgramAccounts on the SPL Token Program?

Not directly. The Token Program is excluded from indexing and returns error -32010, and unfiltered requests to large programs such as Token-2022 are rejected with error -32602. Use getTokenAccountsByOwner to read token balances.

Is getProgramAccounts at processed commitment cached?

No. Cached responses are served at confirmed and finalized. Processed requests always go to a node and count against the size-tier limits.

How many Yellowstone gRPC streams can I run?

The $49 per month plan includes 2 concurrent streams, the $149 per month plan includes 7 and the $449 per month plan includes 25. Stream events are unlimited, and Yellowstone is available from the Growth plan on Solana Mainnet.

How do I recover missed events after a Yellowstone disconnect?

Reconnect with from_slot set to the last slot you processed. Global Nodes keep about the last 100 slots, under a minute. For older data, use getBlock, getSignaturesForAddress or getTransaction.

Is there a free way to test the changes?

Yes. The Developer plan is free and includes 3M Request Units a month. These require a paid plan: Yellowstone gRPC, getProgramAccounts, getSupply, getTokenAccountsByOwner and the Unlimited Node add-on.

Additional resources

Exit mobile version