スケジューリングポリシー

January 14, 2020

スケジューリングポリシーのクラス

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>  

 © 2023, Dealing with Ambiguity