スケジューリングポリシーのクラス
Linux におけるスケジューリングポリシーのクラスは大きく 2 つに分けられ、TSS (Time Sharing System) クラスとリアルタイムクラスがある。
一般的なプロセスはプロセスが割り当てられた時間 (タイムスライス) だけ CPU リソースを使用し、その後は他のプロセスが CPU リソースを使用する形となる。このように時分割で動作するスケジューリングポリシーのクラスを TSS クラスと呼ぶ。
一方、実時間保証が求められるような処理では、静的な実行優先度を指定し、それに従ったスケジューリングが必要となる。そのようなプロセスにはリアルタイムクラスのスケジューリングポリシーを適用することで、TSS クラスのプロセスより優先して CPU リソースを割り当てることができる。
なお、Linux において、プロセスの静的な優先度は 0 - 99 まで存在し、TSS クラスの優先度は 0 、リアルタイムクラスの優先度は 1 - 99 を指定可能となる。
スケジューリングポリシーの種類
Amazon Linux AMI (4.14.154-99.181.amzn1.x86_64) では、以下のスケジューリングポリシーが定義されている。
- SCHED_OTHER
- SCHED_FIFO
- SCHED_RR
- SCHED_BATCH
- SCHED_DEADLINE
- SCHED_IDLE
それぞれ簡単に説明する。
SCHED_OTHER
Linux における標準のスケジューリングポリシーとなり、TSS クラスのスケジューリングポリシーである。
Linux カーネル 2.6.23 以降の CFS (Completely Fair Scheduler) では、全ての TSS クラスのプロセスには公平に CPU 時間が割り当てられるようになっており、またそのタイムスライスは動的に決まる。
SCHED_FIFO
リアルタイムクラスのスケジューリングポリシーであり、プロセスに指定可能な優先度は 1 - 99 となる。SCHED_FIFO が指定されたプロセスは I/O 待ちになるか自発的に休止する、またはより優先度の高いリアルタイムクラスのプロセスによるプリエンプション発生以外に実行権を手放すことはない。
つまり、リアルタイムクラスのプロセスが無限ループに陥ると、他の全ての優先度の低いプロセスが永久に実行権を得られなくなり、システムがフリーズする可能性がある。
SCHED_RR
SCHED_RR もリアルタイムクラスのスケジューリングポリシーとなる。SCHED_FIFO とは異なり、タイムスライスを持つ。タイムスライスを使い切った場合は、他のプロセスに実行権が移る。
CFS 導入時に SCHED_RR のタイムスライスが固定の 100 ms に見直された。
SCHED_BATCH
SCHED_BATCH が指定されたプロセスは対話型ではないと見なされ、休止時間による優先度の変更が行われなくなる。バックアップ処理等は I/O 待ちにより停止することが多い。TSS クラスのスケジューリングポリシーではこの休止によりバックアッププロセスの優先度が上がり、応答性が求められるシェル等の優先度が相対的に低くなってしまい、結果としてシステムの応答性が低下する可能性がある。
CFS では SCHED_BATCH と SCHED_OTHER はほとんど変わらない。
SCHED_DEADLINE
デッドラインが近いプロセスを優先して実行するようなスケジューリングポリシーで新しく導入されたクラス。TSS クラスやリアルタイムクラスよりも優先度が高くなる。
SCHED_IDLE
CFS で導入された新しいクラスとなり、SCHED_IDLE クラス以外の実行可能状態なプロセスが存在しない場合にのみ実行権が与えられる。一番優先度が低いプロセスとなる。
chrt コマンド
ユーザーがスケジューリングポリシーを変更するためのコマンドとして chrt コマンドがある。
$ chrt --help
Show or change the real-time scheduling attributes of a process.
Set policy:
chrt [options] <priority> <command> [<arg>...]
chrt [options] --pid <priority> <pid>
Get policy:
chrt [options] -p <pid>
Policy options:
-b, --batch set policy to SCHED_BATCH
-d, --deadline set policy to SCHED_DEADLINE
-f, --fifo set policy to SCHED_FIFO
-i, --idle set policy to SCHED_IDLE
-o, --other set policy to SCHED_OTHER
-r, --rr set policy to SCHED_RR (default)
Scheduling options:
-R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR
-T, --sched-runtime <ns> runtime parameter for DEADLINE
-P, --sched-period <ns> period parameter for DEADLINE
-D, --sched-deadline <ns> deadline parameter for DEADLINE
Other options:
-a, --all-tasks operate on all the tasks (threads) for a given pid
-m, --max show min and max valid priorities
-p, --pid operate on existing given pid
-v, --verbose display status information
-h, --help display this help and exit
-V, --version output version information and exit
For more details see chrt(1).
実際にスケジューリングポリシーを指定するには以下のように行う。
$ chrt -i 0 tar xvf linux-5.4.11.tar.xz
動作中のプロセスのスケジューリングポリシーの変更も PID を指定することで可能。
$ sudo chrt -p -r 99 <pid>