標準HTTPの速度とメモリ
std.http.serverの負荷試験です。Nagiと、同じ処理を直接Rustで書いたサーバーを比較しました。測定日は2026年10月3日です。
Rust側も同じnagi-runtime::http_serverを使います。生成コードと手書きhandlerの違いを確認する比較であり、Axum RouterとHyperを同じ条件で比較したものではありません。測定スクリプトに含まれる旧Axumサーバーは受付・期限の方針が異なります。標準APIの内部にAxum/Towerを採用するか判断するための、同じAPI・制限・障害条件での比較は未実施です。
このページの目次
応答速度
64接続で負荷をかけた結果です。各処理を5秒ずつ3回測り、表には3回の中央値を載せています。
| 処理 | Nagi 件/秒 | Rust 件/秒 | Nagi p99 | Rust p99 |
|---|---|---|---|---|
| GET・短い文字列 | 131,630 | 111,923 | 2.054 ms | 2.214 ms |
| GET・小さなJSON | 122,464 | 110,257 | 1.001 ms | 1.066 ms |
| POST・4KBの名前を含むJSONの読み書き | 60,444 | 59,250 | 2.805 ms | 1.907 ms |
p99は99%の応答が収まった時間です。POSTでは処理件数が近くても、Nagiの遅い側の応答はRustより長くなりました。これも改善を追う指標です。
共有ホスト上の短い測定なので、言語の速さの順位や本番の処理能力は断定できません。初回はPOSTでNagiが約10.8%遅くなりましたが、依存とビルド条件をそろえた再測定ではその差は再現しませんでした。差の原因は特定できていません。初回の記録も残しています。
2分間の連続負荷
Nagiの同じPOST処理を120秒間続けました。
| 項目 | 結果 |
|---|---|
| 処理したリクエスト | 7,653,211件 |
| 接続・読み書き・タイムアウト・応答コードのエラー | 0件 |
| p95 / p99 | 1.375 / 1.891 ms |
| プロセスのRSS | 開始3,244 KiB、最大・終了3,428 KiB |
| 開いているFD | 負荷中最大74個、負荷終了後10個 |
終了後はサーバーを動かしたまま5秒間観察し、接続のFDが負荷前の10個へ戻ることを確認しました。RSSは割り当て済みメモリを含むプロセス全体の値です。2分間で安定していても、長時間の運用やメモリリークがないことの証明にはなりません。
処理を増やさない設計
Statusは2バイトの数値型で、状態の判定に文字列を作りません。MethodはHTTPパーサーが渡す型をそのまま使い、request.is_getとMethod.GETとの比較にも追加の文字列生成はありません。
ヘッダーの単一参照は値を借用します。標準名・独自名・大文字小文字が混ざった名前で、参照時のヒープ割り当てがないことをテストしています。本文が一つの受信チャンクで届けば、そのバッファを引き継ぎます。複数チャンクの結合やJSONの読み書きには必要な割り当てがあります。
型付きハンドラーはRustの具体的な型として生成します。異なるハンドラーを保存するroute表では、リクエストごとにfutureを一つだけヒープへ置きます。今回のPOSTではNagiとRustの両方が528バイトでした。すべての処理がゼロコピーになるわけではありません。
測定条件と再実行
Linux x86_64、AMD EPYC 9V74の共有ホストで、サーバーを1 CPU・1 worker、wrkを別の2 CPU・2 threadに固定しました。コンテナのCPU上限は4 coreです。通信はlocalhostのHTTP/1.1、DBなしです。NagiとRustは同じruntime・依存のlock・release設定・制限値を使います。
負荷生成は64接続の応答を待って次を送る方式です。一定の到着率で待ち行列を測る試験、外部ネットワークの試験、DDoS対策の検証とは条件が異なります。
nagic build benchmarks/http_stdlib.nagi
cargo build --release -p nagi-runtime --example axum_baseline
python scripts/http_stdlib_bench.py --wrk /path/to/wrk --build-matching-rust
nagic buildはreleaseでアプリを生成します。targetの場所を変更している場合はCARGO_TARGET_DIRとNAGI_NATIVE_TARGET_DIRも指定してください。再測定の生データには各回の応答時間・CPU・RSS・バイナリのSHA-256を保存しています。
通信の負荷試験には旧HTTP APIの飽和・低速送信・接続回収の記録があります。標準HTTPと制限や実装が異なるため、その結果を標準HTTPの保証には使いません。現在の制限と設定はHTTPを参照してください。