3.9. scheduler TuneD プラグインの機能
scheduler
TuneD プラグインを使用して、スケジューリングの優先度、CPU コアの分離、プロセスアフィニティー、スレッドアフィニティー、および IRQ アフィニティーを制御および調整します。
CPU の分離
プロセス、スレッド、および IRQ が特定の CPU を使用しないようにするには、isolated_cores
オプションを使用します。これは、プロセスおよびスレッドアフィニティー、IRQ アフィニティーを変更し、IRQ の default_smp_affinity
パラメーターを設定します。
CPU アフィニティーマスクは、sched_setaffinity()
システムコールの成功を条件として、ps_whitelist
オプションに一致するすべてのプロセスとスレッドに対して調整されます。ps_whitelist
正規表現のデフォルト設定は、すべてのプロセスおよびスレッド名に一致する .*
です。特定のプロセスおよびスレッドを除外するには、ps_blacklist
オプションを使用します。このオプションの値も正規表現として解釈されます。プロセス名とスレッド名は、その正規表現と照合されます。プロファイルロールバックにより、一致するすべてのプロセスとスレッドがすべての CPU で実行され、プロファイルアプリケーションの前に IRQ 設定が復元されます。
ps_whitelist
オプションおよび ps_blacklist
オプションで、;
で区切った複数の正規表現がサポートされます。エスケープされたセミコロン \;
はそのまま使用されます。
例3.9 CPUs 2-4 の分離
以下の設定は CPU 2-4 を分離します。ps_blacklist
正規表現に一致するプロセスおよびスレッドは、分離に関係なく任意の CPU を使用できます。
[scheduler] isolated_cores=2-4 ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*
IRQ SMP アフィニティー
/proc/irq/default_smp_affinity
ファイルには、すべての非アクティブな割り込み要求 (IRQ) ソース用のシステム上のデフォルトのターゲット CPU コアを表すビットマスクが含まれます。IRQ がアクティブまたは割り当てられると、/proc/irq/default_smp_affinity
ファイルの値は IRQ のアフィニティービットマスクを決定します。
default_irq_smp_affinity
パラメーターは、TuneD が /proc/irq/default_smp_affinity
ファイルに書き込むものを制御します。default_irq_smp_affinity
パラメーターは、以下の値と動作をサポートします。
calc
isolated_cores
パラメーターから/proc/irq/default_smp_affinity
ファイルの内容を計算します。isolated_cores
パラメーターの反転は、分離していないコアを計算します。次に、分離されていないコアの交差部分と、
/proc/irq/default_smp_affinity
ファイルの以前の内容が/proc/irq/default_smp_affinity
ファイルに書き込まれます。これは、
default_irq_smp_affinity
パラメーターが省略された場合のデフォルトの動作です。ignore
-
TuneD は、
/proc/irq/default_smp_affinity
ファイルを変更しません。 - CPU リスト
1
などの単一の数値、1,3
などのコンマ区切りのリスト、または3-5
などの範囲の形式を取ります。CPU リストを展開し、これを
/proc/irq/default_smp_affinity
ファイルに直接書き込みます。
例3.10 明示的な CPU リストを使用したデフォルトの IRQ smp アフィニティーの設定
以下の例では、明示的な CPU リストを使用して、デフォルトの IRQ SMP アフィニティーを CPU 0 および 2 に設定します。
[scheduler] isolated_cores=1,3 default_irq_smp_affinity=0,2
スケジューリングポリシー
プロセスまたはスレッドのグループのスケジューリングポリシー、優先度、およびアフィニティーを調整するには、以下の構文を使用します。
group.groupname=rule_prio:sched:prio:affinity:regex
ここで rule_prio
は、ルールの内部 TuneD 優先度を定義します。ルールは優先度に基づいてソートされます。これは、継承が以前に定義されたルールを並べ替えることができるようにするために必要です。同等の rule_prio
ルールは、定義された順序で処理される必要があります。ただし、これは Python インタープリターに依存します。groupname
の継承されたルールを無効にするには、以下を使用します。
group.groupname=
sched
は以下のいずれかである必要があります。
f
- 先入れ先出し (FIFO)
b
- バッチ
r
- ラウンドロビン
o
- その他
*
- 変更対象外
affinity
は 16 進数での CPU アフィニティーです。変更しない場合は *
を使用します。
prio
はスケジューリングの優先度です (chrt -m
を参照)。
regex
は Python の正規表現です。これは、ps -eo cmd
コマンドの出力と照合されます。
指定したプロセス名は、複数のグループに一致させることができます。このような場合、最後に一致する regex
により、優先順位とスケジューリングポリシーが決まります。
例3.11 スケジューリングポリシーおよび優先度の設定
以下の例では、スケジューリングポリシーと優先度をカーネルスレッドおよびウォッチドッグに設定します。
[scheduler] group.kthreads=0:*:1:*:\[.*\]$ group.watchdog=0:f:99:*:\[watchdog.*\]
scheduler
プラグインは、perf
イベントループを使用して、新しく作成されたプロセスを識別します。デフォルトでは、perf.RECORD_COMM
および perf.RECORD_EXIT
のイベントをリッスンします。
perf_process_fork
パラメーターを true
に設定すると、プラグインに対して perf.RECORD_FORK
イベントもリッスンするように指示します。つまり、fork()
システムコールによって作成された子プロセスが処理されます。
perf
イベントの処理には大量の CPU オーバーヘッドが発生する可能性があります。
スケジューラープラグインの CPU オーバーヘッドは、スケジューラー runtime
オプションを使用して 0
に設定することで軽減できます。これにより、動的スケジューラー機能が完全に無効になり、perf イベントは監視されず、処理されません。これによるデメリットは、プロセスとスレッドの調整がプロファイルアプリケーションでのみ実行されることです。
例3.12 動的スケジューラー機能の無効化
以下の例では、CPU 1 と 3 を分離しながら、動的スケジューラー機能を無効にします。
[scheduler] runtime=0 isolated_cores=1,3
mmapped
バッファーは perf
イベントに使用されます。負荷が大きい場合、このバッファーがオーバーフローする可能性があり、プラグインが欠落しているイベントを開始し、新しく作成されたプロセスを処理しない可能性があります。このような場合は、perf_mmap_pages
パラメーターを使用してバッファーサイズを増やします。perf_mmap_pages
パラメーターの値は 2 の累乗である必要があります。perf_mmap_pages
パラメーターが手動で設定されていない場合は、デフォルト値の 128 が使用されます。
cgroups
を使用した制限
scheduler
プラグインは、cgroups
v1 を使用したプロセスおよびスレッド制限をサポートします。
cgroup_mount_point
オプションは、cgroup ファイルシステムをマウントするパス、または、TuneD のマウントが想定される場所を指定します。設定されていない場合、/sys/fs/cgroup/cpuset
が想定されます。
cgroup_groups_init
オプションが 1
に設定されている場合、TuneD は、cgroup*
オプションで定義されたすべての cgroups
を作成および削除します。これがデフォルトの動作です。cgroup_mount_point
オプションが 0
に設定されている場合、cgroups
は他の方法で事前設定する必要があります。
cgroup_mount_point_init
オプションが 1
に設定されている場合、TuneD は cgroup マウントポイントを作成し、削除します。これは cgroup_groups_init = 1
を意味します。cgroup_mount_point_init
オプションが 0
に設定されている場合は、他の方法で cgroups
マウントポイントを事前設定する必要があります。これがデフォルトの動作です。
cgroup_for_isolated_cores
オプションは、isolated_cores
オプション機能の cgroup
名です。たとえば、システムに 4 つの CPU がある場合、isolated_cores=1
は、Tuned がすべてのプロセスとスレッドを CPU 0、2、および 3 に移動することを意味します。scheduler
プラグインは、計算された CPU アフィニティーを指定された cgroup の cpuset.cpus
コントロールファイルに書き込み、一致するすべてのプロセスおよびスレッドをこのグループに移動することで、指定されたコアを分離します。このオプションが設定されていない場合、sched_setaffinity()
を使用する従来の cpuset アフィニティーが CPU アフィニティーを設定します。
cgroup.cgroup_name
オプションは、任意の cgroups
のアフィニティーを定義します。階層的な cgroups を使用することもできますが、階層を正しい順序で指定する必要があります。TuneD は、cgroup_mount_point
オプションで指定された場所に cgroup
を強制的に配置する点を除き、ここでは健全性チェックを行いません。
group.
で始まるスケジューラーオプションの構文が拡張され、16 進数の affinity
ではなく、cgroup.cgroup_name
が使用されるようになりました。一致するプロセスは cgroup
cgroup_name
に移動されます。上記のように、cgroup.
オプションで定義されていない cgroup を使用することもできます。たとえば、TuneD によって管理されない cgroups
などがあります。
すべての cgroup
名は、ピリオド (.
) をスラッシュ (/
) に置き換えてサニタイズされます。これにより、プラグインが cgroup_mount_point
オプションで指定された場所の外部に書き込むことを防ぎます。
例3.13 scheduler
プラグインでの cgroups
v1 の使用
以下の例では、2 つの cgroups
、group1
、および group2
を作成します。cgroup group1
アフィニティーを CPU 2 に設定し、cgroup
group2
を CPU 0 および 2 に設定します。4 つの CPU 設定を指定すると、isolated_cores=1
オプションはすべてのプロセスとスレッドを CPU コア 0、2、および 3 に移動します。ps_blacklist
正規表現で指定されたプロセスおよびスレッドは移動されません。
[scheduler] cgroup_mount_point=/sys/fs/cgroup/cpuset cgroup_mount_point_init=1 cgroup_groups_init=1 cgroup_for_isolated_cores=group cgroup.group1=2 cgroup.group2=0,2 group.ksoftirqd=0:f:2:cgroup.group1:ksoftirqd.* ps_blacklist=ksoftirqd.*;rcuc.*;rcub.*;ktimersoftd.* isolated_cores=1
cgroup_ps_blacklist
オプションは、指定された cgroups
に属するプロセスを除外します。このオプションで指定された正規表現は、/proc/PID/cgroups
の cgroup
階層と照合されます。コンマ (,
) は、正規表現の一致前に cgroups
v1 階層を /proc/PID/cgroups
から分離します。以下は、正規表現が照合される内容の例です。
10:hugetlb:/,9:perf_event:/,8:blkio:/
複数の正規表現はセミコロン (;
) で区切ることができます。セミコロンは論理 or 演算子を表します。
例3.14 cgroups を使用したスケジューラーからのプロセスの除外
以下の例では、scheduler
プラグインは、cgroup /daemons
に属するプロセスを除いて、すべてのプロセスをコア 1 から移動します。\b
文字列は、単語境界に一致する正規表現のメタ文字です。
[scheduler] isolated_cores=1 cgroup_ps_blacklist=:/daemons\b
以下の例では、scheduler
プラグインは、階層 ID が 8 で、controller-list blkio
を持つ cgroup に属するすべてのプロセスを除外します。
[scheduler] isolated_cores=1 cgroup_ps_blacklist=\b8:blkio:
最近のカーネルは、一部の sched_
および numa_balancing_
カーネルランタイムパラメーターを sysctl
ユーティリティーが管理する /proc/sys/kernel
ディレクトリーから、通常は /sys/kernel/debug
ディレクトリーにマウントされる debugfs
に移動しました。TuneD は、scheduler
プラグインを介して以下のパラメーターの抽象化メカニズムを提供します。このメカニズムでは、TuneD は、使用されるカーネルに基づいて、指定された値を正しい場所に書き込みます。
-
sched_min_granularity_ns
-
sched_latency_ns
-
sched_wakeup_granularity_ns
-
sched_tunable_scaling
-
sched_migration_cost_ns
-
sched_nr_migrate
-
numa_balancing_scan_delay_ms
-
numa_balancing_scan_period_min_ms
-
numa_balancing_scan_period_max_ms
numa_balancing_scan_size_mb
例3.15 移行を決定するためにタスクの "cache hot" 値を設定します。
古いカーネルで以下のパラメーターを設定すると、
sysctl
は500000
の値を/proc/sys/kernel/sched_migration_cost_ns
ファイルに書き込むことを意味します。[sysctl] kernel.sched_migration_cost_ns=500000
これは、最近のカーネルでは、
scheduler
プラグインを介して次のパラメーターを設定するのと同じです。[scheduler] sched_migration_cost_ns=500000
つまり、TuneD は
500000
の値を/sys/kernel/debug/sched/migration_cost_ns
ファイルに書き込みます。