rustle against gost
Same machines, same rules, one core each. rustle is first in 41 of 41 tests of the campaign; 41 of them run on both proxies, with the conditions next to every number.
12×
more requests per second at 1 KB
55,258 against 4,755 req/s
12×
less CPU per request
18.1 against 210.0 µs/req
34×
less memory with 25,000 open tunnels
95 against 3,228 MB
1 core per proxy · authentication on · Scaleway Elastic Metal, Paris, AMD EPYC 8224P · 25 Gbit/s private network (23.5 measured) · median of 3 runs · seed 2004113323 · campaign of 2026-10-28.
The short version
rustle had the better value in 41 of the 41 tests where both it and gost ran. gost was not ahead in any of them. Every value is a median of 3 runs, with the exact figures in the tables below.
What each one supports
| Protocol | rustle | gost |
|---|---|---|
| HTTP proxy and CONNECT tunnels | Yes | Yes |
| HTTPS proxy port (TLS) | Yes | Yes |
| HTTP/2 to clients | Yes | Yes |
| WebSocket upgrades | Yes | Yes |
As built and configured in the campaign, see “How gost was run” below.
Test by test
Best clean concurrency level of each proxy. The last column is the ratio of rustle’s figure to gost’s: how many times more or less. For memory and CPU, less is better.
Plain HTTP proxy port
| Test | rustle | gost | Ratio |
|---|---|---|---|
| HTTP, 1 KB responsesreq/s | 55,258 | 4,755 | 12× more |
| HTTP, 10 KB responsesreq/s | 40,783 | 4,436 | 9.2× more |
| HTTP, 1 KB responses, a new connection per requestreq/s | 27,827 | 4,780 | 5.8× more |
| HTTP, 1 MB responsesreq/s | 2,624 | 1,046 | 2.5× more |
| HTTP, 10 MB responsesreq/s | 268 | 145 | 1.9× more |
| CONNECT tunnels, bulk transferGbit/s | 22.0 | 13.2 | 1.7× more |
| CPU cost per request (1 KB)µs/req | 18.1 | 210.0 | 12× less |
| Memory with 1,000 open tunnelsMB | 14 | 161 | 12× less |
| Memory with 5,000 open tunnelsMB | 40 | 653 | 16× less |
| Memory with 10,000 open tunnelsMB | 54 | 1,243 | 23× less |
| Memory with 25,000 open tunnelsMB | 95 | 3,228 | 34× less |
HTTPS proxy (resumed TLS sessions)
| Test | rustle | gost | Ratio |
|---|---|---|---|
| HTTP, 1 KB responsesreq/s | 49,461 | 2,528 | 20× more |
| HTTP, 10 KB responsesreq/s | 35,460 | 2,433 | 15× more |
| HTTP, 1 KB responses, a new connection per requestreq/s | 6,119 | 2,516 | 2.4× more |
| HTTP, 1 MB responsesreq/s | 1,297 | 615 | 2.1× more |
| HTTP, 10 MB responsesreq/s | 142 | 83 | 1.7× more |
| CONNECT tunnels, bulk transferGbit/s | 12.0 | 7.1 | 1.7× more |
| Memory with 1,000 open tunnelsMB | 57 | 240 | 4.2× less |
| Memory with 5,000 open tunnelsMB | 253 | 903 | 3.6× less |
| Memory with 10,000 open tunnelsMB | 466 | 2,110 | 4.5× less |
| Memory with 25,000 open tunnelsMB | 810 | 4,094 | 5.1× less |
HTTPS proxy, full handshake on every connection
| Test | rustle | gost | Ratio |
|---|---|---|---|
| HTTP, 1 KB responses, a new connection per request, full handshakereq/s | 5,458 | 2,246 | 2.4× more |
HTTP/2 over TLS
| Test | rustle | gost | Ratio |
|---|---|---|---|
| HTTP, 1 KB responsesreq/s | 33,451 | 5,231 | 6.4× more |
| HTTP, 10 KB responsesreq/s | 24,789 | 4,732 | 5.2× more |
| HTTP, 1 KB responses, a new connection per requestreq/s | 4,974 | 2,187 | 2.3× more |
| HTTP, 1 MB responsesreq/s | 860 | 447 | 1.9× more |
| HTTP, 10 MB responsesreq/s | 88 | 50 | 1.7× more |
| CONNECT tunnels, bulk transferGbit/s | 8.8 | 7.8 | 1.1× more |
| Memory with 1,000 open tunnelsMB | 70 | 225 | 3.2× less |
| Memory with 5,000 open tunnelsMB | 330 | 1,245 | 3.8× less |
| Memory with 10,000 open tunnelsMB | 705 | 2,639 | 3.7× less |
| Memory with 25,000 open tunnelsMB | 1,263 | 5,884 | 4.7× less |
WebSocket, plain
| Test | rustle | gost | Ratio |
|---|---|---|---|
| WebSocket, 64-byte messagesmsg/s | 58,506 | 46,808 | 1.2× more |
| WebSocket round trip, 64-byte messages (p99)ms | 1.3 | 2.6 | 2.0× less |
| CPU cost per WebSocket messageµs/msg | 17.1 | 21.4 | 1.3× less |
| WebSocket, 64 KB messagesGbit/s | 11.6 | 6.9 | 1.7× more |
| WebSocket, one connection per exchangemsg/s | 10,740 | 3,726 | 2.9× more |
WebSocket over TLS
| Test | rustle | gost | Ratio |
|---|---|---|---|
| WebSocket, 64-byte messagesmsg/s | 56,955 | 44,426 | 1.3× more |
| WebSocket round trip, 64-byte messages (p99)ms | 1.3 | 2.7 | 2.1× less |
| WebSocket, 64 KB messagesGbit/s | 5.8 | 3.8 | 1.5× more |
| WebSocket, one connection per exchangemsg/s | 4,462 | 2,190 | 2.0× more |
These are the figures of one campaign, on one kind of traffic. What the numbers do not show, multi-core results and the other proxies
How gost was run
gost 3.3.0
official image
- GOGC=400
- logger level error (GOST_LOGGER_LEVEL=error)
- Go sizes GOMAXPROCS from the cpuset
What the campaign showed
- Reopens an upstream connection for almost every proxied request (its HTTP handler disables keep-alive by default).
- HTTP/2 is a dedicated listener, not ALPN on the TLS port.
- Gives the same 2.5k req/s over TLS with or without keep-alive: its overhead is per request, not per connection.
Found a setting that makes gost faster? Open an issue on the proxy repository: the campaign is built to be re-run.
Try rustle
Open source, fast, optimized, safe.