nginx
Infrastructure · C
Nginx with a custom C handler module, compiled with -O3 -march=native. The module answers /baseline11, /baseline2 and /json/{count}, serializing the JSON body per request from the dataset parsed at worker startup; /static/* is served by nginx core's sendfile path. TLS via quictls: HTTP/1.1 on :8081, h2 and h3 on :8443.
Achievements
🥇 4 Gold · 🥈 6 Silver. Top three of a field, taken in this entry's own league: the family composite, the same composite among entries written in the same language, and each test profile it is scored on. Every field is the one the badges publish, so a medal and a badge always say the same thing. How medals are awarded.
| Medal | Award | Field | Rank |
|---|---|---|---|
| 🥇 Gold | Family composite | Composite · HTTP/1.1 | 1 of 5 |
| 🥇 Gold | Within its language | C · HTTP/1.1 | 1 of 4 |
| 🥇 Gold | Test profile | HTTP/2 · Static | 1 of 4 |
| 🥇 Gold | Test profile | Workload · JSON TLS | 1 of 3 |
| 🥈 Silver | Family composite | Composite · HTTP/2 | 2 of 4 |
| 🥈 Silver | Within its language | C · HTTP/2 | 2 of 3 |
| 🥈 Silver | Test profile | Connection · Baseline | 2 of 5 |
| 🥈 Silver | Test profile | Connection · Pipelined | 2 of 5 |
| 🥈 Silver | Test profile | Connection · Short-lived | 2 of 5 |
| 🥈 Silver | Test profile | HTTP/2 · Baseline | 2 of 4 |
Composite rank
Each profile of a family is worth 100 to the entry that leads it, and the composite is the sum over the family, less 2.5% for each of routing, middleware, request and response the entry does not do for you - its completeness factor, which the WebSocket and gRPC families do not carry. The field is this entry's own league: engines and reverse proxies are scored apart from frameworks. How it works.
| Family | Rank | Composite |
|---|---|---|
| HTTP/1.1 | 1 of 5 | 4710 |
| HTTP/2 | 2 of 4 | 1212 |
| HTTP/3 | 1 of 2 | 2000 |
Every result
Alpha Round, 16 runs. Requests per second is the best of three; latency, CPU and memory come from that run.
| Category | Profile | Conns | Req/sec | Avg | p99 | CPU | Memory |
|---|---|---|---|---|---|---|---|
| Connection | Baseline | 4,096 | 3,284,513 | 1.25ms | 6.79ms | 6443.8% | 3.5GiB |
| Connection | Pipelined | 4,096 | 4,037,345 | 16.23ms | 35.90ms | 6388.7% | 3.5GiB |
| Connection | Short-lived | 4,096 | 2,626,297 | 1.53ms | 7.65ms | 6233.0% | 3.5GiB |
| Workload | JSON TLS | 4,096 | 1,313,755 | 3.28ms | 52.31ms | 6423.2% | 3.6GiB |
| Workload | Static TLS | 1,024 | 720,869 | 1.88ms | 29.93ms | 6603.6% | 3.5GiB |
| HTTP/2 | Baseline | 256 | 3,414,750 | 6.46ms | 46.53ms | 6485.1% | 3.5GiB |
| HTTP/2 | Baseline | 1,024 | 3,320,285 | 26.99ms | 151.79ms | 6399.1% | 3.6GiB |
| HTTP/2 | Static | 256 | 802,090 | 10.57ms | 76.31ms | 6600.9% | 3.6GiB |
| HTTP/2 | Static | 1,024 | 796,607 | 39.69ms | 279.54ms | 6350.2% | 3.8GiB |
| HTTP/2 | Baseline (h2c) | 256 | 2,456,329 | 11.02ms | 70.14ms | 6601.1% | 3.5GiB |
| HTTP/2 | Baseline (h2c) | 1,024 | 2,490,271 | 39.34ms | 200.30ms | 6614.6% | 3.6GiB |
| HTTP/2 | Baseline (h2c) | 4,096 | 2,519,351 | 144.83ms | 579.78ms | 6500.5% | 3.7GiB |
| HTTP/2 | JSON (h2c) | 1,024 | 1,730,838 | 18.45ms | 173.19ms | 6569.9% | 3.5GiB |
| HTTP/2 | JSON (h2c) | 4,096 | 1,691,740 | 73.74ms | 396.79ms | 6582.9% | 3.7GiB |
| HTTP/3 | Baseline | 64 | 4,849,624 | 833us | 1.49ms | 3066.8% | 3.5GiB |
| HTTP/3 | Static | 64 | 361,025 | 12.42ms | 46.60ms | 4957.1% | 3.7GiB |
Compared with
The C entries around nginx on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs nginx | |
|---|---|---|---|
| h2o | 3936 | -16% | head to head |
| libreactorng | 3828 | -19% | head to head |
Compare nginx with any C entry · Compare nginx with any entry, in any language · Every C entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry