LinuxのSCHED_DEADLINEの動作確認
Sun Jan 4 19:58:06 JST 2026 (modified: Sun Jan 4 22:53:58 JST 2026)
views: 799, keywords:Linux, SCHED_DEADLINE
書籍のための備忘録なのでなぐり書きです。SCHED_DEADLINEというのは、現行のLinuxのタスクスケジューラで定義されているプロセスの動かし方で、「一定周期内に必ずこのタスクやる(やれなかったら切腹)」というものです。
対象のタスク
こんなシェルスクリプト(./some_task.bash)を書いてみました。無限ループで、SECONDSの値(シェルスクリプトが立ち上がってからの秒数)が変わったら、これまで変数nでカウントした数を秒数と一緒に出力します。
ueda@raspi5:~$ cat some_task.bash
#!/bin/bash
n=1
while true ; do
if [[ "$SECONDS" != "$PREV" ]] ; then
echo $SECONDS $n
PREV=$SECONDS
fi
((n++))
doneとりあえずそのまま実行してみます。ラズパイ5で、1秒にだいたい20万くらいカウントできるみたいです。
ueda@raspi5:~$ chmod +x ./some_task.bash
ueda@raspi5:~$ ./some_task.bash
0 1
1 143742
2 351871
3 559945
Ctrl+C なお、本稿の実験の際はフォークのないシェルスクリプト(かプログラム)を書かないといけません。別にプロセスができると、そいつがスケジューリングの対象から漏れてしまいます。あとで使うchrtコマンドでエラーが出ます。ほんとはsleepさせたいんですが。
SCHED_DEADLINEを指定しての実行
やってみます。chrt -dというコマンドを使います。引数には1回につき1ミリ秒だけ動かし、それを何があっても(?)10ミリ秒以内に終わらせろと指定し、さらに3秒周期ですることを指定します。スクリプトの名前の前の0は優先度です(適当です)。
ueda@raspi5:~$ sudo chrt -d --sched-runtime 1000000 \
--sched-deadline 10000000 --sched-period 3000000000 0 ./some_task.bash
0 1
3 27
6 126
9 373
12 636
Ctrl+C出力のように、3秒につき1ミリ秒しか動いてないので、nの数がぐっと減ってます。秒数のカウントも3秒ごとになってます。ちゃんと指示通り動いてるみたいです。
psで見てみる
上記のスクリプトが動いている間、psで観察してみました。優先度(PRI)が-101となっていますが、これはたぶん最強の範疇の優先度です。3秒に1回だけど絶対に動かせという強い意志を感じます。nice値で優先度が調整できる通常のプロセスではCLS(スケジューリングクラス)がTS(タイムシェアリング)になりますが、some_task.bashはDLN(DEADLINE)となっています。nice値も適用外なので-が表示されています。
ueda@raspi5:~$ ps -eo pid,command,priority,nice,cls,rtprio | grep -e some -e PID
PID COMMAND PRI NI CLS RTPRIO
1523 /bin/bash ./some_task.bash -101 - DLN 0
1528 grep --color=auto -e some - 20 0 TS - ということでうごきました。 いかがでしたでしょうか。 最初、--sched-runtimeをもっと小さい値にしていてうまくいかなかったのですが、案外ループが遅いんだなって思いました。
現場からは以上です。みなさんあけまちんこ、のどちんこ。
ノート
Tweet