ktor-kronos
Experimental · Kotlin · engine: io_uring · standard configuration · completeness 4/4
ktor-kronos — JetBrains Ktor with the kron engine (ktor-server-kron, in the MDA2AV/ktor fork) instead of CIO, on Kotlin/Native or on the JVM: the Dockerfile's KRONOS_RUNTIME build arg picks, the JVM at present. kron is the Kotlin port of the ioxide io_uring runtime: one reactor per core, each pinned to its CPU and owning its ring and its share of the SO_REUSEPORT listeners; multishot accept and recv into provided buffer rings, driven from Kotlin over the kernel's own io_uring header (no liburing): natively one binary, on the JVM the same code reaching the kernel and BoringSSL through the FFM API, as a jar on JDK 25. Requests are parsed by Glyph11, the hardened HTTP/1.1 parser, and run through Ktor's own pipeline - routing, plugins, call.receive and call.respond - on the reactor that accepted the connection, with no thread pool in between. Responses to pipelined requests leave in one send. delay() is an IORING_OP_TIMEOUT on the reactor's ring, so a held connection in the async profile costs a kernel deadline rather than a timer thread. WebSockets are Ktor's own, over the upgraded connection. The routes are the ktor entry's, answered the same way; only the engine and the platform differ. The engine passes Ktor's own engine suites (HttpServerCommonTestSuite, WebSocketEngineSuite). TLS on :8081 is the engine's own connector on kron's BoringSSL, the kernel encrypting the records (kTLS TX) where it has the tls module. JSON is Ktor's ContentNegotiation with kotlinx.serialization, gzipped by Ktor's own Compression plugin on the JVM; json-comp needs the JVM runtime, as Ktor has no gzip on Kotlin/Native.
Achievements
🥈 1 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 |
|---|---|---|---|
| 🥈 Silver | Within its language | Kotlin · HTTP/1.1 | 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 | 10 of 20 | 5581 |
| WebSocket | 14 of 15 | 1009 |
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,281,035 | 1.25ms | 1.89ms | 6330.5% | 11.9GiB |
| Connection | Pipelined | 4,096 | 14,541,568 | 4.51ms | 8.56ms | 6316.6% | 14.3GiB |
| Connection | Short-lived | 4,096 | 2,570,242 | 1.48ms | 3.00ms | 6011.0% | 12.2GiB |
| Concurrency | Async Delay | 32,000 | 1,723,447 | 18.42ms | 118.10ms | 6232.6% | 36.3GiB |
| Efficiency | Latency-10K | 1,024 | 9,980 | 90.6us | 116.0us | 37.6% | 2.4GiB |
| Efficiency | Latency-1M | 1,024 | 997,808 | 102.3us | 178.0us | 2691.6% | 11.8GiB |
| Workload | JSON Comp | 4,096 | 236,085 | 17.29ms | 51.20ms | 5604.3% | 16.4GiB |
| Workload | JSON Comp | 16,384 | 243,933 | 65.83ms | 123.20ms | 5802.4% | 25.7GiB |
| Workload | JSON TLS | 4,096 | 975,645 | 4.17ms | 36.96ms | 6416.2% | 12.2GiB |
| Workload | 8Gbit | 512 | 49,255 | 113.1us | 146.0us | 239.5% | 4.3GiB |
| WebSocket | Echo | 512 | 3,199,050 | 159us | 337us | 6063.8% | 22.8GiB |
| WebSocket | Echo | 4,096 | 3,046,019 | 1.34ms | 1.93ms | 6246.3% | 23.6GiB |
| WebSocket | Echo | 16,384 | 1,678,940 | 9.57ms | 13.70ms | 4841.2% | 18.5GiB |
| WebSocket | Echo Pipelined | 512 | 28,903,942 | 282us | 585us | 6653.5% | 12.1GiB |
| WebSocket | Echo Pipelined | 4,096 | 25,131,027 | 2.61ms | 3.18ms | 6347.9% | 33.2GiB |
| WebSocket | Echo Pipelined | 16,384 | 18,787,984 | 13.84ms | 14.60ms | 6065.9% | 34.9GiB |
Compared with
The Kotlin entries around ktor-kronos on the HTTP/1.1 composite, and the one leading them. The last column shows every profile side by side.
| Entry | Composite | vs ktor-kronos | |
|---|---|---|---|
| ktron | 7557 | +35% | head to head |
| edixoi-kt | 6803 | +22% | head to head |
| kron | 6443 | +15% | head to head |
| genhttp-kt-netty | 5539 | -1% | head to head |
| genhttp-kt | 3783 | -32% | head to head |
Compare ktor-kronos with any Kotlin entry · Compare ktor-kronos with any entry, in any language · Every Kotlin entry, ranked
Results updated · How the benchmark is run · The machine · Add or fix an entry