- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- DB保存
第13期の初回です。1件がどう通るかではなく、装置の状態を何の数字で語るかを扱います。
まず結論
レイテンシとスループットの2つだけでは、性能の状態を言い当てられません。スループットが同じでレイテンシが7倍違う状態が、実際に作れます。
区別に要るのは3つ目の量、いま同時に中にいる件数です。この量には決まった呼び名がなく、本教材では並行数と呼びます。
1件の処理時間が一切変わらないサーバに、同時接続だけを4本から32本に増やしました。観測されるレイテンシはどうなるでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
2つの量では状態を言い当てられない
第5週で、パイプラインが速くするのはスループットであって1命令の時間ではないと見ました。今回はその先、2つでは足りないという話です。
観測されるレイテンシは、2つの合計です。
- 処理そのものの時間 — その1件の仕事にかかる時間
- 待ちの時間 — 順番が来るまで並んだ時間
外から計った所要時間には両方が入っており、どちらが伸びたかは分かりません。 スループットも助けになりません。枠が埋まったあとは、いくら流し込んでも増えず、増えたぶんが待ちに変わるからです。
要るのは3つ目の量、いま中にいる件数です。
この量には決まった呼び名がない
この量を指す規格用語は存在しません。 同じ文書の中でも、近い概念に別々の語が使われています。
語 逐語outstanding allowed only one request to be outstanding at a timeconcurrent the maximum number of concurrent streamsin-flight After allowing time for any in-flight stream creation
3つとも RFC 9113 の表現ですが、文脈は別々です(HTTP/1.0 の未完了の要求、ストリーム数の上限、GOAWAY 時に作成途中のストリーム)。queue depth に至っては、本教材が確認した RFC 9110・RFC 9113・iostats.rst のどれにも定義がありません。
本教材では、この量を「並行数」と呼びます。 教材側でつけた名前で、「並行数という規格用語がある」という意味ではありません。
ただし名前が定まらないことと、量が無いことは別です。 iostats.rst はフィールド9をこう説明しています。
Field 9 -- # of I/Os currently in progress (unsigned int)The only field that should go to zero.
他は累積値ですが、これだけは現在値で、空になれば0へ戻ります。さらにフィールド11は、I/O の開始・完了・マージのたびに「進行中の I/O 数 × 経過ミリ秒」を足し込むと定義されています。つまりこの量の時間積分です。
カーネルは、名前を与えないまま、この量を積分してまで記録している。
「並行数」という語について、最も正確なのはどれですか。
枠が埋まると、入れたぶんは待ちになる
一般化します。処理の枠には数があり、空いている間は流し込んだぶんだけ完了数が増えます。しかし枠が全部埋まると、そこから先に入れたものは処理へ進めず、列に並びます。
このとき3つの量は次のように動きます。
- スループット — 増えない。枠の数で決まるから
- レイテンシ — 伸びる。列に並ぶぶんが足される
- 並行数 — 増える。中にいる件数は増えるから
2つだけでは、「枠が空いた状態」と「列ができた状態」が同じ数字に見えることがあります。 3つ目の量がその差を写します。
3つの量の関係(リトルの法則と呼ばれるもの)は、図解コース「システム性能分析のしくみ」が扱います。
処理時間を変えずにレイテンシを7倍にする
本教材の測定環境(Docker Desktop の Linux VM、Linux 6.10.14-linuxkit、aarch64、nproc=10、debian:bookworm-slim)での実験です(測定日 2026-09-18)。
- サーバはコンテナ内の
127.0.0.1:8099。枠は4つ固定、1件の処理時間は50msに固定 - クライアントは同コンテナ内から、N本の同時接続 × 各20リクエスト
# server: 4 service slots, fixed 50.0 ms service time per request (never varies)conc= 1 n= 20 wall= 1.07s throughput= 18.7 req/s mean= 53.5ms p50= 52.5 p99= 60.2conc= 2 n= 40 wall= 1.09s throughput= 36.8 req/s mean= 54.2ms p50= 53.7 p99= 61.3conc= 4 n= 80 wall= 1.07s throughput= 74.5 req/s mean= 53.6ms p50= 53.3 p99= 57.4conc= 8 n= 160 wall= 2.11s throughput= 75.8 req/s mean= 102.2ms p50= 104.4 p99= 163.5conc= 16 n= 320 wall= 4.23s throughput= 75.7 req/s mean= 199.4ms p50= 208.3 p99= 368.0conc= 32 n= 640 wall= 8.40s throughput= 76.2 req/s mean= 388.9ms p50= 415.3 p99= 1143.0
読み取れるのは3点です。
- コードは一度も変わっていません。 処理時間は終始50msです。にもかかわらず観測レイテンシは 53.5ms → 388.9ms へ、約7.3倍になりました。増えたぶんはすべて待ちです。
- スループットは
conc=4以降ほぼ動きません(74.5 → 75.8 → 75.7 → 76.2)。4枠を50msで回す計算だと毎秒80件で、実測はその手前でほぼ頭打ちです。差は測定系の費用です。 - そして核心 — ハイライトした
conc=4とconc=32はスループットがほぼ同じ(74.5 と 76.2)です。2つの量だけでは区別できません。 実際には一方が他方より約7倍遅いのに、です。
なお conc=1 の 53.5ms も 50ms ちょうどではなく、差の3.5msは接続確立やソケット往復の費用です。本教材の環境での値で、「処理50msなら53.5ms」という一般則ではありません。
スループットが同じ2つの状態を区別するのに、並行数はなぜ役に立つのですか。
同時接続を増やしたサーバ
処理時間を50msに固定したまま、同時接続だけを増やしました。完了数は枠の数で頭打ちになり、超えたぶんは列に並びます。伸びるのは観測レイテンシだけです。
同時接続 スループット 平均レイテンシ4 74.5 req/s 53.6 ms32 76.2 req/s 388.9 ms
CPUのパイプライン(第5週)
段を重ねて複数の命令を同時に流すと、単位時間あたりの完了命令数は増えます。しかし1命令の所要時間は短くならず、区切りの費用でむしろわずかに増えます。
見る量 段を重ねると完了数(スループット) 増える1命令の所要時間 短くならない
同時接続を増やしたサーバと、段を重ねたCPU。層はまったく違いますが、共通する構造は何でしょうか。
「同時に何本流れているか」と「1本が通り抜ける時間」を別の量として分けてみてください。
3つの量の関係
- ・スループットは単位時間に何件抜けたかしか写さない
- ・レイテンシは合計なので、どちらが伸びたかは写さない
- ・並行数は枠が埋まった後も増え続ける
この章のまとめ
- 観測レイテンシは「処理の時間」と「待ちの時間」の合計で、数字だけではどちらが伸びたか分からない。
- スループットは枠の数で頭打ちになり、以降に流し込んだぶんは待ちへ回る。だからスループットが同じでレイテンシが7倍違う状態が実在する(本教材の測定)。
- 区別に要る3つ目の量が並行数(処理中 + 待ち)。ただし教材側でつけた名前で、規格用語ではない。RFC 9113 の中でも、近い概念に outstanding / concurrent / in-flight と別々の語が使われている。
- 名前が無いことと量が無いことは別。
iostats.rstはフィールド9を「ゼロになるべき唯一のフィールド」として持ち、フィールド11では時間積分まで記録している。 - ロードアベレージも並行数を数える試みだが、
state Rに加えstate D(ディスクI/O待ち)も数えるので、CPUの混み具合ではない。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
本教材の測定で、同時接続4本と32本はスループットがほぼ同じ(74.5 req/s と 76.2 req/s)でした。言えるのはどれですか。
用語集(4語)
- 並行数(本教材の用語)
- いま同時に系の中にいる件数。処理中と順番待ちの合計。規格用語が無いため本教材で名前をつけた。文献では近い概念に outstanding / concurrent / in-flight / in progress などの語が使われる。
- レイテンシ
- 1件が入ってから出るまでの時間。観測値は「処理の時間」と「待ち時間」の合計で、外から分離できない。
- スループット
- 単位時間に完了した件数。枠が埋まると頭打ちになり、以降は流し込んでも増えない。
- ロードアベレージ
- Linux では実行待ち(state R)とディスクI/O待ち(state D)の数を1分・5分・15分で平均した値。CPUの混み具合ではない。