# スケジューラレイテンシ
## 定義
スケジューラレイテンシ(scheduler latency)とは、実行可能状態のスレッドがCPUランキュー(またはキューを持たないディスパッチャ)で on-CPU になるのを待つ時間である。ランキューレイテンシ(run-queue latency)・ディスパッチャキューレイテンシ(dispatcher-queue latency)とも呼ばれるが、書籍はキューを持たないディスパッチャタイプにも適用できる「スケジューラレイテンシ」を主用語とする。実行可能状態でランキューにキューイングされているスレッド数はCPUの飽和度を示す重要な指標であり、使用率100%のCPUはスケジューラレイテンシの影響を受けてパフォーマンスが全体として下がる(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.2.3, §6.3.10)。
Linuxではロードアベレージ(CPU・ディスク等システム全体の需要の指数移動平均)やPSI(pressure stall information、Linux 4.20で追加。CPU/メモリ/I/Oごとに独立したストール時間の割合を10秒・60秒・300秒の指数移動平均で示す)から概況を把握できる。より直接的な計測にはBCC/bpftraceのrunqlat(8)(スケジューラのウェイクアップからコンテキストスイッチまでの時間をヒストグラム化)、runqlen(8)(ランキュー長のサンプリング。全コンテキストスイッチを追うrunqlat(8)よりオーバーヘッドが低い代用指標)、perf(1)の`perf sched latency`/`perf sched timehist`を使う(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.6.1.2, §6.6.13.5, §6.6.16, §6.6.17)。
プリエンプション(preemption)は優先度の高いスレッドが実行可能になったときに現在実行中のスレッドからCPUを奪う仕組みで、優先度の高い仕事のスケジューラレイテンシを取り除く。優先度の低いスレッドがロックを保持したまま優先度の高いスレッドの実行をブロックすると優先度の逆転が起こり、優先度の継承(priority inheritance)で解決する(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.3.11, §6.3.12)。
## 横断的知見
- (単一ソースからの立ち上げ。今後の章・別ソースとの突き合わせで知見を蓄積する。)
## 未解決の問い
- 負荷が軽いシステムでも稀に大きなスケジューラレイテンシ(書籍例: 2 CPU・使用率15%のMySQLインスタンスで65〜131m秒)が発生するケースは、ハイパーバイザーによるCPUクォータ制限以外にどのような要因があるか(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.6.16)。
- runqlat(8)(全コンテキストスイッチ計測、高オーバーヘッド)とrunqlen(8)(サンプリング、低オーバーヘッド)のどちらを優先すべきかの判断基準は、システムの負荷率・コンテキストスイッチ頻度からどう定量的に導けるか。
- ロードアベレージ・PSI・runqlat/runqlenという複数の指標があるなかで、ダッシュボード上で優先的にアラートすべき指標はどれか、またそれらの間の使い分けの体系はあるか。
## 関連
- source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]]
- concept: [[CPU利用率]] / [[USE メソッド]]
- entity: [[Brendan Gregg]]
## 出典
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]](§6.2.3 ランキュー、§6.3.10〜§6.3.12 飽和/プリエンプション/優先度の逆転、§6.6.1.2 PSI、§6.6.13.5 perf sched、§6.6.16 runqlat、§6.6.17 runqlen)