DPC レイテンシが高いことは VPN 経路が遅いことを意味しない
ドライバーの時間、エコーの往復、セッションのイベントが互いに責任を押し付け合う。コンポーネントを変える前に、各カウンターが何を測るのかを読む。
音声の不具合と VPN の停止が同じ十秒に重なり、ユーティリティが DPC レイテンシというラベルの高い数値を報告する。ドライバーがトンネルを遅くしている、あるいはトンネルがドライバーに負荷をかけている、と考えたくなる。どちらの結論もその数値からは導けない。
ここには三つの測定があり、それらは同じ境界を共有していない。
三つの数、三つの境界
遅延プロシージャコールとは、ドライバーが割り込みハンドラーから先送りする作業であり、そのルーチン内で費やされる時間は、モジュールと関数に帰属されるプロセッサローカルの測定である。エコーの往復はソケットでの時間の観測であり、ネットワークスタックと遠隔の応答側が生成する。切断イベントはクライアントが記録する状態遷移である。それぞれが他では答えられない問いに答えており、単位が同じでも互換にはならない。
有用な規律は、値を読む前に境界を名指しすることだ。単位と境界を並べて書く。ツールがミリ秒を報告するなら、何のミリ秒かを問う。ルーチン内の時間か、実行を待つ時間か、応答が届くまでの時間か。
あるカテゴリーの高い数値は手がかりであり、決して診断ではない。
見出しの背後にある定義を読む
ユーティリティによって、何をレイテンシと呼ぶかが異なる。ドライバールーチンの所要時間を報告するものもあれば、スケジューリングの遅延を報告するものもあり、同じマシン上でこの二つの量は逆方向に動きうる。その一方を単に DPC レイテンシと呼ぶダッシュボードは、見た目より少ないことを伝えている。だからこそ、まったく変化していないマシンについて二つのダッシュボードが食い違うことがある。
同じ注意は一つの分析ツールの内部にも当てはまる。包含時間はルーチンを入口から出口までたどるが、排他時間はそのルーチン自身が実行していた断片だけを合計する。間違った列を選ぶと、呼び出し元が犯人になる。
ローカルのドライバー作業とネットワーク遅延も、融合せずに相互に作用する。過剰な割り込み関連の活動はマシン上の時間に敏感な作業を遅らせることがあり、混雑した経路はパケットを遅らせることがあり、一度の目に見える停止の間に両方が真でありうる。
すべての観測を一つの時間窓に置く
トレースは、症状を含む区間を読むときにだけ役立つ。トレース、クライアントのイベント、アプリケーションの障害をタイムスタンプ付きで記録し、その後三つすべてで同じ秒を見る。一時間のトレースの最大値と、その午後遅くの切断は、無関係な二つの事実である。
wpr -start CPU -filemode
wpr -stop vpn-trace.etl
xperf -i vpn-trace.etl -a dpcisr -o dpc.txt
次に分析ツールでトレースを開き、キャプチャ全体ではなく、その時間窓内の所要時間で並べ替える。CPU 分析のガイダンス は、時間をモジュールと関数に帰属させる DPC/ISR 所要時間ビューを説明している。
トンネルに実際何が起きたかを確認する その場で確認してほしい。アプリケーションのトラフィックが一時的に失われても、クライアントが新しい交渉を始めたことにはならず、小さなプローブの成功は、他のすべてが動き続けた証拠にはならない。
証拠が指すコンポーネントを変える
ビジーなモジュールは調査する場所であり、判決ではない。別のコンポーネントや、あなたが生み出したワークロードに起因する作業を行っているかもしれない。モジュール名、デバイス、ドライバーのバージョン、観測した区間を一緒に保つこと。その組み合わせこそがベンダーが動ける材料になる。
実験ごとに変更を一つにすることが、結果から学ぶ唯一の方法だ。有線での比較は範囲を狭めるが、同時に無線経路とドライバーの活動を変えてしまうので、証拠ではなく手がかりとして扱う。
トレースは機密として扱う。プロセス名や環境の詳細を含むことがあるため、公開の添付ファイルではなく、サポートされたキャプチャ経路に置く。トレースがどの観測に答えるためのものだったかを述べる。