スケジューリング

CPUリソースの配分

プロセススケジューラとは

スケジューラは、どのプロセスにCPU時間を割り当てるかを決定するカーネルコンポーネントです。 複数のプロセスが同時に実行可能な状態でも、CPUは一度に1つ(コアあたり)の プロセスしか実行できないため、スケジューラが公平かつ効率的に配分します。

CFS(Completely Fair Scheduler)

Linux標準のスケジューラ。仮想実行時間(vruntime)に基づき、 最も実行時間の少ないプロセスを優先。赤黒木で管理し、O(log n)の効率。

vruntimeが最小のプロセスを次に実行

vruntime: 100ms
(次に実行)
vruntime: 150ms
vruntime: 200ms

優先度とnice値

nice値

  • • 範囲: -20 〜 +19
  • 低いほど優先度が高い
  • • デフォルト: 0
  • • 負の値はroot権限が必要

静的優先度(priority)

  • • 範囲: 0 〜 139
  • • 0-99: リアルタイム
  • • 100-139: 通常(nice対応)
  • • PR = 20 + nice
1# nice値を指定して実行
2nice -n 10 ./heavy_task.sh
3
4# 実行中プロセスのnice値変更
5renice -n 5 -p <PID>
6
7# 優先度確認
8ps -eo pid,ni,pri,comm
9top # NI列とPR列
10
11# ionice(I/O優先度)
12ionice -c 3 -p <PID> # アイドル優先度

スケジューリングクラス

SCHED_FIFOリアルタイム、先入れ先出し、プリエンプションなし
SCHED_RRリアルタイム、ラウンドロビン、タイムスライスあり
SCHED_OTHER (SCHED_NORMAL)通常プロセス、CFSが管理
SCHED_BATCHバッチ処理、インタラクティブ性を犠牲にスループット重視
SCHED_IDLE最低優先度、CPUが空いている時のみ実行
1# スケジューリングポリシー確認
2chrt -p <PID>
3
4# リアルタイム優先度で実行(要root)
5chrt -f 99 ./realtime_task
6chrt -r 50 ./realtime_task

CPU親和性(Affinity)

プロセスを特定のCPUコアに固定する設定。 キャッシュ効率向上、NUMA最適化、リソース隔離に使用。

1# CPU親和性確認
2taskset -p <PID>
3
4# CPU 0,1 に固定して実行
5taskset -c 0,1 ./my_task
6
7# 実行中プロセスの親和性変更
8taskset -pc 0,2 <PID>
9
10# cgroupsでCPU制限
11# /sys/fs/cgroup/cpu/...

cgroups(Control Groups)

cgroupsは、プロセスグループに対するリソース制限・監視・隔離を提供。 Dockerやsystemdが内部で使用しています。

cpu

CPU時間の制限・配分

memory

メモリ使用量制限

blkio

ブロックI/O制限

cpuset

CPU/メモリノード割り当て

SRE/インフラ観点

監視項目

  • CPU使用率: user、system、iowait
  • ロードアベレージ: 実行可能+I/O待ちプロセス数
  • コンテキストスイッチ: vmstat の cs 列

コンテナ環境

  • • Kubernetes: requests/limits でCPU制限
  • • Docker: --cpus, --cpu-shares オプション
  • • cgroups v2が標準化傾向
1# ロードアベレージ確認
2uptime
3cat /proc/loadavg
4
5# コンテキストスイッチ確認
6vmstat 1
7
8# プロセスごとのCPU使用
9pidstat 1