- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- DB保存
前回まで、速さを表す量そのものを見てきました。今回は、その量を手に入れる行為の側を見ます。
まず結論
観測にはかならず費用がかかります。その費用が測りたい現象より大きいと、出てきた数字はもう元の処理の性質ではありません。
しかも費用の大きさは道具ごとに決まった値ではなく、道具が反応する事象の密度で決まります。同じ道具・同じマシンでも、対象を変えるだけで桁がいくつも動きます。
あるプログラムを strace 越しに実行したら、素で実行したときの何倍の時間がかかるでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
測定器も、時間を使っている
測るという行為は、対象の外から眺めることではありません。観測の処理は対象と同じCPUで走ります。だから観測にはかならず費用がかかり、それは対象の実行時間に足し込まれます。問題は費用の有無ではなく、大きさが測りたい現象と比べてどうかです。
- ・道具が費用を払うのは「反応する事象」1回ごと。その密度で総額が決まる
もうひとつ制約があります。観測器の刻み(分解能)です。1回の観測に粒度があると、それより細かいものは見えません。費用も分解能も観測器の性質であって対象の性質ではありません。この区別を落とすと、観測器のクセを対象の性質として報告することになります。
同じ道具が、186倍にも1.06倍にもなる
本教材の測定環境(Docker Desktop の Linux VM、各条件3回測定)で、同じ strace に2種類の処理を測らせました。
対象 素 strace有り 倍率A: 20万回の write(2) 0.0457 8.5218 約186倍B: 200万回の算術ループ(syscall無し) 0.1408 0.1494 約1.06倍
道具もマシンも測定回数も同じで、違うのは対象だけです。素の実行では write 1回あたり約228ナノ秒、strace 越しでは約42.6マイクロ秒。対象より観測の費用が二桁大きい。この8.52秒は、もう元の処理の性質ではありません。
だから**「strace は何倍遅い」という問いには答えがありません**。言えるのは「この道具でこの対象を測ると何倍」までです。strace(1) の man は BUGS 節で減速を認めていますが——
A traced process runs more slowly than a non-traced one.
——倍率やパーセンテージの記述は man のどこにもありません。全文を探して0件でした。
「strace はおよそ200倍遅い」という説明の評価として、最も適切なものはどれですか。
道具は費用を加え、そして自分の出力から消す
観測器が困るのは、費用を加えるからだけではありません。道具は自分が加えた費用を差し引いてから結果を出すことがあります。しかもその差し引きは厳密な計算ではなく推定です。すると出力を見るかぎり費用は消え、大きかったかどうかは書かれていません。
strace(1) はこれを自分で認めています。-O の節の逐語です。
Sets the overhead for tracing system calls to overhead. This is useful for overriding the default heuristic, which estimates the time spent in the measurement process itself when timing system calls with the -c option.
「測定行為そのものに費やされた時間を推定する」とあり、しかもそれを heuristic と呼んでいます。続きは確かめ方の案内です。
The accuracy of the heuristic can be gauged by timing a given program run without tracing (using time(1)) and comparing the accumulated system call time to the total produced using -c.
素の実行を time(1) で計り -c の合計と比べよ——道具の側が「この引き算は当てにならないことがある」と認めているわけです。
測定器の集計は、壁時計を数えていなかった
前節Aと同じ処理を strace -c に測らせました。
% time seconds usecs/call calls errors syscall------ ----------- ----------- --------- --------- ----------------99.90 0.707004 3 200001 write0.05 0.000324 4 66 rt_sigaction...
write に 0.707秒と報告されています。ところが同じ実行の所要時間は約8.9秒でした。差は約8.2秒、全体の約92%です。
この差を「strace が自分の費用を引いて消した」と読むのは誤りです。man の -c の節はこう書いています。
This shows system time (CPU time spent in the kernel), which is independent of wall clock time.
-c が集計するのは**カーネル内で使った CPU 時間(system time)**で、壁時計ではありません。-w の節にも The default is to summarize the system time. とあります。約8.2秒の差の主因は、この集計がそもそも壁時計を数えていないことです。-O の推定がこのうちどれだけを引いたかは、出力からも man からも分かりません。
だから 0.707 秒は「間違い」ではなく、答えている問いが違うのです。気づく方法は man 自身が書いています。素の実行を別の手段で計って突き合わせる、それだけです。
カーネル公式も同じです。Documentation/trace/ftrace.rst が71マイクロ秒の遅延をトレースして見せた直後の注記です。
Note that by enabling function tracing, we incur an added overhead. This overhead may extend the latency times.
カーネルが、自分の出した測定値に「観測によって伸びている可能性がある」と添えている。観測の費用は道具の粗さの話ではなく、測るという行為に付いて回る性質です。
なお観測手段をコスト構造で選び分ける話は、図解コース「サンプリングとトレーシング — コスト構造が違う」が扱います。
strace -c が「write に 0.707 秒」と報告した同じ実行が、実際には約8.9秒かかっていました。この 0.707 秒をどう読むのが正確ですか。
費用が大きすぎて、対象が押し流される
本教材の測定環境で20万回の write を strace 越しに測りました。1回228ナノ秒の処理に、観測の費用が約42.6マイクロ秒乗ります。数字は出ますが対象の性質ではありません。
対象の処理 観測の費用 合計素 約228 ns なし 約228 nsstrace 約228 ns 約42.6 us 約42.6 us
粒度が粗すぎて、現象が見えなくなる
第12期の検証で、0.1ミリ秒のずれを1回約100ミリ秒の手段で観測しました。結果は50回中0件。観測の1回が現象の1000倍を占めていたためです。手段を軽くしたら200回中199件でした。
観測の手段 1回の粒度 検出できた件数重い手段 約100 ms 0 / 50軽い手段 対象より細かい 199 / 200
片方は観測が重すぎて対象を押し流し、もう片方は粗すぎて取り逃しました。逆に見えるこの2つに共通する構造は何でしょうか。
出てきた数字が「何の性質」を表しているかを考えてみてください。
この章のまとめ
- 観測にはかならず費用がかかる。それが現象より大きいと、出てきた数字は対象ではなく観測器の性質を映す。
- 倍率は道具の属性ではない。 本教材の測定環境(Docker Desktop の Linux VM、各3回)で、同じ strace が約186倍にも約1.06倍にもなった。
strace(1)の man は BUGS 節で減速を認めるが、倍率の数値は書いていない。 - 集計が何を数えているかを確かめる。
strace -cは 0.707 秒と報告したが実測は約8.9秒。-cが数えるのはカーネル内の CPU 時間(system time)で、壁時計ではない。答えている問いが違う。見抜く手順は man 自身が書いている。素の実行を別の手段で計り、集計と突き合わせる。 - 観測器が現象より粗ければ、現象は「無い」ように見える。0件は不在の証拠ではない。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
観測の費用が「道具の属性」ではなく「道具と対象の噛み合いの属性」だと言えるのは、なぜですか。
用語集(3語)
- 観測の費用(オーバーヘッド)
- 測定のために対象へ加わる余分な処理時間。反応する事象1回ごとに払われ、総額はその密度で決まる。
- 分解能(resolution)
- 観測器が区別できる最小の刻み。観測器の性質であって、対象の性質ではない。
- heuristic(発見的推定)
- 厳密な計算ではなく経験的な当てはめで値を求めるやり方。strace(1) は -c から引く観測費用の見積もりをこう自称している。