#経緯
組込みLinux上で動作するプロセスの周期タイマに遅延が起こっており、CPUトレースを取得してタスクのコンテキストスイッチの状態を調査していた。すると、通常スレッドがリアルタイムスレッドの優先度を上回っているところがあった。
タスク優先度の逆転現象というのは一般的に資源の排他制御が原因で起こると思われるが、今回は同一資源を使用していないスレッド同士で優先度の逆転現象が起こっていたため原因を調べてみた。
#調査結果
今回のタスク優先度の逆転現象は、「帯域幅制限メカニズム」によるものであった
Linuxではリアルタイムスレッドが無限ループなどに落ち着いたときCPUを占有してしまい、他の処理が実行されなくなる恐れがある。その対策として、Linux カーネル 2.6.25 以降ではCPUを独占する可能性のあるリアルタイムスレッドからCPUを保護する機能が追加された。この機能を「帯域幅制限メカニズム」と呼ぶ。
このメカニズムは、以下の /proc ファイルシステムパラメーターで調整できる。
/proc/sys/kernel/sched_rt_period_us
CPU 帯域幅の 100% と考えられる時間をマイクロ秒で定義する。
デフォルト値は 1000000マイクロ秒。
/proc/sys/kernel/sched_rt_runtime_us
リアルタイムスレッドの実行に当てられる時間をマイクロ秒で定義する。
デフォルト値は 950000マイクロ秒。
この値を-1に設定すると、帯域制御メカニズムが機能しなくなる。
sched_rt_runtime_usの値は以下のように設定する。
$ sudo sysctl -w kernel.sched_rt_runtime_us=980000
kernel.sched_rt_runtime_us = 980000
※98ミリ秒に設定する場合
#参考文献
この記事は以下の情報を参考にして執筆しました。
・パフォーマンスチューニングガイド Red Hat 4.2. CPU のスケジューリング
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-cpu-scheduler
・Tech Knowledge RT Throttling と RT Group Scheduling
https://blog.longest-road.com/contents/?p=1236