RT Throttling と RT Group Scheduling

January 14, 2020

リアルタイムクラスの制御

リアルタイムクラスのスケジューリングポリシーが適用されたプロセスは静的な優先度を持ち、他の一般プロセス (TSS クラス等) に比べて優先度が高く、実行が必要な場合は必ず CPU リソースが割り当てられることになる。もし、リアルタイムクラスのプロセスが無限ループに落ちいた際は CPU を占有してしまい、最悪他の処理が全くできなくなってしまう可能性がある。
そこで、Linux カーネル 2.6.25 以降ではリアルタイムクラスプロセスの CPU 時間を制御するための RT Throttling 及び RT Group Scheduling が導入され、上記のような場合でも 他のプロセスへの実行権の切り替えを可能とし、システムが完全にフリーズする問題を回避することができるようになった。

RT Throttling

RT Throttling はリアルタイムクラスのプロセスに割り当てる CPU 時間を制限する機能となる。例えばリアルタイムクラスのスケジューリングポリシーが適用されたプロセスが無限ループに陥ると、他のプロセスがスケジューリングされなくなる恐れがあり、システムがハングしてしまう。
そこで、リアルタイムクラスに割り当てられる単位時間あたりの CPU 時間を制限することで、リアルタイムクラスのスケジューリングポリシーが適用されたプロセスのバグ等からシステムを保護することが可能となる。

システム全体での CPU 時間の制限は sysctl により取得* 設定が可能となる。
以下は現在の値の取得例となり、単位時間が 1 秒、CPU 割り当て量が 0.95 秒となっている。

$ sysctl -n kernel.sched_rt_period_us  
1000000  
$ sysctl -n kernel.sched_rt_runtime_us  
950000  

実際に値を設定するには以下のように行う。

$ sudo sysctl -w kernel.sched_rt_runtime_us=980000  
kernel.sched_rt_runtime_us = 980000  

なお、sched_rt_runtime_us は Cgroup で設定されている rt_runtime_us の合計値を下回ることはできない。これをやると以下のようなエラーとなる。(参考)

$ sudo sysctl -w kernel.sched_rt_runtime_us=900000  
error: "Invalid argument" setting key "kernel.sched_rt_runtime_us"  

なお、sched_rt_runtime_us に -1 を指定するとリアルタイムプロセスに対する CPU 時間の制限は無くなり、カーネルにこの機能が導入される前と同様の動作となる。

$ sudo sysctl -w kernel.sched_rt_runtime_us=-1  
kernel.sched_rt_runtime_us = -1  

また、proc ファイルシステムからももちろんこれらの値は参照可能。

$ cat /proc/sys/kernel/sched_rt_period_us   
1000000  
$ cat /proc/sys/kernel/sched_rt_runtime_us   
980000  

一般的には sysctl での設定は有効* 無効の切り替えのみに使用し、個々の設定は Cgroup を使って行うのが良い。

RT Group Scheduling

RT Group Scheduling は Cgroup のサブシステムとなり、グループ単位で RT Throttling の単位時間と CPU 割り当て時間を設定できる。

$ sudo mount -t cgroup cgoup /cgroup  
$ ls -l /cgroup/ | grep cpu.rt  
-rw-r--r-- 1 root root 0 Jan 14 08:55 cpu.rt_period_us  
-rw-r--r-- 1 root root 0 Jan 14 08:55 cpu.rt_runtime_us  

他の Cgroup と同様 cgroup ファイルシステムを通じて設定を行うことが可能。

$ cat /cgroup/cpu.rt_period_us   
1000000  
$ cat /cgroup/cpu.rt_runtime_us   
950000  

 © 2023, Dealing with Ambiguity