近年、産業機器を中心に「リアルタイムLinux」の採用が進んでおり、当社でもリアルタイム性が求められるシステム開発のご相談が増えています。

リアルタイムLinuxとは、標準のLinuxカーネルにリアルタイム性を付与するための各種拡張(例:PREEMPT_RTパッチ)を適用し、決められた期限内に処理を完了させることを重視したLinuxの総称です。 本稿では、リアルタイムLinux全般の基本構造やスケジューリング、CPUアフィニティ・アイソレーションの考え方、そして導入時に遭遇しやすいトラブル事例について解説します。

スケジューリングポリシーと優先度

Linuxではプロセスにスケジューリングポリシーが設定されており、このポリシーによって優先度の範囲や振る舞いが決まります。

スケジューリングポリシーは「リアルタイムポリシー」と「通常ポリシー」に分類されます。

  • リアルタイムポリシー: 静的優先度により厳密な順序で実行され、リアルタイム性が重要な処理に使用
  • 通常ポリシー: nice値に基づく動的優先度により、CPU時間を公平に分配

主要なスケジューリングポリシーは以下のとおりです:

優先順位 ポリシー 優先度 nice値 備考
SCHED_DEADLINE ( 0 ) リアルタイムポリシー
SCHED_FIFOSCHED_RR 99(高)~1(低) リアルタイムポリシー
SCHED_OTHERSCHED_BATCHSCHED_IDLE 0 -20(高)~19(低) 通常ポリシー

リアルタイム処理では主にSCHED_FIFO(先入れ先出し)とSCHED_RR(ラウンドロビン)が使用されます。

CPUアフィニティの活用

CPUアフィニティ(CPU affinity)は、プロセスやスレッドを特定のCPUコアに固定して実行する機能です。リアルタイムLinuxにおいて、CPUアフィニティの適切な設定は安定したリアルタイム性能を実現するために重要な要素の一つです。

CPUアフィニティの効果

マルチコアシステムにおいて、プロセスが異なるCPUコア間を移動すると以下のオーバーヘッドが発生します:

  • キャッシュミス: 別のCPUコアに移動した際、そのコアのキャッシュにデータが存在しないため再読み込みが必要
  • メモリアクセスレイテンシ: NUMA(Non-Uniform Memory Access)環境では、遠いメモリノードへのアクセス時間が増加
  • コンテキストスイッチコスト: CPUコア間の移動に伴うスケジューラのオーバーヘッド

CPUアフィニティを設定することで、これらのオーバーヘッドを削減し、より予測可能なレイテンシを実現できます。

CPUアフィニティの設定方法

tasksetコマンドによる設定

# CPU0でプロセスを実行
$ taskset -c 0 ./realtime_process

# 既存プロセスのCPUアフィニティをCPU1に変更
$ taskset -cp 1 <PID>

# CPUアフィニティの確認
$ taskset -p <PID>

CPUアイソレーション

リアルタイム性をより高めるため、特定のCPUコアをリアルタイムタスク専用に分離する「CPUアイソレーション」も効果的です。

isolcpusとは

isolcpusは、カーネル起動時に指定したCPUコアをスケジューラの自動負荷分散や一般プロセスの割り当て対象から除外し、ユーザーが明示的にアフィニティを設定したタスクだけを実行できるようにするカーネルパラメータです。これにより、リアルタイムタスク専用のCPUコアを確保しやすくなります。

# カーネルパラメータでCPU0,1をアイソレート
isolcpus=0,1 nohz_full=0,1 rcu_nocbs=0,1

isolcpusで指定したCPUは、通常のスケジューラによるプロセス移動や自動割り当ての対象外となりますが、カーネルスレッドや割り込み、workqueueなど一部のシステムタスクは残る場合があります。そのため、完全な分離を目指す場合はnohz_fullrcu_nocbs、IRQアフィニティ、workqueueのcpumask調整、さらにcpuset cgroupとの併用が推奨されます。

これらの設定により、指定したCPUコアではシステムタスクやカーネルワーカーが実行されにくくなり、リアルタイムタスクがより安定して動作できます。

トラブル事例

リアルタイムタスクの実行が途切れる

Linuxでは、リアルタイムプロセスがCPUを長時間占有してしまい、他の通常ポリシーのプロセスが実行できなくなることを防ぐため、「リアルタイムスロットリング」という仕組みが用意されています。

この仕組みにより、リアルタイムポリシーに設定したプロセスが「一定時間以上CPUを占有し続ける」と、Linuxカーネルが強制的にそのプロセスを一時停止させ、タスクの実行が途切れる(思った通りに動かない)現象が発生します。その際、以下のようなログが出力される場合があります。

sched: RT throttling activated

リアルタイムプロセスはリアルタイム性を実現するために有効ですが、特定のプロセスがCPUを占有し続ける設計になっている場合、意図せずスロットリングが発動しやすくなるため注意が必要です。

リアルタイムスロットリングの仕組み

スロットリングは主に2つのパラメータで制御されます。

パラメータ デフォルト値 説明
sched_rt_period_us 1000000 (1秒) スケジューリング周期の基準時間
sched_rt_runtime_us 950000 (0.95秒) 周期内でリアルタイムプロセスが使用可能な時間

リアルタイムスロットリングの設定方法

現在の設定値の確認

# 現在の設定値を確認
$ cat /proc/sys/kernel/sched_rt_period_us
1000000
$ cat /proc/sys/kernel/sched_rt_runtime_us  
950000

パラメータの調整

# より長い実行時間を許可(例:周期2秒、実行時間1.9秒)
$ echo 2000000 > /proc/sys/kernel/sched_rt_period_us
$ echo 1900000 > /proc/sys/kernel/sched_rt_runtime_us

リアルタイムスロットリングの無効化

# リアルタイムスロットリングを完全に無効化(注意が必要)
$ echo -1 > /proc/sys/kernel/sched_rt_runtime_us

⚠️ 注意: スロットリングを無効化すると、リアルタイムプロセスの暴走時にシステムが応答しなくなる可能性があります。

永続的な設定

# sysctl.confに追加して再起動後も設定を維持
kernel.sched_rt_period_us = 2000000
kernel.sched_rt_runtime_us = 1900000

リアルタイムスロットリング発生の典型的な原因と対策

実際の開発現場でリアルタイムスロットリング警告が発生する典型的なケースとして、CPU構成やCPUアフィニティの設定不備があります。

シングルCPU環境での問題

シングルCPU環境では、リアルタイムタスクとシステムタスク(カーネルワーカー、割り込み処理など)が同一CPU上で競合するため、リアルタイムタスクがCPUを長時間占有しやすくなります。

この場合の対策:

  1. リアルタイムスロットリングパラメータの調整
  2. リアルタイムタスクの実行時間の見直し
  3. 可能であればマルチCPU構成への変更

CPUアフィニティ設定不備による問題

マルチCPU環境でも、CPUアフィニティが適切に設定されていないと、リアルタイムタスクが複数のCPUコア間を移動し、システム全体のCPU使用率が上昇してスロットリングが発動する場合があります。

まとめ

本稿では、リアルタイムLinuxの基本構造やスケジューリング、CPUアフィニティ・アイソレーション、リアルタイムスロットリングの仕組みとその対策など、産業機器開発で現場が直面しやすい課題と解決策を解説しました。

リアルタイムLinuxを活用することで、一般的なLinuxでは難しい「決められた期限内での処理完了」や「予測可能なレイテンシの実現」が可能となります。一方で、リアルタイム性を最大限に引き出すには、カーネルパラメータやCPUアフィニティ、アイソレーション、システム設計全体の最適化が不可欠です。

特にリアルタイムスロットリングは、システムの安全性を守る一方で、リアルタイム性を阻害する要因にもなり得ます。現場では「なぜ思った通りに動かないのか」「どこを調整すればよいのか」といった悩みが多く、正しい知識とノウハウが求められます。

今後はPREEMPT-RTのメインライン統合など、リアルタイムLinuxの普及がさらに進むことが予想されます。産業機器やロボット、通信、医療など幅広い分野で、より高度なリアルタイム制御が求められる時代に備え、基礎から応用まで体系的に理解しておくことが重要です。

ミラクシアエッジテクノロジーでは、リアルタイムLinuxを活用した組み込みシステム開発やパフォーマンスチューニング、トラブルシュートの豊富な実績をもとに、お客様の課題に合わせた最適な技術支援・コンサルティングを提供しています。要件定義から設計・実装・検証・運用まで、どのフェーズでもお気軽にご相談ください。

▶️ お問い合わせはこちらから:https://www.miraxia.com/contact/business-agreement/

採用情報

ミラクシアでは一緒に組込みソフト開発をする仲間を募集しています。