スケジューリング
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値を指定して実行 2 nice -n 10 ./heavy_task.sh 3 4 # 実行中プロセスのnice値変更 5 renice -n 5 -p <PID> 6 7 # 優先度確認 8 ps -eo pid,ni,pri,comm 9 top # NI列とPR列 10 11 # ionice(I/O優先度) 12 ionice -c 3 -p <PID> # アイドル優先度
スケジューリングクラス
SCHED_FIFOリアルタイム、先入れ先出し、プリエンプションなし
SCHED_RRリアルタイム、ラウンドロビン、タイムスライスあり
SCHED_OTHER (SCHED_NORMAL)通常プロセス、CFSが管理
SCHED_BATCHバッチ処理、インタラクティブ性を犠牲にスループット重視
SCHED_IDLE最低優先度、CPUが空いている時のみ実行
1 # スケジューリングポリシー確認 2 chrt -p <PID> 3 4 # リアルタイム優先度で実行(要root) 5 chrt -f 99 ./realtime_task 6 chrt -r 50 ./realtime_task
CPU親和性(Affinity)
プロセスを特定のCPUコアに固定する設定。 キャッシュ効率向上、NUMA最適化、リソース隔離に使用。
1 # CPU親和性確認 2 taskset -p <PID> 3 4 # CPU 0,1 に固定して実行 5 taskset -c 0,1 ./my_task 6 7 # 実行中プロセスの親和性変更 8 taskset -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 # ロードアベレージ確認 2 uptime 3 cat /proc/loadavg 4 5 # コンテキストスイッチ確認 6 vmstat 1 7 8 # プロセスごとのCPU使用 9 pidstat 1