RWS Scalability Benchmark Report

Historical comparison generated from 9 raw result files, with a separate memory stability follow-up.

RWS memory stability follow-up

A separate cold-start test measured 11.11 MiB RSS after 20 million static keep-alive requests. This is a stability measurement under different conditions, not a direct memory comparison with Nginx or Apache. Read the full memory stability report.

Scope and validity

Requested and achieved connection counts are kept separate. Server metrics are collected independently from load-generator measurements. A warning means the corresponding result must not be treated as an unconstrained capacity claim.

Environment and method

Test date27 October 2026
Target94.237.44.223 — Ubuntu Linux 7.0.0-38, 1 AMD EPYC 9575F vCPU, approximately 1.8 GiB RAM
ServersRWS 0.1.0 on port 80; Nginx 1.28.3 on port 18081; Apache 2.4.66 with mpm_event on port 18082
Load generatorUbuntu under WSL, 24 logical CPUs, fd limit 10,000
Workload1,000 HTTP/1.1 keep-alive connections; 10% active; 10,000 offered requests/s; 15 seconds; three repetitions per server
ObjectByte-identical 77-byte robots.txt with matching Content-Type, Content-Length and X-Content-Type-Options
RoutingEvery measured run used external TCP port 80. Temporary source-IP-restricted NAT redirected Nginx and Apache to their internal benchmark ports and was removed after each run.

The offered rate capped RWS and Nginx near 10,000 RPS, so this experiment compares behavior at that load and does not establish either server's maximum throughput.

Individual runs

LabelTargetRequestedOpenedActiveOffered RPSAchieved RPSp50p95p99MaxErrors
rwshttp://94.237.44.223/robots.txt1000100010.000%100009949.805.70 ms6.89 ms7.59 ms40.09 ms0
rwshttp://94.237.44.223/robots.txt1000100010.000%100009951.475.25 ms6.32 ms7.10 ms37.92 ms0
rwshttp://94.237.44.223/robots.txt1000100010.000%100009943.675.33 ms6.33 ms7.02 ms40.86 ms0
nginxhttp://94.237.44.223/robots.txt1000100010.000%100009916.605.77 ms7.07 ms8.19 ms36.00 ms0
nginxhttp://94.237.44.223/robots.txt1000100010.000%100009929.335.59 ms7.12 ms8.23 ms29.47 ms0
nginxhttp://94.237.44.223/robots.txt1000100010.000%100009910.405.69 ms6.82 ms8.09 ms59.62 ms0
apachehttp://94.237.44.223/robots.txt1000100010.000%100003087.605.25 ms7.24 ms9.52 ms42.37 ms75
apachehttp://94.237.44.223/robots.txt1000100010.000%100002723.675.57 ms7.05 ms9.07 ms33.02 ms86
apachehttp://94.237.44.223/robots.txt1000100010.000%100001270.735.07 ms6.16 ms10.05 ms46.40 ms89

Server resources from the original comparison

These are historical per-run measurements from the comparison above; the separate 20-million-request follow-up is not included in this table.

LabelSamplesCPU medianRSS maxPSS maxFDs maxEstablished maxTCP memory pages
rws1620.00%254.63 MiB252.56 MiB1014100017
rws1620.00%254.66 MiB252.58 MiB1014100017
rws1620.00%254.69 MiB252.61 MiB1014100017
nginx1630.00%11.91 MiB4.90 MiB1021100017
nginx1630.00%11.91 MiB4.88 MiB1021100017
nginx1630.00%11.91 MiB4.88 MiB1022100017
apache1630.00%93.62 MiB42.81 MiB99975617
apache1120.00%96.78 MiB45.95 MiB1039567273
apache1610.00%95.08 MiB44.26 MiB100356017

Comparison

Aggregation: median repeated runs.

VariantRunsOpenedAchieved RPSp50p95p99Failed responses
apache310002723.675.25 ms7.05 ms9.52 ms86
nginx310009916.605.69 ms7.07 ms8.19 ms0
rws310009949.805.33 ms6.33 ms7.10 ms0

Relative to apache

Interpretation

Warnings and deterministic analysis

apache: Achieved response rate was below 90% of the configured offered rate; inspect load-generator saturation and errors before attributing the result to the server.

apache: achieved throughput is below 90% of offered load; the result is saturation or generator-limited, not an unconstrained throughput figure.

apache: socket errors occurred; successful-request latency alone is not representative.

apache: Achieved response rate was below 90% of the configured offered rate; inspect load-generator saturation and errors before attributing the result to the server.

apache: achieved throughput is below 90% of offered load; the result is saturation or generator-limited, not an unconstrained throughput figure.

apache: socket errors occurred; successful-request latency alone is not representative.

apache: Achieved response rate was below 90% of the configured offered rate; inspect load-generator saturation and errors before attributing the result to the server.

apache: achieved throughput is below 90% of offered load; the result is saturation or generator-limited, not an unconstrained throughput figure.

apache: socket errors occurred; successful-request latency alone is not representative.

Charts

RWSNginxApache

Throughput by repetition

Achieved responses per second; offered ceiling was 10,000.

Median latency profile

Lower is better; failed responses are excluded from percentiles.

Resident memory

RWS: 11.11 MiB after 20 million requests in a separate cold-start test. Nginx and Apache: historical median peak RSS. Different workloads; values are not directly comparable. Memory test details.

Failed responses by repetition

Connection closure or timeout after a connection became usable.

Raw data

The source JSON retains settings, categorized errors, resource samples and mergeable HDR-style latency buckets. No AI or external API is used for calculations.