From 313c4fa1720a0019c87083d3523b6643606c5aa6 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Sun, 27 Sep 2026 19:11:45 +0100 Subject: Record the small reads and idle memory work, next to axum and drogon (087) What the app model, snapshot reads and delivery had cost small reads (126.7k -> 116.1k GETs a second) and idle memory (2.0 -> 4.5 MiB), how the sampler found it, and the four steps and the crypto split that took it back: 139.9k and 2.3 MiB. Measured again today beside axum 0.8.9 and drogon 1.9.0 on the same Pi: a one-thread pure-serve answers small GETs at 139k/s (2.2x axum and drogon a CPU second), 1 MiB GETs at 2,362/s (axum 1,304, drogon 754), durable app writes at 21.3k/s (both about 200), with the least idle memory of the three. --- CHECKPOINT.md | 2 +- README.md | 4 +- docs/research/087-small-reads-and-idle-memory.md | 120 +++++++++++++++++++++ .../2026-09-27-pi5-sd-app.jsonl | 108 +++++++++++++++++++ .../2026-09-27-pi5-sd-reads.jsonl | 36 +++++++ research/experiments/011-http-frameworks/README.md | 3 + 6 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 docs/research/087-small-reads-and-idle-memory.md create mode 100644 research/experiments/011-http-frameworks/2026-09-27-pi5-sd-app.jsonl create mode 100644 research/experiments/011-http-frameworks/2026-09-27-pi5-sd-reads.jsonl diff --git a/CHECKPOINT.md b/CHECKPOINT.md index 3c948f6..6aaf810 100644 --- a/CHECKPOINT.md +++ b/CHECKPOINT.md @@ -16,7 +16,7 @@ | 영속 | 선언한 상태가 곧 영속 상태다. 트리 저장소에 커밋당 동기화 한 번(헤드를 바이트 바로 앞에 두어 한 연속 구간), 이벤트 묶음마다 저장 한 번. `kill -9` 뒤 확인 응답한 이벤트가 모두 남는다. 레코드·키가 바뀐 모듈로 바꿔도 데이터가 이름으로 옮겨진다 | [076](docs/research/076-one-sync-commit.md), [081](docs/research/081-tail-records.md), 008 상태 영속·교체 | | 인터페이스 | 한 명세가 TUI(셀 단위 갱신), CLI, 문장(NUI), 웹 GUI가 된다. 저장하면 실행 중인 앱이 상태를 이어 새 모듈로 바뀐다(`aup watch`, `vega … --watch`) | Vega `docs/design/001-first-component.md`, Vega `make check`(가상 터미널, 헤드리스 Chromium 포함) | | HTTP 서비스 | 보기가 GET, 입력이 POST다(JSON 본문과 그 안의 그룹 객체를 제자리에서 읽는다, 라우터 코드 없음). 앱의 `send`는 이벤트와 함께 저장되고, `--send 출력=URL`로 다른 앱이나 HTTP 끝점에 순서대로 묶어 전해지며, 받는 앱은 번호마다 한 번 적용한다(서버를 죽였다 살려도 정확히 한 번). `--seal 출력=공개키`면 받는 노드의 키로 봉인해(HPKE) 사이의 중계가 읽지도 바꾸지도 못한다(봉인 전달 233k/s, 봉인 없이 470k/s). 답은 저장 뒤에 나간다. 상태를 가진 앱은 소유자 스레드 하나가 입력을 적용하고, 연결 스레드는 마지막 저장의 스냅숏으로 보기를 답한다(쓰기가 동기화하는 동안에도 읽기는 기다리지 않는다) | 008 HTTP 호스트, [077](docs/research/077-apps-as-http-services.md), [080](docs/research/080-snapshot-reads.md), [082](docs/research/082-json-in-place.md), [083](docs/research/083-delivery-over-http.md), [086](docs/research/086-sealed-sends.md) | -| 성능(Pi 5) | 문서 서버: 작은 GET 151.6k/s, 1 MiB GET 2,794/s(axum 1,372, drogon 708), 충돌 안전 PUT은 axum-atomic의 5.1–5.8배. 앱 서비스(aup 22줄 대 손으로 쓴 서비스): 내구성 있는 쓰기 약 76배(그 뒤 저장소 커밋을 한 구간으로 바꿔 64연결 21–26k/s, axum·drogon 내구 약 180/s), 20행 JSON GET 145k/s(axum 95k, drogon 144k), 쓰기와 섞인 읽기 149k/s·p99 0.6 ms(axum·drogon 내구 1.1–1.3k/s·p99 111–156 ms), 최대 RSS 3.0–4.1 MiB(axum 6.4, drogon 11.6) | [075](docs/research/075-http-host-against-axum.md), [077](docs/research/077-apps-as-http-services.md), [080](docs/research/080-snapshot-reads.md), [081](docs/research/081-tail-records.md) | +| 성능(Pi 5) | 2026-09-27, 같은 기기에서 axum·drogon과 함께 쟀다. 문서 서버(한 스레드): 64 B GET 139k/s(CPU 1초당 140k; axum 127k·63k, drogon 147k·63k), 1 MiB GET 2,362/s(axum 1,304, drogon 754), 충돌 안전 PUT은 axum-atomic의 5.1–5.8배. 앱 서비스: 내구성 있는 쓰기 64연결 21.3k/s(axum·drogon 내구 약 200/s), 합계 GET 126k/s·두 스레드 153k(axum 136k, drogon 151k), 20행 페이지 두 스레드 148k(axum 93k, drogon 138k), 쓰기와 섞인 읽기 119k/s(axum·drogon 내구 1.1–1.4k/s). 유휴 RSS 2.3 MiB(axum 2.8, drogon 10.9), 최대 3.2–5.8 MiB(axum 6.6–9.7, drogon 11.9–78.8) | [075](docs/research/075-http-host-against-axum.md), [077](docs/research/077-apps-as-http-services.md), [080](docs/research/080-snapshot-reads.md), [081](docs/research/081-tail-records.md), [087](docs/research/087-small-reads-and-idle-memory.md) | 키로 나눈 소유자와 저장을 넘길 스레드는 하지 않기로 했다. 이 장치는 동기화를 한 줄로 세워, 나누면 쓰기가 23% 줄고 넘겨도 기기의 일은 줄지 않는다([084](docs/research/084-parallel-syncs.md)). 대신 압축한 파일이 한 주기의 0을 미리 가져 커밋이 새 diff --git a/README.md b/README.md index 9762cc9..4aa46ba 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ batches, and a receiving app applies each message once; sealed to the receiver's them can read or change it. Measurements against axum and drogon on a Raspberry Pi 5 are in [075](docs/research/075-http-host-against-axum.md), [077](docs/research/077-apps-as-http-services.md), [080](docs/research/080-snapshot-reads.md), [081](docs/research/081-tail-records.md), -[082](docs/research/082-json-in-place.md), [083](docs/research/083-delivery-over-http.md) and -[086](docs/research/086-sealed-sends.md); the status table is +[082](docs/research/082-json-in-place.md), [083](docs/research/083-delivery-over-http.md), +[086](docs/research/086-sealed-sends.md) and [087](docs/research/087-small-reads-and-idle-memory.md); the status table is [CHECKPOINT.md](CHECKPOINT.md). The source follows the principle below, a small core with the rest selected around it diff --git a/docs/research/087-small-reads-and-idle-memory.md b/docs/research/087-small-reads-and-idle-memory.md new file mode 100644 index 0000000..4cb861c --- /dev/null +++ b/docs/research/087-small-reads-and-idle-memory.md @@ -0,0 +1,120 @@ +# 087 — 작은 읽기와 유휴 메모리: 기능이 쌓이며 늘어난 비용을 되돌리기 + +2026-09-27. 봉인한 전달([086](086-sealed-sends.md))이 요청 경로에 비용을 더하지 않는지 A/B로 재다가, 두 빌드의 절대값이 모두 +기록(2026-09-26, `156e1ad`의 [011 결과](../../research/experiments/011-http-frameworks/2026-09-26-pi5-sd.jsonl))보다 +낮은 것을 보고 추적한 것. + +착수 기준: + +- 바꿀 결정: 앱 모델, 스냅숏 읽기, 전달이 붙는 동안 작은 GET이 느려지고 유휴 메모리가 는 것을 그 기능들의 값으로 받아들일지, + 원인을 찾아 되돌릴지. +- 최소 확인: 같은 기기에서 옛 빌드와 번갈아 재서 차이가 잡음 밖인지 본다. 원인은 프로파일로 가린다. 고친 것마다 따로 잰다. +- 중단 기준: 고친 것이 다른 작업(1 MiB 읽기, 내구 쓰기, 앱 읽기)을 잡음 밖으로 나쁘게 하면 되돌린다. + +## 차이 + +64 B 문서 GET, 64연결 keep-alive, 한 스레드(`benchmarks/http/run.py`, 서버 CPU 0–2, 부하 CPU 3): + +| | GET/s | 유휴 RSS | 최대 RSS | +|---|---:|---:|---:| +| `156e1ad` (09-26) | 126.7k | 2,040 KiB | 2,560 KiB | +| `04a8510` (086) | 116.1k | 4,488 KiB | 5,136 KiB | + +한 커밋의 일이 아니었다. 중간 빌드들은 126.7k → 122.4k(`647d4b7`) → 120.2k(`8026654`) → 118.4k(`8398a1e`) → 116.5k로, +기능이 붙을 때마다 조금씩 줄었다. 이런 것은 이분 탐색보다 지금 경로를 프로파일해서 줄이는 편이 맞다. + +## 도구 + +이 기기에는 perf가 없어서 [sample.c](../../benchmarks/sample.c)를 만들었다. 명령을 실행해 모든 스레드의 사용자 시간을 50 µs마다 +표본으로 뜬다(`perf_event_open`의 task clock). 상속되는 스레드별 이벤트에는 커널이 링을 매핑해 주지 않아서 CPU마다 이벤트를 +하나씩 연다. 표본은 매핑된 파일의 ELF 심볼 표로 이름을 붙인다. 심볼을 뺀 libc는 같은 빌드의 디버그 파일을 build id로 찾는다 +(Raspberry Pi 저장소의 `libc6-dbg`를 설치하지 않고 풀었다). arm64에서는 링크 레지스터도 받는다. 그래서 공유 라이브러리의 말단 +함수(memcpy, strcmp)에 쓴 시간을 부른 함수별로 다시 볼 수 있다. + +같은 부하 5초 동안 전은 사용자 1.34 s·시스템 3.65 s, 뒤는 1.77 s·3.22 s였다. 요청당 사용자 시간이 2.2 µs에서 3.2 µs로 +늘었고, 그 1 µs가 차이였다. 나눠 보면 이렇다. + +- **한 버스트에 같은 키가 두 번 들지 않게 하는 검사**가 두 층에 있었고 둘 다 선형이었다. 앱은 대기 중인 키를 strcmp로 훑었고, + 호스트는 요청마다 앞선 요청들을 같은 방식으로 훑었다. 읽기도 이 검사를 거친다. 64연결이면 요청마다 약 31번, 두 번씩이다. + `execute`와 `message`, 그 안의 strcmp를 합쳐 사용자 시간의 약 10%였다. +- **시계**: 연결의 기한을 읽기와 쓰기마다 `clock_gettime`으로 새로 셌고, 이벤트마다 벽시계를 다시 읽었다. 요청마다 4–5번, + 5.7%였다. +- **응답 머리의 printf**: `snprintf` 세 번의 형식 해석이 사용자 시간의 약 16%였다(`__printf_buffer`, `strchrnul`, + `_itoa_word`). 이것은 libc에 이름이 붙기 전에는 이름 없는 libc 시간 28%에 묻혀 있었다. +- **답한 뒤의 recv**: 연결은 답한 뒤 다음 요청을 읽으러 recv를 불렀고 거의 매번 EAGAIN을 받았다. 요청마다 실패하는 시스템 + 호출이 하나였다. strace로는 보이지 않는다. strace가 서버를 느리게 해서 다음 요청이 이미 와 있기 때문이다. + +## 고친 것 + +| | 64 B GET/s | p50 | p99 | +|---|---:|---:|---:| +| `156e1ad` (09-26) | 127.0k | 480 µs | 576 µs | +| 전 (`04a8510`) | 116.1k | 512 µs | 672 µs | +| + 버스트의 키를 한 번에 찾기 (`93faf3a`) | 121.8k | 496 µs | 640 µs | +| + 시계를 한 라운드에 한 번 (`fbbf6f6`) | 124.1k | 496 µs | 640 µs | +| + printf 없는 응답 머리 (`8f82c27`) | 131.9k | 464 µs | 576 µs | +| + 짧게 읽으면 멈추기 (`242343e`) | **139.9k** | **448 µs** | **512 µs** | + +여섯 빌드를 라운드마다 순서를 돌려 다섯 라운드씩 잰 중앙값이다. + +- **키 색인.** 앱이 대기 중인 문서를 키로 색인한다(FNV-1a 해시의 열린 주소법, 1 KiB). `pure_app_pending`이 한 번에 답하고 + 호스트는 그것을 묻는다. 현재 이벤트의 문서가 대기 중인지는 포인터로 훑는 대신 플래그로 안다. 버스트는 전과 같은 곳에서 + 나뉜다. 다만 읽기를 먼저 적용하는 소유자에서 같은 라운드에 읽은 키를 고치면, 앱이 혼자 저장하던 곳에서 이제 호스트가 버스트를 + 나눈다. 단위 검사가 200개 키에서 색인을 확인한다. +- **시계.** 연결 스레드는 `epoll_wait`에서 돌아올 때마다 단조 시계를 한 번 읽고, 기한은 그것에서 센다(기본 10초, 1초마다 + 점검한다). 한 라운드의 이벤트는 라운드가 시작한 시각을 함께 쓴다. +- **응답 머리.** 부분마다 제자리에 쓴다. 바이트는 전과 같다. 버퍼 끝에서 잘리므로, `snprintf`가 돌려주던 "썼을 길이"로 버퍼 + 밖을 보낼 수 있던 틈도 없어졌다. +- **짧은 읽기.** 요청한 것보다 적게 읽었으면 소켓이 빈 것이다. 엣지 트리거 epoll이 다음 바이트가 오면 알려 준다(epoll(7), + nginx도 이렇게 한다). 그래서 EAGAIN을 받으러 가지 않는다. 상대가 제 쪽을 닫았으면 전처럼 끝까지 읽는다. + +**다른 작업.** 마지막 빌드와 전을 번갈아 세 라운드씩 쟀다. 앱의 합계 GET은 111.5k → 125.4k/s, 20행 페이지는 86.2k → 94.3k, +쓰기와 섞인 읽기는 109.1k → 121.7k다. 1 MiB 읽기는 같다. 단계마다 여섯 라운드씩 잰 중앙값이 2,668–2,716/s이고 라운드 범위가 +±15%다. 내구 쓰기도 같다. 점수 8연결은 3,974 → 4,035/s, 섞인 쓰기는 2,955 → 3,115/s다. 연결마다 닫는 GET도 23.2k → 23.5k로 +같다. + +## 유휴 메모리 + +유휴 RSS의 절반은 OpenSSL이었다. 아무 일도 하지 않는 프로그램에 `-lssl -lcrypto`를 링크만 해도 RSS가 0.98 → 3.28 MiB가 되고, +그 프로세스만의 더티 페이지가 656 KiB 는다(라이브러리의 재배치한 데이터). 그런데 대부분의 서버는 https 수신자에 닿지도 않고 +봉인하지도 않는다. + +OpenSSL을 쓰는 코드(TLS 클라이언트, 봉인)를 `pure-crypto.so`로 따로 빌드했다(`serve/crypto-openssl.c`, 함수 표 하나를 +내보낸다). pure-serve는 https URL의 전달선을 열거나, 키를 읽거나, 봉인을 연결할 때 처음 실행 파일 옆의 그것을 연다 +(`serve/crypto.c`). 없으면 시작할 때 알린다. OpenSSL이 필요 없는 것(키의 hex, 이 CPU가 봉인할 스위트)은 pure-serve에 남았다. + +| 유휴 pure-serve | RSS | PSS | 자기만의 더티 | +|---|---:|---:|---:| +| OpenSSL을 링크(전) | 4,496 kB | 1,639 kB | 1,296 kB | +| OpenSSL을 정적으로 링크 | 3,840 kB | 2,292 kB | 2,272 kB | +| 쓸 때만 매핑(지금) | **2,320 kB** | **881 kB** | **864 kB** | + +정적 링크는 RSS만 조금 줄인다. 자기만의 메모리는 오히려 두 배가 된다. OpenSSL의 표를 모두 재배치하기 때문이다(바이너리는 +7.9 MB). 봉인이나 TLS를 쓰는 서버는 전처럼 OpenSSL을 매핑한다. + +## axum·drogon 옆에서 + +같은 기기에서 `a8d6b1b`를 axum 0.8.9, drogon 1.9.0과 다시 쟀다(세 라운드, 서버 순서를 돌린다; [읽기](../../research/experiments/011-http-frameworks/2026-09-27-pi5-sd-reads.jsonl), +[앱](../../research/experiments/011-http-frameworks/2026-09-27-pi5-sd-app.jsonl)). pure-serve는 한 스레드, `-2`·`-3`은 연결 +스레드 수다. axum과 drogon은 코어 셋을 모두 쓴다. + +| | pure-serve | pure-serve-2/3 | axum | drogon | +|---|---:|---:|---:|---:| +| 64 B GET, keep-alive (/s, CPU 1초당) | 139.3k, 139.7k | 150.5k, 99.2k | 127.0k, 62.6k | 146.7k, 62.6k | +| 64 B GET, 연결마다 닫기 | 23.2k | 23.3k | 22.2k | 21.2k | +| 1 MiB GET | **2,362** | 1,851 | 1,304 | 754 | +| 앱 합계 GET | 125.7k | **153.2k** | 136.0k | 150.5k | +| 앱 20행 페이지 | 93.5k | **147.6k** | 92.9k | 138.4k | +| 내구 쓰기 64연결 | **21.3k** | 21.9k | 203 | 199 | +| 내구 쓰기와 섞인 읽기 | 119.3k | 144.6k | 1,363 | 1,125 | +| 유휴 RSS | **2,320 KiB** | 2,752–3,152 KiB | 2,768 KiB | 10,912 KiB | +| 최대 RSS(문서, 앱) | 5,760, 3,152 KiB | 7,440, 3,824 KiB | 9,696, 6,608 KiB | 78,816, 11,920 KiB | + +axum과 drogon의 앱 읽기는 메모리 판(내구 쓰기 없음)의 값이다. 한 스레드의 pure-serve가 CPU 1초당 axum과 drogon의 2.2배를 +답하고, 유휴 메모리는 셋 중 가장 작다. + +## 다음 + +- 이제 CPU의 72%가 커널이다(루프백 TCP, 요청마다 recv와 writev). 연결마다 요청이 하나씩이라 응답을 모아 쓸 여지가 작다. +- 사용자 시간의 나머지: 저장소 조회(카탈로그와 문서 트리) 약 23%, 요청 머리 해석 약 15%, 요청마다의 할당(드래프트, 익스텐트 + 배열) 약 8%. diff --git a/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-app.jsonl b/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-app.jsonl new file mode 100644 index 0000000..68d609c --- /dev/null +++ b/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-app.jsonl @@ -0,0 +1,108 @@ +{"requests_per_second": 23074, "completed": 69249, "2xx": 69249, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2048, "p99_us": 20480, "max_us": 63488, "server": "pure-serve", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 0.97, "rss_kib": 3104, "cpu_seconds": 0.75, "ok_per_cpu_second": 92332, "ok_per_second": 23083, "idle_rss_kib": 2384} +{"requests_per_second": 3437, "completed": 10313, "2xx": 10313, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 21504, "max_us": 81920, "server": "pure-serve", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 1.23, "rss_kib": 3088, "cpu_seconds": 0.24, "ok_per_cpu_second": 42971, "ok_per_second": 3438, "idle_rss_kib": 2384} +{"requests_per_second": 126776, "completed": 380331, "2xx": 380331, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 480, "p99_us": 576, "max_us": 1984, "server": "pure-serve", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 3104, "cpu_seconds": 3.01, "ok_per_cpu_second": 126356, "ok_per_second": 126777, "idle_rss_kib": 2384} +{"requests_per_second": 93477, "completed": 280433, "2xx": 280433, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 608, "p99_us": 928, "max_us": 2048, "server": "pure-serve", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 3152, "cpu_seconds": 2.99, "ok_per_cpu_second": 93790, "ok_per_second": 93478, "idle_rss_kib": 2384} +{"requests_per_second": 2798, "completed": 8396, "2xx": 8396, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2048, "p99_us": 17408, "max_us": 61440, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 1.2, "rss_kib": 3136, "cpu_seconds": 3.12, "ok_per_cpu_second": 117420, "ok_per_second": 2799, "idle_rss_kib": 2384} +{"requests_per_second": 119318, "completed": 357955, "2xx": 357955, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 672, "max_us": 1728, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 1.2, "rss_kib": 3136, "cpu_seconds": 3.12, "ok_per_cpu_second": 117420, "ok_per_second": 119318, "idle_rss_kib": 2384} +{"requests_per_second": 22739, "completed": 68262, "2xx": 68262, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1984, "p99_us": 15360, "max_us": 77824, "server": "pure-serve-2", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 0.96, "rss_kib": 3520, "cpu_seconds": 0.95, "ok_per_cpu_second": 71855, "ok_per_second": 22754, "idle_rss_kib": 2768} +{"requests_per_second": 3331, "completed": 10174, "2xx": 10174, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 20480, "max_us": 81920, "server": "pure-serve-2", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 1.35, "rss_kib": 3504, "cpu_seconds": 0.34, "ok_per_cpu_second": 29924, "ok_per_second": 3391, "idle_rss_kib": 2768} +{"requests_per_second": 153188, "completed": 459577, "2xx": 459577, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 608, "max_us": 4352, "server": "pure-serve-2", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 3568, "cpu_seconds": 4.46, "ok_per_cpu_second": 103044, "ok_per_second": 153192, "idle_rss_kib": 2768} +{"requests_per_second": 147026, "completed": 441100, "2xx": 441100, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 640, "max_us": 4352, "server": "pure-serve-2", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 3632, "cpu_seconds": 5.4, "ok_per_cpu_second": 81685, "ok_per_second": 147033, "idle_rss_kib": 2768} +{"requests_per_second": 647, "completed": 1987, "2xx": 1987, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 12800, "max_us": 57344, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 1.39, "rss_kib": 3824, "cpu_seconds": 4.47, "ok_per_cpu_second": 103311, "ok_per_second": 662, "idle_rss_kib": 2768} +{"requests_per_second": 153264, "completed": 459812, "2xx": 459812, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 336, "p99_us": 544, "max_us": 1984, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 1.39, "rss_kib": 3824, "cpu_seconds": 4.47, "ok_per_cpu_second": 103311, "ok_per_second": 153271, "idle_rss_kib": 2768} +{"requests_per_second": 134163, "completed": 402490, "2xx": 402490, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 896, "max_us": 14848, "server": "axum-memory", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 1.16, "rss_kib": 5008, "cpu_seconds": 7.33, "ok_per_cpu_second": 54910, "ok_per_second": 134163, "idle_rss_kib": 2784} +{"requests_per_second": 140944, "completed": 422833, "2xx": 422833, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 58, "p99_us": 104, "max_us": 1600, "server": "axum-memory", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 1.35, "rss_kib": 5008, "cpu_seconds": 7.2, "ok_per_cpu_second": 58727, "ok_per_second": 140944, "idle_rss_kib": 2784} +{"requests_per_second": 136801, "completed": 410402, "2xx": 410402, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 736, "max_us": 4608, "server": "axum-memory", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 5104, "cpu_seconds": 6.03, "ok_per_cpu_second": 68060, "ok_per_second": 136801, "idle_rss_kib": 2784} +{"requests_per_second": 92935, "completed": 278805, "2xx": 278805, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 640, "p99_us": 1216, "max_us": 9216, "server": "axum-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 5520, "cpu_seconds": 5.43, "ok_per_cpu_second": 51345, "ok_per_second": 92935, "idle_rss_kib": 2784} +{"requests_per_second": 52296, "completed": 156962, "2xx": 156962, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 58, "p99_us": 3968, "max_us": 8192, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 1.14, "rss_kib": 5520, "cpu_seconds": 6.46, "ok_per_cpu_second": 63195, "ok_per_second": 52321, "idle_rss_kib": 2784} +{"requests_per_second": 83757, "completed": 251277, "2xx": 251277, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 5888, "max_us": 8192, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 1.14, "rss_kib": 5520, "cpu_seconds": 6.46, "ok_per_cpu_second": 63195, "ok_per_second": 83759, "idle_rss_kib": 2784} +{"requests_per_second": 209, "completed": 636, "2xx": 636, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 311296, "p99_us": 327680, "max_us": 327680, "server": "axum-durable", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 1.2, "rss_kib": 4960, "cpu_seconds": 0.05, "ok_per_cpu_second": 12720, "ok_per_second": 212, "idle_rss_kib": 2656} +{"requests_per_second": 213, "completed": 640, "2xx": 640, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 86016, "max_us": 94208, "server": "axum-durable", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 1.23, "rss_kib": 4960, "cpu_seconds": 0.07, "ok_per_cpu_second": 9143, "ok_per_second": 213, "idle_rss_kib": 2656} +{"requests_per_second": 131138, "completed": 393413, "2xx": 393413, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 960, "max_us": 4608, "server": "axum-durable", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 6288, "cpu_seconds": 5.86, "ok_per_cpu_second": 67135, "ok_per_second": 131138, "idle_rss_kib": 2656} +{"requests_per_second": 89397, "completed": 268192, "2xx": 268192, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 640, "p99_us": 1472, "max_us": 5888, "server": "axum-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 6240, "cpu_seconds": 5.29, "ok_per_cpu_second": 50698, "ok_per_second": 89397, "idle_rss_kib": 2656} +{"requests_per_second": 212, "completed": 637, "2xx": 637, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 90112, "max_us": 98304, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 0.96, "rss_kib": 6144, "cpu_seconds": 0.16, "ok_per_cpu_second": 31637, "ok_per_second": 212, "idle_rss_kib": 2656} +{"requests_per_second": 1475, "completed": 4425, "2xx": 4425, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 94208, "max_us": 94208, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 0.96, "rss_kib": 6144, "cpu_seconds": 0.16, "ok_per_cpu_second": 31637, "ok_per_second": 1475, "idle_rss_kib": 2656} +{"requests_per_second": 141347, "completed": 424044, "2xx": 424044, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 1856, "max_us": 8192, "server": "drogon-memory", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 1.03, "rss_kib": 11664, "cpu_seconds": 6.5, "ok_per_cpu_second": 65238, "ok_per_second": 141348, "idle_rss_kib": 10944} +{"requests_per_second": 141254, "completed": 423765, "2xx": 423765, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 58, "p99_us": 72, "max_us": 3584, "server": "drogon-memory", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 1.35, "rss_kib": 11664, "cpu_seconds": 6.74, "ok_per_cpu_second": 62873, "ok_per_second": 141255, "idle_rss_kib": 10944} +{"requests_per_second": 150290, "completed": 450877, "2xx": 450877, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 800, "max_us": 8192, "server": "drogon-memory", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 11744, "cpu_seconds": 6.64, "ok_per_cpu_second": 67903, "ok_per_second": 150292, "idle_rss_kib": 10944} +{"requests_per_second": 133808, "completed": 401423, "2xx": 401423, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 1664, "max_us": 8704, "server": "drogon-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 11792, "cpu_seconds": 7.76, "ok_per_cpu_second": 51730, "ok_per_second": 133808, "idle_rss_kib": 10944} +{"requests_per_second": 65965, "completed": 197988, "2xx": 197988, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 56, "p99_us": 3968, "max_us": 8192, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 1.31, "rss_kib": 11856, "cpu_seconds": 6.36, "ok_per_cpu_second": 65239, "ok_per_second": 65996, "idle_rss_kib": 10944} +{"requests_per_second": 72310, "completed": 216933, "2xx": 216933, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 336, "p99_us": 4864, "max_us": 11264, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 1.31, "rss_kib": 11856, "cpu_seconds": 6.36, "ok_per_cpu_second": 65239, "ok_per_second": 72311, "idle_rss_kib": 10944} +{"requests_per_second": 208, "completed": 624, "2xx": 624, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 262144, "p99_us": 1376256, "max_us": 2752512, "server": "drogon-durable", "workload": "score, 64 conn, keep-alive", "round": 0, "probe_ms": 0.96, "rss_kib": 11648, "cpu_seconds": 0.05, "ok_per_cpu_second": 12480, "ok_per_second": 208, "idle_rss_kib": 10944} +{"requests_per_second": 197, "completed": 591, "2xx": 591, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 24576, "p99_us": 229376, "max_us": 360448, "server": "drogon-durable", "workload": "score, 8 conn, keep-alive", "round": 0, "probe_ms": 2.69, "rss_kib": 11648, "cpu_seconds": 0.05, "ok_per_cpu_second": 11820, "ok_per_second": 197, "idle_rss_kib": 10944} +{"requests_per_second": 145982, "completed": 437975, "2xx": 437975, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 832, "max_us": 34816, "server": "drogon-durable", "workload": "total, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 11760, "cpu_seconds": 6.62, "ok_per_cpu_second": 66159, "ok_per_second": 145992, "idle_rss_kib": 10944} +{"requests_per_second": 137822, "completed": 413491, "2xx": 413491, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 416, "p99_us": 1472, "max_us": 5376, "server": "drogon-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 11808, "cpu_seconds": 7.96, "ok_per_cpu_second": 51946, "ok_per_second": 137830, "idle_rss_kib": 10944} +{"requests_per_second": 212, "completed": 636, "2xx": 636, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 94208, "max_us": 102400, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 0, "probe_ms": 2.34, "rss_kib": 11872, "cpu_seconds": 0.15, "ok_per_cpu_second": 25833, "ok_per_second": 212, "idle_rss_kib": 10944} +{"requests_per_second": 1076, "completed": 3239, "2xx": 3239, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 36864, "p99_us": 344064, "max_us": 819200, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 0, "probe_ms": 2.34, "rss_kib": 11872, "cpu_seconds": 0.15, "ok_per_cpu_second": 25833, "ok_per_second": 1080, "idle_rss_kib": 10944} +{"requests_per_second": 21862, "completed": 65586, "2xx": 65586, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2176, "p99_us": 19456, "max_us": 77824, "server": "pure-serve-2", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 1.25, "rss_kib": 3520, "cpu_seconds": 1.15, "ok_per_cpu_second": 57031, "ok_per_second": 21862, "idle_rss_kib": 2752} +{"requests_per_second": 3737, "completed": 11214, "2xx": 11214, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 11264, "max_us": 59392, "server": "pure-serve-2", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 1.4, "rss_kib": 3520, "cpu_seconds": 0.41, "ok_per_cpu_second": 27351, "ok_per_second": 3738, "idle_rss_kib": 2752} +{"requests_per_second": 154229, "completed": 462701, "2xx": 462701, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 608, "max_us": 4608, "server": "pure-serve-2", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 3568, "cpu_seconds": 4.35, "ok_per_cpu_second": 106368, "ok_per_second": 154234, "idle_rss_kib": 2752} +{"requests_per_second": 147618, "completed": 442858, "2xx": 442858, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 672, "max_us": 7168, "server": "pure-serve-2", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 3664, "cpu_seconds": 5.31, "ok_per_cpu_second": 83401, "ok_per_second": 147619, "idle_rss_kib": 2752} +{"requests_per_second": 2798, "completed": 8397, "2xx": 8397, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1792, "p99_us": 23552, "max_us": 147456, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 0.96, "rss_kib": 3648, "cpu_seconds": 4.43, "ok_per_cpu_second": 99736, "ok_per_second": 2799, "idle_rss_kib": 2752} +{"requests_per_second": 144471, "completed": 433432, "2xx": 433432, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 352, "p99_us": 640, "max_us": 5632, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 0.96, "rss_kib": 3648, "cpu_seconds": 4.43, "ok_per_cpu_second": 99736, "ok_per_second": 144477, "idle_rss_kib": 2752} +{"requests_per_second": 134171, "completed": 402513, "2xx": 402513, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 768, "max_us": 23552, "server": "axum-memory", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 0.96, "rss_kib": 5152, "cpu_seconds": 7.39, "ok_per_cpu_second": 54467, "ok_per_second": 134171, "idle_rss_kib": 2784} +{"requests_per_second": 137851, "completed": 413555, "2xx": 413555, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 58, "p99_us": 112, "max_us": 3456, "server": "axum-memory", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 0.97, "rss_kib": 5088, "cpu_seconds": 7.03, "ok_per_cpu_second": 58827, "ok_per_second": 137852, "idle_rss_kib": 2784} +{"requests_per_second": 136044, "completed": 408133, "2xx": 408133, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 768, "max_us": 5376, "server": "axum-memory", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 5360, "cpu_seconds": 6.0, "ok_per_cpu_second": 68022, "ok_per_second": 136044, "idle_rss_kib": 2784} +{"requests_per_second": 95434, "completed": 286302, "2xx": 286302, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 640, "p99_us": 992, "max_us": 2432, "server": "axum-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 5760, "cpu_seconds": 5.54, "ok_per_cpu_second": 51679, "ok_per_second": 95434, "idle_rss_kib": 2784} +{"requests_per_second": 36748, "completed": 110245, "2xx": 110245, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 60, "p99_us": 3200, "max_us": 8192, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 1.2, "rss_kib": 5760, "cpu_seconds": 5.6, "ok_per_cpu_second": 63988, "ok_per_second": 36748, "idle_rss_kib": 2784} +{"requests_per_second": 82695, "completed": 248090, "2xx": 248090, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 496, "p99_us": 5376, "max_us": 9216, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 1.2, "rss_kib": 5760, "cpu_seconds": 5.6, "ok_per_cpu_second": 63988, "ok_per_second": 82697, "idle_rss_kib": 2784} +{"requests_per_second": 202, "completed": 608, "2xx": 608, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 311296, "p99_us": 344064, "max_us": 360448, "server": "axum-durable", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 0.95, "rss_kib": 4896, "cpu_seconds": 0.06, "ok_per_cpu_second": 10133, "ok_per_second": 203, "idle_rss_kib": 2768} +{"requests_per_second": 207, "completed": 622, "2xx": 622, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 31744, "p99_us": 94208, "max_us": 98304, "server": "axum-durable", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 1.23, "rss_kib": 4928, "cpu_seconds": 0.06, "ok_per_cpu_second": 10367, "ok_per_second": 207, "idle_rss_kib": 2768} +{"requests_per_second": 134710, "completed": 404133, "2xx": 404133, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 736, "max_us": 2944, "server": "axum-durable", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 5648, "cpu_seconds": 6.04, "ok_per_cpu_second": 66909, "ok_per_second": 134711, "idle_rss_kib": 2768} +{"requests_per_second": 91894, "completed": 275682, "2xx": 275682, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 640, "p99_us": 1216, "max_us": 2944, "server": "axum-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 5968, "cpu_seconds": 5.43, "ok_per_cpu_second": 50770, "ok_per_second": 91894, "idle_rss_kib": 2768} +{"requests_per_second": 191, "completed": 572, "2xx": 572, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 34816, "p99_us": 110592, "max_us": 126976, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 1.33, "rss_kib": 6384, "cpu_seconds": 0.15, "ok_per_cpu_second": 31080, "ok_per_second": 191, "idle_rss_kib": 2768} +{"requests_per_second": 1362, "completed": 4090, "2xx": 4090, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 110592, "max_us": 110592, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 1.33, "rss_kib": 6384, "cpu_seconds": 0.15, "ok_per_cpu_second": 31080, "ok_per_second": 1363, "idle_rss_kib": 2768} +{"requests_per_second": 148201, "completed": 444606, "2xx": 444606, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 736, "max_us": 16384, "server": "drogon-memory", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 1.36, "rss_kib": 11648, "cpu_seconds": 6.63, "ok_per_cpu_second": 67060, "ok_per_second": 148202, "idle_rss_kib": 10944} +{"requests_per_second": 111786, "completed": 335358, "2xx": 335358, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 76, "p99_us": 160, "max_us": 1600, "server": "drogon-memory", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 1.36, "rss_kib": 11648, "cpu_seconds": 4.88, "ok_per_cpu_second": 68721, "ok_per_second": 111786, "idle_rss_kib": 10944} +{"requests_per_second": 150896, "completed": 452697, "2xx": 452697, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 640, "max_us": 5120, "server": "drogon-memory", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 11744, "cpu_seconds": 6.55, "ok_per_cpu_second": 69114, "ok_per_second": 150899, "idle_rss_kib": 10944} +{"requests_per_second": 144261, "completed": 432811, "2xx": 432811, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 832, "max_us": 6912, "server": "drogon-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 11808, "cpu_seconds": 8.18, "ok_per_cpu_second": 52911, "ok_per_second": 144270, "idle_rss_kib": 10944} +{"requests_per_second": 65916, "completed": 197750, "2xx": 197750, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 46, "p99_us": 3968, "max_us": 8192, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 0.96, "rss_kib": 11920, "cpu_seconds": 6.27, "ok_per_cpu_second": 66665, "ok_per_second": 65917, "idle_rss_kib": 10944} +{"requests_per_second": 73412, "completed": 220237, "2xx": 220237, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 336, "p99_us": 4864, "max_us": 12288, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 0.96, "rss_kib": 11920, "cpu_seconds": 6.27, "ok_per_cpu_second": 66665, "ok_per_second": 73412, "idle_rss_kib": 10944} +{"requests_per_second": 199, "completed": 598, "2xx": 598, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 262144, "p99_us": 1114112, "max_us": 2490368, "server": "drogon-durable", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 1.03, "rss_kib": 11616, "cpu_seconds": 0.04, "ok_per_cpu_second": 14950, "ok_per_second": 199, "idle_rss_kib": 10928} +{"requests_per_second": 190, "completed": 581, "2xx": 581, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 23552, "p99_us": 245760, "max_us": 425984, "server": "drogon-durable", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 2.44, "rss_kib": 11632, "cpu_seconds": 0.06, "ok_per_cpu_second": 9683, "ok_per_second": 194, "idle_rss_kib": 10928} +{"requests_per_second": 147519, "completed": 442561, "2xx": 442561, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 704, "max_us": 34816, "server": "drogon-durable", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 11696, "cpu_seconds": 6.54, "ok_per_cpu_second": 67670, "ok_per_second": 147520, "idle_rss_kib": 10928} +{"requests_per_second": 139265, "completed": 417819, "2xx": 417819, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 1344, "max_us": 6144, "server": "drogon-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 11776, "cpu_seconds": 7.92, "ok_per_cpu_second": 52755, "ok_per_second": 139273, "idle_rss_kib": 10928} +{"requests_per_second": 198, "completed": 595, "2xx": 595, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 110592, "max_us": 139264, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 1.14, "rss_kib": 11840, "cpu_seconds": 0.13, "ok_per_cpu_second": 30531, "ok_per_second": 198, "idle_rss_kib": 10928} +{"requests_per_second": 1125, "completed": 3374, "2xx": 3374, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 34816, "p99_us": 360448, "max_us": 819200, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 1.14, "rss_kib": 11840, "cpu_seconds": 0.13, "ok_per_cpu_second": 30531, "ok_per_second": 1125, "idle_rss_kib": 10928} +{"requests_per_second": 21277, "completed": 64001, "2xx": 64001, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2176, "p99_us": 21504, "max_us": 65536, "server": "pure-serve", "workload": "score, 64 conn, keep-alive", "round": 1, "probe_ms": 1.24, "rss_kib": 3072, "cpu_seconds": 0.85, "ok_per_cpu_second": 75295, "ok_per_second": 21334, "idle_rss_kib": 2384} +{"requests_per_second": 3531, "completed": 10601, "2xx": 10601, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 12288, "max_us": 90112, "server": "pure-serve", "workload": "score, 8 conn, keep-alive", "round": 1, "probe_ms": 1.42, "rss_kib": 3072, "cpu_seconds": 0.32, "ok_per_cpu_second": 33128, "ok_per_second": 3534, "idle_rss_kib": 2384} +{"requests_per_second": 125662, "completed": 376986, "2xx": 376986, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 480, "p99_us": 704, "max_us": 2688, "server": "pure-serve", "workload": "total, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 3088, "cpu_seconds": 3.0, "ok_per_cpu_second": 125662, "ok_per_second": 125662, "idle_rss_kib": 2384} +{"requests_per_second": 93902, "completed": 281706, "2xx": 281706, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 608, "p99_us": 864, "max_us": 2048, "server": "pure-serve", "workload": "page 20 rows, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 3136, "cpu_seconds": 3.0, "ok_per_cpu_second": 93902, "ok_per_second": 93902, "idle_rss_kib": 2384} +{"requests_per_second": 2831, "completed": 8496, "2xx": 8496, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2048, "p99_us": 10752, "max_us": 59392, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: posts", "round": 1, "probe_ms": 0.96, "rss_kib": 3152, "cpu_seconds": 3.12, "ok_per_cpu_second": 115388, "ok_per_second": 2832, "idle_rss_kib": 2384} +{"requests_per_second": 117171, "completed": 351516, "2xx": 351516, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 768, "max_us": 2816, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: reads", "round": 1, "probe_ms": 0.96, "rss_kib": 3152, "cpu_seconds": 3.12, "ok_per_cpu_second": 115388, "ok_per_second": 117172, "idle_rss_kib": 2384} +{"requests_per_second": 129068, "completed": 387205, "2xx": 387205, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 1024, "max_us": 27648, "server": "axum-memory", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 1.16, "rss_kib": 5248, "cpu_seconds": 7.03, "ok_per_cpu_second": 55079, "ok_per_second": 129068, "idle_rss_kib": 2800} +{"requests_per_second": 136683, "completed": 410049, "2xx": 410049, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 56, "p99_us": 116, "max_us": 3968, "server": "axum-memory", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 1.35, "rss_kib": 5248, "cpu_seconds": 6.88, "ok_per_cpu_second": 59600, "ok_per_second": 136683, "idle_rss_kib": 2800} +{"requests_per_second": 129558, "completed": 388675, "2xx": 388675, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 960, "max_us": 5632, "server": "axum-memory", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 5264, "cpu_seconds": 5.75, "ok_per_cpu_second": 67596, "ok_per_second": 129558, "idle_rss_kib": 2800} +{"requests_per_second": 90734, "completed": 272203, "2xx": 272203, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 672, "p99_us": 1152, "max_us": 5376, "server": "axum-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 6192, "cpu_seconds": 5.42, "ok_per_cpu_second": 50222, "ok_per_second": 90734, "idle_rss_kib": 2800} +{"requests_per_second": 41578, "completed": 124834, "2xx": 124834, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 60, "p99_us": 3456, "max_us": 8192, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.54, "rss_kib": 6192, "cpu_seconds": 6.17, "ok_per_cpu_second": 63517, "ok_per_second": 41611, "idle_rss_kib": 2800} +{"requests_per_second": 89022, "completed": 267066, "2xx": 267066, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 464, "p99_us": 5376, "max_us": 8192, "server": "axum-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.54, "rss_kib": 6192, "cpu_seconds": 6.17, "ok_per_cpu_second": 63517, "ok_per_second": 89022, "idle_rss_kib": 2800} +{"requests_per_second": 180, "completed": 540, "2xx": 540, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 327680, "p99_us": 524288, "max_us": 524288, "server": "axum-durable", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 1.41, "rss_kib": 4960, "cpu_seconds": 0.06, "ok_per_cpu_second": 9000, "ok_per_second": 180, "idle_rss_kib": 2784} +{"requests_per_second": 185, "completed": 558, "2xx": 558, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 34816, "p99_us": 94208, "max_us": 106496, "server": "axum-durable", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 0.96, "rss_kib": 5088, "cpu_seconds": 0.05, "ok_per_cpu_second": 11160, "ok_per_second": 186, "idle_rss_kib": 2784} +{"requests_per_second": 134294, "completed": 402886, "2xx": 402886, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 768, "max_us": 4096, "server": "axum-durable", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 6240, "cpu_seconds": 6.02, "ok_per_cpu_second": 66925, "ok_per_second": 134295, "idle_rss_kib": 2784} +{"requests_per_second": 94301, "completed": 282903, "2xx": 282903, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 640, "p99_us": 1024, "max_us": 2560, "server": "axum-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 6272, "cpu_seconds": 5.49, "ok_per_cpu_second": 51531, "ok_per_second": 94301, "idle_rss_kib": 2784} +{"requests_per_second": 195, "completed": 584, "2xx": 584, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 34816, "p99_us": 98304, "max_us": 106496, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.35, "rss_kib": 6336, "cpu_seconds": 0.14, "ok_per_cpu_second": 33107, "ok_per_second": 195, "idle_rss_kib": 2784} +{"requests_per_second": 1350, "completed": 4051, "2xx": 4051, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 34816, "p99_us": 90112, "max_us": 90112, "server": "axum-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.35, "rss_kib": 6336, "cpu_seconds": 0.14, "ok_per_cpu_second": 33107, "ok_per_second": 1350, "idle_rss_kib": 2784} +{"requests_per_second": 132773, "completed": 398321, "2xx": 398321, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 3072, "max_us": 22528, "server": "drogon-memory", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 1.23, "rss_kib": 11648, "cpu_seconds": 6.04, "ok_per_cpu_second": 65947, "ok_per_second": 132774, "idle_rss_kib": 10944} +{"requests_per_second": 140275, "completed": 420826, "2xx": 420826, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 58, "p99_us": 76, "max_us": 4608, "server": "drogon-memory", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 0.96, "rss_kib": 11648, "cpu_seconds": 6.68, "ok_per_cpu_second": 62998, "ok_per_second": 140275, "idle_rss_kib": 10944} +{"requests_per_second": 150521, "completed": 451588, "2xx": 451588, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 736, "max_us": 6400, "server": "drogon-memory", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 11744, "cpu_seconds": 6.61, "ok_per_cpu_second": 68319, "ok_per_second": 150529, "idle_rss_kib": 10944} +{"requests_per_second": 138404, "completed": 415226, "2xx": 415226, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 1344, "max_us": 7424, "server": "drogon-memory", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 11824, "cpu_seconds": 7.93, "ok_per_cpu_second": 52361, "ok_per_second": 138409, "idle_rss_kib": 10944} +{"requests_per_second": 64401, "completed": 193204, "2xx": 193204, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 44, "p99_us": 3968, "max_us": 8704, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.24, "rss_kib": 11856, "cpu_seconds": 6.27, "ok_per_cpu_second": 65936, "ok_per_second": 64401, "idle_rss_kib": 10944} +{"requests_per_second": 73403, "completed": 220214, "2xx": 220214, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 336, "p99_us": 4608, "max_us": 9216, "server": "drogon-memory", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.24, "rss_kib": 11856, "cpu_seconds": 6.27, "ok_per_cpu_second": 65936, "ok_per_second": 73405, "idle_rss_kib": 10944} +{"requests_per_second": 151, "completed": 453, "2xx": 453, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 294912, "p99_us": 1966080, "max_us": 2621440, "server": "drogon-durable", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 0.96, "rss_kib": 11664, "cpu_seconds": 0.05, "ok_per_cpu_second": 9060, "ok_per_second": 151, "idle_rss_kib": 10960} +{"requests_per_second": 150, "completed": 450, "2xx": 450, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 32768, "p99_us": 507904, "max_us": 688128, "server": "drogon-durable", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 3.0, "rss_kib": 11664, "cpu_seconds": 0.05, "ok_per_cpu_second": 9000, "ok_per_second": 150, "idle_rss_kib": 10960} +{"requests_per_second": 147388, "completed": 442174, "2xx": 442174, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 800, "max_us": 26624, "server": "drogon-durable", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 11808, "cpu_seconds": 6.56, "ok_per_cpu_second": 67405, "ok_per_second": 147391, "idle_rss_kib": 10960} +{"requests_per_second": 127140, "completed": 381420, "2xx": 381420, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 2048, "max_us": 12800, "server": "drogon-durable", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 11872, "cpu_seconds": 7.32, "ok_per_cpu_second": 52107, "ok_per_second": 127140, "idle_rss_kib": 10960} +{"requests_per_second": 159, "completed": 477, "2xx": 477, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 40960, "p99_us": 155648, "max_us": 180224, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.32, "rss_kib": 11888, "cpu_seconds": 0.26, "ok_per_cpu_second": 29815, "ok_per_second": 159, "idle_rss_kib": 10960} +{"requests_per_second": 2423, "completed": 7275, "2xx": 7275, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 17408, "p99_us": 106496, "max_us": 163840, "server": "drogon-durable", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.32, "rss_kib": 11888, "cpu_seconds": 0.26, "ok_per_cpu_second": 29815, "ok_per_second": 2425, "idle_rss_kib": 10960} +{"requests_per_second": 19824, "completed": 59482, "2xx": 59482, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2176, "p99_us": 22528, "max_us": 98304, "server": "pure-serve", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 1.36, "rss_kib": 3120, "cpu_seconds": 0.83, "ok_per_cpu_second": 71665, "ok_per_second": 19827, "idle_rss_kib": 2384} +{"requests_per_second": 3483, "completed": 10585, "2xx": 10585, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1472, "p99_us": 15872, "max_us": 81920, "server": "pure-serve", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 1.01, "rss_kib": 3088, "cpu_seconds": 0.26, "ok_per_cpu_second": 40712, "ok_per_second": 3528, "idle_rss_kib": 2384} +{"requests_per_second": 121954, "completed": 365862, "2xx": 365862, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 496, "p99_us": 800, "max_us": 2816, "server": "pure-serve", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 3104, "cpu_seconds": 2.99, "ok_per_cpu_second": 122362, "ok_per_second": 121954, "idle_rss_kib": 2384} +{"requests_per_second": 85692, "completed": 257087, "2xx": 257087, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 672, "p99_us": 1216, "max_us": 6144, "server": "pure-serve", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 3152, "cpu_seconds": 2.96, "ok_per_cpu_second": 86854, "ok_per_second": 85696, "idle_rss_kib": 2384} +{"requests_per_second": 2979, "completed": 8944, "2xx": 8944, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2048, "p99_us": 11776, "max_us": 81920, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.36, "rss_kib": 3136, "cpu_seconds": 3.14, "ok_per_cpu_second": 118468, "ok_per_second": 2981, "idle_rss_kib": 2384} +{"requests_per_second": 121015, "completed": 363046, "2xx": 363046, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 432, "p99_us": 640, "max_us": 2816, "server": "pure-serve", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.36, "rss_kib": 3136, "cpu_seconds": 3.14, "ok_per_cpu_second": 118468, "ok_per_second": 121015, "idle_rss_kib": 2384} +{"requests_per_second": 20986, "completed": 63039, "2xx": 63039, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2048, "p99_us": 22528, "max_us": 86016, "server": "pure-serve-2", "workload": "score, 64 conn, keep-alive", "round": 2, "probe_ms": 0.96, "rss_kib": 3520, "cpu_seconds": 0.9, "ok_per_cpu_second": 70043, "ok_per_second": 21013, "idle_rss_kib": 2752} +{"requests_per_second": 3687, "completed": 11067, "2xx": 11067, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1472, "p99_us": 10752, "max_us": 245760, "server": "pure-serve-2", "workload": "score, 8 conn, keep-alive", "round": 2, "probe_ms": 1.22, "rss_kib": 3504, "cpu_seconds": 0.28, "ok_per_cpu_second": 39525, "ok_per_second": 3689, "idle_rss_kib": 2752} +{"requests_per_second": 152502, "completed": 457537, "2xx": 457537, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 608, "max_us": 5120, "server": "pure-serve-2", "workload": "total, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 3584, "cpu_seconds": 4.37, "ok_per_cpu_second": 104700, "ok_per_second": 152512, "idle_rss_kib": 2752} +{"requests_per_second": 148044, "completed": 444135, "2xx": 444135, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 640, "max_us": 2944, "server": "pure-serve-2", "workload": "page 20 rows, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 3648, "cpu_seconds": 5.4, "ok_per_cpu_second": 82247, "ok_per_second": 148045, "idle_rss_kib": 2752} +{"requests_per_second": 3629, "completed": 10892, "2xx": 10892, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 1536, "p99_us": 7936, "max_us": 90112, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: posts", "round": 2, "probe_ms": 1.2, "rss_kib": 3680, "cpu_seconds": 4.43, "ok_per_cpu_second": 100360, "ok_per_second": 3631, "idle_rss_kib": 2752} +{"requests_per_second": 144563, "completed": 433701, "2xx": 433701, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 352, "p99_us": 640, "max_us": 5888, "server": "pure-serve-2", "workload": "mixed, 8 score + 56 total conn: reads", "round": 2, "probe_ms": 1.2, "rss_kib": 3680, "cpu_seconds": 4.43, "ok_per_cpu_second": 100360, "ok_per_second": 144567, "idle_rss_kib": 2752} diff --git a/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-reads.jsonl b/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-reads.jsonl new file mode 100644 index 0000000..359923c --- /dev/null +++ b/research/experiments/011-http-frameworks/2026-09-27-pi5-sd-reads.jsonl @@ -0,0 +1,36 @@ +{"requests_per_second": 23192, "completed": 69576, "2xx": 69576, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2688, "p99_us": 3584, "max_us": 4608, "server": "pure-serve", "workload": "get 64B, 64 conn, close", "round": 0, "probe_ms": null, "rss_kib": 2928, "cpu_seconds": 1.66, "ok_per_cpu_second": 41913, "ok_per_second": 23192, "idle_rss_kib": 2320} +{"requests_per_second": 139320, "completed": 417961, "2xx": 417961, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 544, "max_us": 2688, "server": "pure-serve", "workload": "get 64B, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 2944, "cpu_seconds": 2.99, "ok_per_cpu_second": 139786, "ok_per_second": 139320, "idle_rss_kib": 2320} +{"requests_per_second": 2362, "completed": 7085, "2xx": 7085, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 3072, "p99_us": 5632, "max_us": 7936, "server": "pure-serve", "workload": "get 1MiB, 8 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 3936, "cpu_seconds": 2.99, "ok_per_cpu_second": 2370, "ok_per_second": 2362, "idle_rss_kib": 2320} +{"requests_per_second": 22649, "completed": 67971, "2xx": 67971, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4608, "max_us": 16384, "server": "pure-serve-3", "workload": "get 64B, 64 conn, close", "round": 0, "probe_ms": null, "rss_kib": 4512, "cpu_seconds": 1.9, "ok_per_cpu_second": 35774, "ok_per_second": 22657, "idle_rss_kib": 3152} +{"requests_per_second": 148187, "completed": 444579, "2xx": 444579, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 704, "max_us": 4352, "server": "pure-serve-3", "workload": "get 64B, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 4512, "cpu_seconds": 4.49, "ok_per_cpu_second": 99015, "ok_per_second": 148193, "idle_rss_kib": 3152} +{"requests_per_second": 1750, "completed": 5250, "2xx": 5250, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 4096, "p99_us": 7680, "max_us": 17408, "server": "pure-serve-3", "workload": "get 1MiB, 8 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 7280, "cpu_seconds": 4.86, "ok_per_cpu_second": 1080, "ok_per_second": 1750, "idle_rss_kib": 3152} +{"requests_per_second": 22325, "completed": 66989, "2xx": 66989, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4096, "max_us": 13824, "server": "axum-memory", "workload": "get 64B, 64 conn, close", "round": 0, "probe_ms": null, "rss_kib": 5664, "cpu_seconds": 3.62, "ok_per_cpu_second": 18505, "ok_per_second": 22330, "idle_rss_kib": 2768} +{"requests_per_second": 126959, "completed": 380878, "2xx": 380878, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 480, "p99_us": 800, "max_us": 3328, "server": "axum-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 5872, "cpu_seconds": 6.08, "ok_per_cpu_second": 62644, "ok_per_second": 126959, "idle_rss_kib": 2768} +{"requests_per_second": 1304, "completed": 3912, "2xx": 3912, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 5632, "p99_us": 9728, "max_us": 18432, "server": "axum-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 9696, "cpu_seconds": 4.07, "ok_per_cpu_second": 961, "ok_per_second": 1304, "idle_rss_kib": 2768} +{"requests_per_second": 21674, "completed": 65050, "2xx": 65050, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4352, "max_us": 19456, "server": "drogon-memory", "workload": "get 64B, 64 conn, close", "round": 0, "probe_ms": null, "rss_kib": 71632, "cpu_seconds": 3.54, "ok_per_cpu_second": 18376, "ok_per_second": 21683, "idle_rss_kib": 10912} +{"requests_per_second": 146634, "completed": 439908, "2xx": 439908, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 736, "max_us": 8192, "server": "drogon-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 71664, "cpu_seconds": 7.13, "ok_per_cpu_second": 61698, "ok_per_second": 146636, "idle_rss_kib": 10912} +{"requests_per_second": 754, "completed": 2263, "2xx": 2263, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 9728, "p99_us": 24576, "max_us": 36864, "server": "drogon-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 0, "probe_ms": null, "rss_kib": 78816, "cpu_seconds": 7.71, "ok_per_cpu_second": 294, "ok_per_second": 754, "idle_rss_kib": 10912} +{"requests_per_second": 23383, "completed": 70165, "2xx": 70165, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2432, "p99_us": 4352, "max_us": 18432, "server": "pure-serve-3", "workload": "get 64B, 64 conn, close", "round": 1, "probe_ms": null, "rss_kib": 4384, "cpu_seconds": 1.96, "ok_per_cpu_second": 35798, "ok_per_second": 23388, "idle_rss_kib": 3152} +{"requests_per_second": 150515, "completed": 451549, "2xx": 451549, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 672, "max_us": 5888, "server": "pure-serve-3", "workload": "get 64B, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 4432, "cpu_seconds": 4.55, "ok_per_cpu_second": 99242, "ok_per_second": 150516, "idle_rss_kib": 3152} +{"requests_per_second": 1850, "completed": 5552, "2xx": 5552, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 3968, "p99_us": 7424, "max_us": 11776, "server": "pure-serve-3", "workload": "get 1MiB, 8 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 7440, "cpu_seconds": 5.25, "ok_per_cpu_second": 1058, "ok_per_second": 1851, "idle_rss_kib": 3152} +{"requests_per_second": 22200, "completed": 66603, "2xx": 66603, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4096, "max_us": 19456, "server": "axum-memory", "workload": "get 64B, 64 conn, close", "round": 1, "probe_ms": null, "rss_kib": 4208, "cpu_seconds": 3.69, "ok_per_cpu_second": 18050, "ok_per_second": 22201, "idle_rss_kib": 2768} +{"requests_per_second": 122730, "completed": 368189, "2xx": 368189, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 496, "p99_us": 864, "max_us": 4352, "server": "axum-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 5408, "cpu_seconds": 6.06, "ok_per_cpu_second": 60757, "ok_per_second": 122730, "idle_rss_kib": 2768} +{"requests_per_second": 1297, "completed": 3892, "2xx": 3892, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 5632, "p99_us": 9728, "max_us": 12800, "server": "axum-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 9248, "cpu_seconds": 4.08, "ok_per_cpu_second": 954, "ok_per_second": 1297, "idle_rss_kib": 2768} +{"requests_per_second": 20555, "completed": 61692, "2xx": 61692, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 5376, "max_us": 20480, "server": "drogon-memory", "workload": "get 64B, 64 conn, close", "round": 1, "probe_ms": null, "rss_kib": 68672, "cpu_seconds": 3.53, "ok_per_cpu_second": 17476, "ok_per_second": 20564, "idle_rss_kib": 10912} +{"requests_per_second": 147149, "completed": 441455, "2xx": 441455, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 672, "max_us": 6144, "server": "drogon-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 68704, "cpu_seconds": 7.05, "ok_per_cpu_second": 62618, "ok_per_second": 147152, "idle_rss_kib": 10912} +{"requests_per_second": 764, "completed": 2292, "2xx": 2292, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 7424, "p99_us": 30720, "max_us": 49152, "server": "drogon-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 75888, "cpu_seconds": 7.73, "ok_per_cpu_second": 297, "ok_per_second": 764, "idle_rss_kib": 10912} +{"requests_per_second": 22557, "completed": 67676, "2xx": 67676, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2816, "p99_us": 4096, "max_us": 6400, "server": "pure-serve", "workload": "get 64B, 64 conn, close", "round": 1, "probe_ms": null, "rss_kib": 2960, "cpu_seconds": 1.65, "ok_per_cpu_second": 41016, "ok_per_second": 22559, "idle_rss_kib": 2320} +{"requests_per_second": 138730, "completed": 416192, "2xx": 416192, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 512, "max_us": 5632, "server": "pure-serve", "workload": "get 64B, 64 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 2960, "cpu_seconds": 2.99, "ok_per_cpu_second": 139195, "ok_per_second": 138731, "idle_rss_kib": 2320} +{"requests_per_second": 2352, "completed": 7057, "2xx": 7057, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2944, "p99_us": 8192, "max_us": 16384, "server": "pure-serve", "workload": "get 1MiB, 8 conn, keep-alive", "round": 1, "probe_ms": null, "rss_kib": 3936, "cpu_seconds": 2.95, "ok_per_cpu_second": 2392, "ok_per_second": 2352, "idle_rss_kib": 2320} +{"requests_per_second": 21721, "completed": 65186, "2xx": 65186, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4096, "max_us": 23552, "server": "axum-memory", "workload": "get 64B, 64 conn, close", "round": 2, "probe_ms": null, "rss_kib": 5344, "cpu_seconds": 3.52, "ok_per_cpu_second": 18519, "ok_per_second": 21729, "idle_rss_kib": 2800} +{"requests_per_second": 128872, "completed": 386618, "2xx": 386618, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 480, "p99_us": 768, "max_us": 3072, "server": "axum-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 5808, "cpu_seconds": 6.16, "ok_per_cpu_second": 62763, "ok_per_second": 128873, "idle_rss_kib": 2800} +{"requests_per_second": 1396, "completed": 4188, "2xx": 4188, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 5376, "p99_us": 8192, "max_us": 10752, "server": "axum-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 9120, "cpu_seconds": 4.1, "ok_per_cpu_second": 1021, "ok_per_second": 1396, "idle_rss_kib": 2800} +{"requests_per_second": 21205, "completed": 63634, "2xx": 63634, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4352, "max_us": 28672, "server": "drogon-memory", "workload": "get 64B, 64 conn, close", "round": 2, "probe_ms": null, "rss_kib": 70416, "cpu_seconds": 3.44, "ok_per_cpu_second": 18498, "ok_per_second": 21211, "idle_rss_kib": 10928} +{"requests_per_second": 146679, "completed": 440044, "2xx": 440044, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 384, "p99_us": 672, "max_us": 5120, "server": "drogon-memory", "workload": "get 64B, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 70448, "cpu_seconds": 7.02, "ok_per_cpu_second": 62684, "ok_per_second": 146681, "idle_rss_kib": 10928} +{"requests_per_second": 731, "completed": 2193, "2xx": 2193, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 8704, "p99_us": 23552, "max_us": 43008, "server": "drogon-memory", "workload": "get 1MiB, 8 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 77600, "cpu_seconds": 7.61, "ok_per_cpu_second": 288, "ok_per_second": 731, "idle_rss_kib": 10928} +{"requests_per_second": 23644, "completed": 70935, "2xx": 70935, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 3456, "max_us": 4352, "server": "pure-serve", "workload": "get 64B, 64 conn, close", "round": 2, "probe_ms": null, "rss_kib": 2928, "cpu_seconds": 1.68, "ok_per_cpu_second": 42223, "ok_per_second": 23645, "idle_rss_kib": 2320} +{"requests_per_second": 139261, "completed": 417786, "2xx": 417786, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 448, "p99_us": 544, "max_us": 4608, "server": "pure-serve", "workload": "get 64B, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 2960, "cpu_seconds": 2.99, "ok_per_cpu_second": 139728, "ok_per_second": 139262, "idle_rss_kib": 2320} +{"requests_per_second": 2739, "completed": 8218, "2xx": 8218, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2816, "p99_us": 3840, "max_us": 6656, "server": "pure-serve", "workload": "get 1MiB, 8 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 3936, "cpu_seconds": 2.99, "ok_per_cpu_second": 2748, "ok_per_second": 2739, "idle_rss_kib": 2320} +{"requests_per_second": 23280, "completed": 69864, "2xx": 69864, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 2560, "p99_us": 4352, "max_us": 19456, "server": "pure-serve-3", "workload": "get 64B, 64 conn, close", "round": 2, "probe_ms": null, "rss_kib": 4400, "cpu_seconds": 1.93, "ok_per_cpu_second": 36199, "ok_per_second": 23288, "idle_rss_kib": 3152} +{"requests_per_second": 150697, "completed": 452094, "2xx": 452094, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 400, "p99_us": 672, "max_us": 4096, "server": "pure-serve-3", "workload": "get 64B, 64 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 4400, "cpu_seconds": 4.5, "ok_per_cpu_second": 100465, "ok_per_second": 150698, "idle_rss_kib": 3152} +{"requests_per_second": 1883, "completed": 5652, "2xx": 5652, "4xx": 0, "5xx": 0, "errors": 0, "p50_us": 3968, "p99_us": 6656, "max_us": 9216, "server": "pure-serve-3", "workload": "get 1MiB, 8 conn, keep-alive", "round": 2, "probe_ms": null, "rss_kib": 6544, "cpu_seconds": 4.79, "ok_per_cpu_second": 1180, "ok_per_second": 1884, "idle_rss_kib": 3152} diff --git a/research/experiments/011-http-frameworks/README.md b/research/experiments/011-http-frameworks/README.md index 2b21595..5c96200 100644 --- a/research/experiments/011-http-frameworks/README.md +++ b/research/experiments/011-http-frameworks/README.md @@ -5,3 +5,6 @@ axum 0.8.9, drogon 1.9.0을 같은 Raspberry Pi 5(서버 CPU 0–2, 부하 CPU 3, 저장소 ext4 SD)에서 쟀다. 한 줄이 (서버, 작업, 라운드) 하나이며 `ok_per_cpu_second`는 서버 CPU 시간(모든 스레드, user+system) 1초당 성공 응답 수다. + +`2026-09-27-pi5-sd-reads.jsonl`(문서 읽기)과 `2026-09-27-pi5-sd-app.jsonl`(앱)은 같은 방법으로 Pure `a8d6b1b`를 쟀다 +([087](../../../docs/research/087-small-reads-and-idle-memory.md)): 작은 읽기의 네 단계와 OpenSSL을 쓸 때만 매핑하기 뒤다. -- cgit v1.2.3