Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arch輪読: 詳解システムパフォーマンス 第二版 第6章

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Arch輪読: 詳解システムパフォーマンス 第二版 第6章

Avatar for kota-yata

kota-yata

June 22, 2026

More Decks by kota-yata

Other Decks in Programming

Transcript

  1. 6.3.11 プリエンプション 優先度の高い実行可能スレッドが,実行中スレッドからCPUを奪う. 低優先度スレッド: [========= 実行 =] [========= 実行 ======]

    高優先度スレッド: [ キューに追加] [== 実行 ==] ↑ タイマー割り込み Linuxではスレッドごとにスケジューリングポリシーを決められる(kernel/sched/core.c) 期限ベース: SCHED_DEADLINE リアルタイム: SCHED_FIFO, SCHED_RR タイムシェア: SCHED_NORMAL, SCHED_BATCH, SCHED_IDLE スケジューラーは期限ベース→リアルタイム→タイムシェアの順にキューを走査する タイムシェアについてはユーザーが設定できる nice 値を元に重みが決まる より nice 値が小さいほどCPUを占有できる時間が増える 4
  2. 6.3.12 優先度の逆転 高優先度 C ── lock 待ち ─────────────────┐ 低優先度 A

    ── lock 保持 ── preempted ────┤ 中優先度 B ───────────── 実行中 ─────────┘ CはAのロック解放を待つ AはBにCPUを奪われる 結果としてCが,実質的にBに妨げられる 対策の例: 優先度継承 クリティカルセクションを短くする 5
  3. 6.3.13 マルチプロセス / マルチスレッド ←ここでいうスレッドはpthread マルチプロセス マルチスレッド アドレス空間 分離 共有

    通信 IPCが必要 共有メモリ 障害分離 強い 弱い データ同期 比較的単純 ロックが必要 メモリ負荷 大きい 小さい 6
  4. 13

  5. Performance Monitoring Counter (PMC) CPUのアクティビティに関するカウンタ CPUサイクル 命令フェッチ キャッシュアクセス(ヒット/ミス) float演算 メモリIO

    リソースIO 例えばIntel P6では,4つのMSRレジスタでPMCを提供している 2個はevent-select,2個は読み出し専用のカウンタ またArm8-A/9-Aではサイクルカウンタは固定,カウンタは30個ある 19
  6. ソフトウェア: スケジューラ タイムシェアリング プリエンプション CPU間ロードバランシング キャッシュ局所性を考慮したマイグレーション Linuxでは タイマー割り込み scheduler_tick() :

    現在のタスクの使用時間更新,クラスごとのtick呼び出し check_preempt_curr() : wakeupしたタスクと現在タスクの比較(優先度など) __schedule() : need_resched=1 の時,現在のタスクをランキューに戻す pick_next_task() : 次のタスクを選ぶ 21
  7. 6.5.1 ツールメソッド 利用できるツールを順に試し,主要な指標から手がかりを探す. ツール 見るもの uptime , top ロードアベレージの増減 vmstat

    システム全体のCPU使用率 mpstat CPUごとの偏り,ホットCPU top , pidstat CPUを使うプロセス・スレッド perf , profile CPUが使われるコードパス showboost , turbostat , dmesg 周波数低下や温度スロットリング 弱点: ツールで直接見えない問題を見落としやすい. 23
  8. 6.5.2 USEメソッド CPUごとに,ボトルネックとエラーを初期調査する. 観点 CPUでの意味 Utilization アイドル以外を実行していた時間の割合 Saturation 実行可能だがon-CPUを待つスレッド Errors

    corrected error,offline CPUなど エラーは解釈しやすいので最初に確認する 使用率はシステム全体ではなくCPU単位でも見る クラウドでは物理CPUだけでなく,CPUクォータに対する使用率も見る GPUなどのアクセラレータも,取れる指標があれば同じ考え方で見る 24
  9. 6.5.3 ワークロードの特性の把握 ロードアベレージ(使用率 + 飽和度) ユーザー時間 / システム時間の比率 システムコールの頻度 自発的コンテキストスイッチの頻度

    割り込みの頻度 追加で確認する問い: CPU使用率はシステム全体・CPUごと・コアごとでどうか 負荷はどれだけ並列化されているか どのアプリ・ユーザー・カーネルスレッドがCPUを使うか 割り込み,インターコネクト,コールパス,ストールサイクルはどうか 時間帯ごと,時期ごとのそれぞれの特性はどのように変化するか 25
  10. 6.5.7 静的パフォーマンスチューニング 動いているワークロードではなく,構成された環境の問題を調べる. チェック項目: 利用可能なCPU数は何個か.コアかハードウェアスレッドか GPUなどのアクセラレータはあるか,使われているか CPUアーキテクチャ,キャッシュサイズ,共有関係はどうか クロックスピードは固定か動的か.Turbo Boost /

    SpeedStepは有効か BIOSの省電力・バス・CPU関連機能はどう設定されているか プロセッサやBIOSのエラッタに性能問題はあるか マイクロコード更新や脆弱性緩和が性能に影響していないか(?) クラウドではリソース制限も確認する必要がある(cgroup) 28
  11. 6.5.8 優先度のチューニング nice : 正の値で優先度を下げ,負の値で優先度を上げる renice : 実行中プロセスのnice値を変更する 優先度の低い処理例: 監視エージェント,バックアップ,バッチ処理

    効果の確認: 優先度の高い要求のスケジューラレイテンシが下がるか 低優先度側の遅延が許容できるか スケジュールクラスもユーザーレベルで指定できる リアルタイムクラスで無限ループなどのバグを仕込むと管理シェルなど修正に必要なプロ セスがCPUを使えなくなる場合がある 29
  12. 6.5.11 マイクロベンチマーキング 単純な操作を大量に繰り返し,CPUの特定能力を測る. 対象例: CPU命令: 整数演算,浮動小数点演算,ロード/ストア,分岐 メモリアクセス: キャッシュレイテンシ,メモリスループット 高水準言語: インタープリタ/コンパイル言語の処理

    OS操作: getpid(2) ,プロセス作成,パイプスループット どのベンチマークを使う場合でも、システム間で結果を比較するときには、実際に何を テストしているのかを理解していることが大切だ。これらのベンチマークは、ベンチマ ークコードやCPU のスピードではなく、コンパイラの異なるバージョンの間で、コンパ イラの最適化機能をテストするだけになってしまっていることがよくある。 31
  13. 6.9 チューニング 不要な仕事を取り除く 優先順位: 1. 不要な処理をしない 2. 呼び出し回数を減らす 3. データ移動を減らす

    4. 局所性を上げる 5. 高価な演算を置き換える 6. 最後に並列化・CPU固定・OS設定 環境チューニングは,コード上の無駄を隠すことがある. 33