Historical comparison generated from 9 raw result files, with a separate 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.
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.
| Test date | 27 October 2026 |
|---|---|
| Target | 94.237.44.223 — Ubuntu Linux 7.0.0-38, 1 AMD EPYC 9575F vCPU, approximately 1.8 GiB RAM |
| Servers | RWS 0.1.0 on port 80; Nginx 1.28.3 on port 18081; Apache 2.4.66 with mpm_event on port 18082 |
| Load generator | Ubuntu under WSL, 24 logical CPUs, fd limit 10,000 |
| Workload | 1,000 HTTP/1.1 keep-alive connections; 10% active; 10,000 offered requests/s; 15 seconds; three repetitions per server |
| Object | Byte-identical 77-byte robots.txt with matching Content-Type, Content-Length and X-Content-Type-Options |
| Routing | Every 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.
| Label | Target | Requested | Opened | Active | Offered RPS | Achieved RPS | p50 | p95 | p99 | Max | Errors |
|---|---|---|---|---|---|---|---|---|---|---|---|
| rws | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9949.80 | 5.70 ms | 6.89 ms | 7.59 ms | 40.09 ms | 0 |
| rws | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9951.47 | 5.25 ms | 6.32 ms | 7.10 ms | 37.92 ms | 0 |
| rws | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9943.67 | 5.33 ms | 6.33 ms | 7.02 ms | 40.86 ms | 0 |
| nginx | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9916.60 | 5.77 ms | 7.07 ms | 8.19 ms | 36.00 ms | 0 |
| nginx | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9929.33 | 5.59 ms | 7.12 ms | 8.23 ms | 29.47 ms | 0 |
| nginx | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 9910.40 | 5.69 ms | 6.82 ms | 8.09 ms | 59.62 ms | 0 |
| apache | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 3087.60 | 5.25 ms | 7.24 ms | 9.52 ms | 42.37 ms | 75 |
| apache | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 2723.67 | 5.57 ms | 7.05 ms | 9.07 ms | 33.02 ms | 86 |
| apache | http://94.237.44.223/robots.txt | 1000 | 1000 | 10.000% | 10000 | 1270.73 | 5.07 ms | 6.16 ms | 10.05 ms | 46.40 ms | 89 |
These are historical per-run measurements from the comparison above; the separate 20-million-request follow-up is not included in this table.
| Label | Samples | CPU median | RSS max | PSS max | FDs max | Established max | TCP memory pages |
|---|---|---|---|---|---|---|---|
| rws | 16 | 20.00% | 254.63 MiB | 252.56 MiB | 1014 | 1000 | 17 |
| rws | 16 | 20.00% | 254.66 MiB | 252.58 MiB | 1014 | 1000 | 17 |
| rws | 16 | 20.00% | 254.69 MiB | 252.61 MiB | 1014 | 1000 | 17 |
| nginx | 16 | 30.00% | 11.91 MiB | 4.90 MiB | 1021 | 1000 | 17 |
| nginx | 16 | 30.00% | 11.91 MiB | 4.88 MiB | 1021 | 1000 | 17 |
| nginx | 16 | 30.00% | 11.91 MiB | 4.88 MiB | 1022 | 1000 | 17 |
| apache | 16 | 30.00% | 93.62 MiB | 42.81 MiB | 999 | 756 | 17 |
| apache | 11 | 20.00% | 96.78 MiB | 45.95 MiB | 1039 | 567 | 273 |
| apache | 16 | 10.00% | 95.08 MiB | 44.26 MiB | 1003 | 560 | 17 |
Aggregation: median repeated runs.
| Variant | Runs | Opened | Achieved RPS | p50 | p95 | p99 | Failed responses |
|---|---|---|---|---|---|---|---|
| apache | 3 | 1000 | 2723.67 | 5.25 ms | 7.05 ms | 9.52 ms | 86 |
| nginx | 3 | 1000 | 9916.60 | 5.69 ms | 7.07 ms | 8.19 ms | 0 |
| rws | 3 | 1000 | 9949.80 | 5.33 ms | 6.33 ms | 7.10 ms | 0 |
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.
Achieved responses per second; offered ceiling was 10,000.
Lower is better; failed responses are excluded from percentiles.
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.
Connection closure or timeout after a connection became usable.
The source JSON retains settings, categorized errors, resource samples and mergeable HDR-style latency buckets. No AI or external API is used for calculations.