# コンテキストスイッチ ## 定義 コンテキストスイッチとは、あるスレッドまたはプロセスから別のスレッド、プロセスへの実行の切り替えである。カーネルのCPUスケジューラが通常の機能として行い、実行中のCPUレジスタ群の内容(スレッドコンテキスト)を新しい内容に切り替えることを含む。すべてのシステムコールはユーザーモードとカーネルモードを切り替えるモードスイッチを伴うが、ディスクI/Oやネットワーク I/Oなどブロックを起こすシステムコールはさらに、呼び出し元がブロックされている間にほかのスレッドを実行するためのコンテキストスイッチも行う。モードスイッチとコンテキストスイッチはいずれもCPUサイクルのオーバーヘッドがかかる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.2.2) 割り込み処理も非同期的なコンテキストスイッチを引き起こす。たとえば、ディスクI/Oを待ってブロックしたスレッドは、I/O完了の非同期割り込みが届くまで別のスレッドにCPUを明け渡す。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.2.4.1) 16章は、CPUが飽和状態のVMホストと余裕のあるコンテナホストとで、コンテキストスイッチの頻度を`perf stat -e cs`で直接比較した実務事例を示す。VMは1秒あたり約200万回、コンテナホストは1秒あたり約1000〜1400回と3桁近い差があり、他ツール(`stackcount(8)`、`/proc/PID/status`のnonvoluntary_ctxt_switches)によりVM側は非自発的コンテキストスイッチが主要因だと確認された。BCCの`cpudist(8)`によるon-CPU時間分布の比較では、VMのアプリケーションは大半が7µ秒未満でCPUを手放していたのに対し、コンテナは2〜4m秒もon-CPU状態を維持しており、高頻度のコンテキストスイッチがCPUキャッシュのウォームアップ時間を奪っていることが裏づけられた。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 16 ケーススタディ]] §16.1.6-16.1.7) ## 横断的知見 - **3章が定性的に述べる「コンテキストスイッチはCPUサイクルのオーバーヘッドがかかる」という主張を、16章は定量的な実測値で裏づける**: 3章の定義はモードスイッチ・コンテキストスイッチのオーバーヘッドを一般論として述べるにとどまるが、16章はCPU飽和状態のVM(コンテキストスイッチ毎秒約200万回、on-CPU時間の大半が7µ秒未満)とそうでないコンテナ(毎秒約1000〜1400回、on-CPU時間2〜4m秒)を対比させ、高頻度のコンテキストスイッチがCPUキャッシュのウォームアップ機会を奪い、結果としてIPCの低下([[Instructions Per Cycle]]がVM 0.57・コンテナ1.52)という具体的なパフォーマンス劣化に直結することを示す。「オーバーヘッドがかかる」という抽象的な主張が、実際の障害調査でどの程度のオーバーヘッドとして現れうるかの桁感覚(3桁近い差)を与える点で、3章の未解決の問い(ワークロード別の頻度変化を示す一次ソースが必要)に部分的に答えている。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.2.2, [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 16 ケーススタディ]] §16.1.6-16.1.7) - **16章のCPU飽和状態は非自発的コンテキストスイッチという特定の種類を主因としており、3章が挙げるブロッキングシステムコール由来のコンテキストスイッチとは発生機序が異なる**: 3章はディスクI/O等でブロックするシステムコールが呼び出し元をブロックしほかのスレッドへコンテキストスイッチする、という自発的(スレッド側の待機に起因する)ケースを中心に説明する。対して16章のVMホストでは、CPUがロードアベレージ85(48CPU中)まで飽和しており、スレッドは自ら待機するのではなくスケジューラに強制的にCPUを奪われる非自発的コンテキストスイッチが主要因になっている。同じ「コンテキストスイッチ」という現象でも、I/O待機由来かCPU飽和由来かで対処法(I/O最適化 対 CPUキャパシティ増強・並行度調整)が異なることを、実務事例が具体的に示している。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.2.2, [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 16 ケーススタディ]] §16.1.3, §16.1.7) ## 未解決の問い - KPTI(メルトダウン緩和パッチ)がコンテキストスイッチ時のTLBフラッシュを増加させ性能に影響する具体的なメカニズムを、より詳細な一次資料で確認する余地がある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.4.3) - vDSO・カーネルバイパス・カーネルモードアプリケーション(拡張BPF)といったコンテキストスイッチ回避策が、実際のワークロードでどの程度のオーバーヘッド削減をもたらすか、数値的な比較が必要。 - 16章はCPU飽和による非自発的コンテキストスイッチの実測値(毎秒約200万回)を示したが、この頻度とCPUキャッシュのウォームアップ喪失(IPC低下)との定量的な因果関係(閾値やスケーリング則)までは示していない。どの程度のコンテキストスイッチ頻度からIPC低下が顕著になるかの一般則を、他のケーススタディで確認したい。 ## 関連 - ソース: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 16 ケーススタディ]] - 概念: [[システムコール]] / [[Instructions Per Cycle]] - エンティティ: [[Linux]] / [[Brendan Gregg]] ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]](§3.2.2 モードスイッチ・コンテキストスイッチの定義とオーバーヘッド回避策、§3.2.4.1 非同期割り込みによるコンテキストスイッチの例) - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 16 ケーススタディ]] §16.1.6-16.1.7(VM対コンテナのコンテキストスイッチ頻度・on-CPU時間分布の実測比較)