LastUpdate, '17/01/09 記事紹介を追加
LastUpdate, '16/09/13 新規作成

Linuxスケジューラ@らるるのわがまま

Linuxスケジューラ回りの話をだらだらと書く。

スケジュールポリシー

概要

概要とここで書いたことの途中くらいまでを丁寧に解説した記事を見つけたので紹介がてらぺたぺた...
Linux スケジューラーのコア実装とシステムコール

スケジューラとはなんや?からリアルタイムスケジューラあたりまでの話はこのへんでも見ながら予習しておいてもらった方が、下記の話についていけると思われる。

スケジュールポリシーの種類

Linuxでは、POSIX標準の に加えて、下記3つに拡張対応している。 SCHED_DEADLINE, SCHED_FIFO, SCHED_RR の3つはいわゆるリアルタイムスケジュール、SCHED_OTHER, SCHED_BATCH, SCHED_IDLEの3つはタイムシェアスケジュールとなる。

スケジューリングポリシーは sched_setscheduler(2), pthread_setschedparam(3) で設定する。

priority

リアルタイムスケジュールでは、SCHED_DEADLINEをのぞき、priorityを設定できる。priorityは優先度の高い(数値の小さい)ものからスケジューリングされる。

priorityは sched_setparam(2), pthread_setschedprio(3) で設定する。

nice

タイムシェアスケジュールでは、SCHED_IDLEをのぞき、nice値を設定できる。priorityは優先度の高い(数値の小さい)ものに多くCPU時間が割り当たるように(CFSの場合は)スケジューリングされる。

nice値は setpriority(2) で設定する。Linuxではsetpriority()が拡張されていて、tidを指定するとスレッドのnice値を設定できる。ただ、gettid(2) は syscall しないといけなかったりするので注意。

テーブルにまとめる

SCHED priority nice sched ordered
SCHED_DEADLINE (none) (none) 1st at first
SCHED_FIFO avail (none) 2nd by priority
SCHED_RR avail (none) 2nd by priority, but timeout
SCHED_OTHER (none) avail 3rd timeshare with nice weight
SCHED_BATCH (none) avail 3rd timeshare with nice weight
SCHED_IDLE (none) (none) 4th timeshare

確認方法

# ps alxHww
top して H でスレッド表示する
など。/proc/[pid]/statで確認する方法もあるが、statの文字列をパースするのが面倒とかなんとか。

動的に変更する

util-linux の chrt(1) が使える。あまりに古いバージョンだと SCHED_IDLE や SCHED_DEADLINE に対応していないので注意。busy box の chrt は機能が限定される。
- # chrt -a -p 29624 (PID が 29624 のプロセスの全スレッドをチェックする)
- # chrt -f -p 29624 (TID が 29624 のスレッドを SCHED_FIFO にする)
- # chrt -p 10 -p 29624 (TID が 29624 のスレッドの priority を 10 にする)

util-linux の renice が使える。
- # renice -n +10 -p 29624 (TID が 29624 のスレッドの nice値を +10 する)
nice値の操作は相対的なので注意。

Capability

POSIX的には、「上げる」方向の変更にはスーパユーザ権限が必要になる。「下げる」方向には特に権限は必要ない。

Linuxでは、スーパユーザ権限以外に、CAP_SYS_NICE の Capability の権限でも同様のことが行える。Capability のチェックは libcap の getpcaps で行える。
- # getpcaps 29624 (PID が 29624 のプロセスの Capability を表示する)

CFS (Completely Fair Scheduler)

概要

Linux-2.6.23 (9th October, 2007)から、CFS(Completely Fair Scheduler)というスケジューラが入っており、これが現在までのデファクトとなっている。

パラメータ

/proc/sys/kernel/sched/* にいくつかのパラメータが存在する。レイテンシにも関わるため要注意。

cgroups

cgroupsを設定することにより、cgroups単位で CPU, memory, network, filesystem namespace などの制限を掛けることができる。今興味があるのはスケジューラなので、特にCPU回りについて書くと、 他にも cgroups に対応した CFS のパラメータがあるため、柔軟に CPU時間の制限を記述できる。

IO scheduler

CFQ というIOスケジューラが長く使われてきたが、これはHDDをターゲットに最適化されたスケジューラであるため、USBメモリ・SDカード・eMMC・SSDが全盛期となってきた今では CFQ のままにしておく意味があまりない。

かといって、これといったいいIOスケジューラがあるわけでもない。ただ CFQ のままだとレイテンシが悪いので、とりあえず noop や deadline にしておくのがよいと思われる。

サイトのトップへ
管理者にメール: rarul@rarul.com
リンクはご自由に。