Linux CPU Scheduler CFS/EEVDF/RT 1991-2026(リナックスCPUスケジューラー)
Linux CPU Scheduler 1991-2026 (差別化: 既存systemd init system軸ではなくKernel CPU Scheduler機構軸)。Linux 0.01 1991 (Linus Torvalds・単純Round-Robin)・O(n) Scheduler Linux 2.4 1999 (Time Slice 100ms・大量Process性能劣化)・O(1) Scheduler Linux 2.6 2003 (Ingo Molnar・140 Priority Queue・Active+Expired Array・SMP Load Balance)・SD Staircase Deadline+RSDL Rotating Staircase Deadline (Con Kolivas 2003-2007 不採用)・CFS Completely Fair Scheduler Linux 2.6.23 2007 (Ingo Molnar・Red-Black Tree+Virtual Runtime vruntime・nice -20→+19 Weight・Group Scheduling・10年以上主流)・SCHED_NORMAL+SCHED_BATCH+SCHED_IDLE+SCHED_FIFO+SCHED_RR Real-Time+SCHED_DEADLINE EDF Earliest Deadline First Linux 3.14 2014・cgroups v1 2007+cgroups v2 Linux 4.5 2016 (Tejun Heo・統一階層・CPU+Memory+IO Controller)・PREEMPT_RT Real-Time Preemption Patch (Ingo Molnar 2004-→Linux 6.12 2024 Mainline統合・低遅延)・MuQSS Multiple Queue Skiplist (Con Kolivas 2016)・EEVDF Earliest Eligible Virtual Deadline First Linux 6.6 2023 (Peter Zijlstra・CFS置換・Latency Nice 改善)・sched_ext eBPF Scheduler Linux 6.12 2024 (Tejun Heo+Meta scx_lavd/scx_rusty実装・Userspace定義)・¥0 OSS Kernel組込・2026年EEVDF+sched_ext+PREEMPT_RT統合主流。
概要
Linux カーネルは 1991 年の 0.01 バージョンから CPU スケジューラを進化させてきました。
初期は単純な Round‑Robin で、プロセス数が増えるとスループットが低下しました。
2003 年に Ingo Molnar が導入した O(1) スケジューラは、定数時間でタスクを選択できるようにし、SMP でのロードバランスも実装。
その後 2007 年に登場した CFS(Completely Fair Scheduler)は、Red‑Black Tree と仮想実行時間(vruntime)を用い、優先度を「公平性」に変換しました。
2014 年に SCHED_DEADLINE(EDF)を追加し、リアルタイムタスクのデッドラインを保証。
2024 年に PREEMPT_RT がメインラインに統合され、低遅延でのプリエンプションが可能に。
2023 年には EEVDF(Earliest Eligible Virtual Deadline First)が登場し、CFS の欠点を補完。
2026 年の展望では、EEVDF と sched_ext(eBPF ベースのスケジューラ)と PREEMPT_RT が統合され、リアルタイムと公平性を同時に実現する「統合スケジューラ」が主流になると予測されます。
主な特徴・仕組み
| スケジューラ | 時間計算 | 主なデータ構造 | 目的 | 主要な改良点 |
|---|---|---|---|---|
| O(1) | 定数時間 | 140 優先度キュー + アクティブ/エクスパイア配列 | 低オーバーヘッド | SMP ロードバランス |
| CFS | O(log n) | Red‑Black Tree + vruntime | 公平性 | グループスケジューリング |
| SCHED_DEADLINE | O(log n) | Red‑Black Tree | デッドライン保証 | EDF アルゴリズム |
| PREEMPT_RT | 0‑オーバーヘッド | なし(プリエンプション) | 低遅延 | タスクの即時切替 |
| EEVDF | O(log n) | Red‑Black Tree | 低レイテンシ + 公平性 | vruntime のスケジューリング |
| sched_ext | O(log n) | eBPF プログラム | ユーザー定義 | スケジューラの拡張性 |
- vruntime は「仮想実行時間」で、実際に CPU を占有した時間を重みで割った値。CFS では vruntime が最小のタスクを優先します。
- EEVDF は vruntime を「仮想デッドライン」とみなして、最も早く実行可能なタスクを選びます。これにより、CFS での「スリープ中のタスクが vruntime を増やさない」問題を解消。
- sched_ext は eBPF を利用して、ユーザー空間でスケジューリングポリシーを定義できるようにします。これにより、リアルタイムアプリケーションや組込みシステムでのカスタムスケジューリングが可能。
具体例・対応製品(テーブル必須)
| 製品名・型番 | CPU コア数 | クロック | L3 キャッシュ | メモリ帯域 | スケジューラ構成 | 主要用途 |
|---|---|---|---|---|---|---|
| Intel Xeon E5‑2680 v4 | 8 | 2.4 GHz | 20 MB | 61 GB/s | CFS + PREEMPT_RT | データセンターバックエンド |
| AMD EPYC 7742 | 64 | 2.25 GHz | 256 MB | 256 GB/s | CFS + SCHED_DEADLINE | HFT / クラウド |
| Qualcomm Snapdragon 8 Gen 2 | 8 | 3.0 GHz | 12 MB | 400 GB/s | CFS + PREEMPT_RT | スマートフォン |
| NVIDIA Jetson Xavier NX | 8 | 2.7 GHz | 8 MB | 50 GB/s | CFS + EEVDF | エッジ AI |
| Apple M2 Ultra | 24 | 3.5 GHz | 32 MB | 400 GB/s | CFS + sched_ext | デスクトップ & サーバー |
| Samsung Exynos 2200 | 8 | 2.9 GHz | 12 MB | 200 GB/s | CFS + PREEMPT_RT | ゲーム機 |
| MediaTek Dimensity 9000 | 8 | 3.0 GHz | 12 MB | 150 GB/s | CFS + EEVDF | 5G デバイス |
| IBM Power10 | 48 | 3.5 GHz | 64 MB | 200 GB/s | CFS + SCHED_DEADLINE | HPC |
| Fujitsu A64FX | 48 | 2.2 GHz | 48 MB | 100 GB/s | CFS + PREEMPT_RT | AI トレーニング |
| Huawei Kirin 9000 | 8 | 3.0 GHz | 12 MB | 120 GB/s | CFS + EEVDF | スマートフォン |
数値スペック(10 個以上)
- コア数: 8〜64
- クロック: 2.2〜3.5 GHz
- L3 キャッシュ: 8〜256 MB
- メモリ帯域: 50〜400 GB/s
- vruntime 増分: 1 ns
- EEVDF タイムスロット: 1 ms
- PREEMPT_RT タイムスライス: 0.1 ms
- SCHED_DEADLINE デッドライン: 1 ms〜10 ms
- Red‑Black Tree 深さ: 4〜6
- eBPF プログラムサイズ: 4 KB
選び方・注意点
- ワークロードの特性
- バッチ処理やデータベースは CFS + SCHED_DEADLINE が安定。
- 低レイテンシが要求される HFT や IoT は PREEMPT_RT + EEVDF が有利。
- ハードウェアのサポート
- SMP の数が多い場合は O(1) 以前のスケジューラは非推奨。
- eBPF を利用した sched_ext は Linux 6.12 以降でのみ動作。
- リアルタイムの保証
- デッドラインベースのタスクは SCHED_DEADLINE か EEVDF を選択。
- デッドラインが厳格でない場合は PREEMPT_RT で遅延を最小化。
- メンテナンス性
- カーネルパッチを自前で管理する場合は PREEMPT_RT の統合バージョンを選択。
- カスタムポリシーを必要とする場合は sched_ext を検討。
関連用語との違い
| 用語 | 主な違い | 代表的なユースケース |
|---|---|---|
| systemd init | スケジューラではなく、プロセス起動・管理 | システム起動時のサービス制御 |
| CFS | 公平性に特化 | 通常の Linux デスクトップ・サーバー |
| PREEMPT_RT | 低遅延プリエンプション | 産業用 PLC、車載システム |
| EEVDF | vruntime をデッドライン化 | 低レイテンシ・高スループット |
| sched_ext | eBPF で拡張可能 | カスタムリアルタイム制御、AI 推論 |
よくある質問 (FAQ)
-
Q: PREEMPT_RT を有効にするとシステムが不安定になることがあります。どう対処すべきですか?
A: PREEMPT_RT はカーネル全体をプリエンプティブにします。設定ミスや古いデバイスドライバが原因で不安定になることがあります。まずは最新のカーネルバージョンを使用し、ドライバを更新。必要に応じてCONFIG_PREEMPT_RT_FULLを無効化し、部分的にプリエンプションを有効にすることで安定性を確保します。 -
Q: EEVDF と CFS の主な差は何ですか?
A: CFS は vruntime を最小にするタスクを選びますが、タスクがスリープすると vruntime が増えず、再起動時に不公平になることがあります。EEVDF は vruntime を「仮想デッドライン」とみなし、最も早く実行可能なタスクを優先します。これにより、スリープ中のタスクが vruntime を増やさない問題を解消し、低レイテンシを実現します。 -
Q: sched_ext を使うメリットは何ですか?
A: sched_ext は eBPF を利用してユーザー空間でスケジューリングポリシーを定義できるため、リアルタイム要件や特殊な QoS 要件をカーネルコードを書かずに実装できます。例えば、マルチメディアストリーミングのバッファリング優先度を動的に調整するなど、柔軟な制御が可能です。
まとめ
1991 年から 2026 年にかけて Linux の CPU スケジューラは、単純な Round‑Robin から O(1)、CFS、リアルタイムデッドライン、PREEMPT_RT、EEVDF、sched_ext と進化し、ハードウェアの多様化とアプリケーションの要件に応じた高度な制御を実現しています。
- CFS は公平性を、
- SCHED_DEADLINE はデッドライン保証を、
- PREEMPT_RT は低遅延プリエンプションを、
- EEVDF は低レイテンシと公平性の両立を、
- sched_ext はカスタムポリシーを提供します。
2025–2026 年の動向では、これらの機能が統合され、ユーザー空間でのスケジューリング制御とリアルタイム保証が同時に実現される「統合スケジューラ」が主流になると予測されます。
選択にあたっては、ワークロードの特性、ハードウェアサポート、リアルタイム要件、メンテナンス性を総合的に評価し、最適なスケジューラ構成を決定することが重要です。