# スレッド状態分析 ## 定義 スレッド状態の分析(thread state analysis, TSA)は、著者がすべてのパフォーマンス障害で最初に使うメソドロジであり、目標はアプリケーションのスレッドがどこで時間を費やしているかを高いレベルで知ることである。一部の問題はこれだけで解決し、そうでなくても調査の方向性が明らかになる。スレッドには最低でもon-CPUとoff-CPUの2状態があるが、より効果的な出発点として次の9種類の状態が定義される。ユーザー(ユーザーモードでon-CPU)、カーネル(カーネルモードでon-CPU)、実行可能(runnable、on-CPUの順番待ちでoff-CPUだがいつでも実行可能)、スワッピング(無名ページングのためブロック)、ディスクI/O、ネットワークI/O、スリープ(自発的)、ロック(同期ロック獲得待ち)、アイドル(仕事待ち)。アプリケーション要求のパフォーマンスは、アイドル以外の状態を短縮することで改善される。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] §5.4.5〜§5.4.5.1) Linuxのカーネルスレッド状態はtask_struct構造体のstateメンバー(TASK_RUNNING/TASK_UNINTERRUPTIBLE/TASK_INTERRUPTIBLE、ps(1)・top(1)でR/D/Sと表示)に基づくが、9状態への分類にはより詳細な情報が要る。このメソドロジはもともとマイクロステートアカウンティング機能を持つSolarisカーネルで開発され、Solarisはスレッドの時間をUSR(ユーザー)・SYS(システム)・TRP(トラップ)・TFL(テキストフォールト)・DFL(データフォールト)・LCK(ロック)・SLP(スリープ)・LAT(ランキュー、スケジューラレイテンシ)の8状態に分類して記録する。Linux以外のカーネルは一般により多くの状態を提供し、このメソドロジを適用しやすい。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] §5.4.5.2) Linuxで9状態を割り出す方法は3つある。(1) 関連指標: pidstat(1)の%usr/%system、vmstat(8)のr(実行可能)・si/so(スワッピング)、pidstat(1) -dのiodelay(ディスクI/O)、sar(1) -n DEVのrxKB/txKB(ネットワークI/O)から推測する。(2) off-CPU分析: 9状態の多くがoff-CPUなので、off-CPU分析([[フレームグラフ]]参照)をすればスレッドの状態がわかる。(3) 直接計測: /proc/PID/stat・getrusage(2)(ユーザー/カーネル)、schedstat(実行可能、ナノ秒単位)、遅延アカウンティング(スワッピング)、pidstat(1) -dのiodelay(ディスクI/O)、tcptop(8)等(ネットワークI/O)、naptime.bt(スリープ)、klockstat(8)(ロック)といったツールで正確に計測する。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] §5.4.5.2.1〜§5.4.5.2.3) off-CPU分析は、現在CPUを獲得していないスレッドの分析であり、ディスクI/O・ネットワークI/O・ロックの競合・明示的なスリープ・スケジューラによるプリエンプションなど、スレッドがブロックされるあらゆる理由をカバーする。方法にはサンプリング(壁時計サンプリング)・スケジューラのトレーシング(BCCのoffcputime(8)がベース)・アプリケーションインストルメンテーションの3つがある。10,000個のスレッドを持つシステムでoff-CPUサンプリングを行うとオーバーヘッドが1,000倍以上になりうるため、本番適用には慎重な評価が要る。off-CPU時間の大半は「作業完了を待つ待ち時間」になるため、要求処理関数へのズーム/フィルタや、TASK_UNINTERRUPTIBLE等のカーネルフィルタで意味のあるイベントに絞り込むことが重要になる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]] §5.4.2〜§5.4.2.2) ## 横断的知見 - (このconceptは本ソース1件からの立ち上げ。他のカーネル(FreeBSD・Solaris)のTSAツールや、分散システムのレイテンシ分解手法との突き合わせで横断的知見を蓄積する。) ## 未解決の問い - Linux用のtsastat(8)(pidstat(1)のように複数のスレッド状態欄を持ち変化の過程を出力するツール)は、著者の初版刊行以来誰も実装を試みていないとされる(演習問題として提示)。実装例・後続研究は本wikiに未収載。 - Solarisのマイクロステートアカウンティング(8状態)とLinuxの9状態モデルの対応関係は完全には一致しないとされるが、両者を厳密にマッピングした一次資料はあるか。 - off-CPUサンプリングのオーバーヘッド(最大1,000倍以上)を実用範囲に抑えるための最適化(しきい値フィルタ、BPFでのカーネルコンテキスト集約以外)は他にどのようなものがあるか。 ## 関連 - ソース: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]](§5.4.2, §5.4.5) - 書籍: [[詳解 システム・パフォーマンス 第2版]] - 概念: [[フレームグラフ]] / [[USE メソッド]] - エンティティ: [[Brendan Gregg]] ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 5 アプリケーション]](§5.4.2 off-CPU分析、§5.4.5 スレッド状態の分析)