2.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 オプションで、; で区切った複数の正規表現がサポートされます。エスケープされたセミコロン \; はそのまま使用されます。
例2.9 CPUs 2-4 の分離
以下の設定は CPU 2-4 を分離します。ps_blacklist 正規表現に一致するプロセスおよびスレッドは、分離に関係なく任意の CPU を使用できます。
[scheduler] isolated_cores=2-4 ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*
[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 パラメーターは、以下の値と動作をサポートします。
calcisolated_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ファイルに直接書き込みます。
例2.10 明示的な CPU リストを使用したデフォルトの IRQ smp アフィニティーの設定
以下の例では、明示的な CPU リストを使用して、デフォルトの IRQ SMP アフィニティーを CPU 0 および 2 に設定します。
[scheduler] isolated_cores=1,3 default_irq_smp_affinity=0,2
[scheduler]
isolated_cores=1,3
default_irq_smp_affinity=0,2
スケジューリングポリシー
プロセスまたはスレッドのグループのスケジューリングポリシー、優先度、およびアフィニティーを調整するには、以下の構文を使用します。
group.groupname=rule_prio:sched:prio:affinity:regex
group.groupname=rule_prio:sched:prio:affinity:regex
ここで rule_prio は、ルールの内部 TuneD 優先度を定義します。ルールは優先度に基づいてソートされます。これは、継承が以前に定義されたルールを並べ替えることができるようにするために必要です。同等の rule_prio ルールは、定義された順序で処理される必要があります。ただし、これは Python インタープリターに依存します。groupname の継承されたルールを無効にするには、以下を使用します。
group.groupname=
group.groupname=
sched は以下のいずれかである必要があります。
f- 先入れ先出し (FIFO)
b- バッチ
r- ラウンドロビン
o- その他
*- 変更対象外
affinity は 16 進数での CPU アフィニティーです。変更しない場合は * を使用します。
prio はスケジューリングの優先度です (chrt -m を参照)。
regex は Python の正規表現です。これは、ps -eo cmd コマンドの出力と照合されます。
指定したプロセス名は、複数のグループに一致させることができます。このような場合、最後に一致する regex により、優先順位とスケジューリングポリシーが決まります。
例2.11 スケジューリングポリシーおよび優先度の設定
以下の例では、スケジューリングポリシーと優先度をカーネルスレッドおよびウォッチドッグに設定します。
[scheduler] group.kthreads=0:*:1:*:\[.*\]$ group.watchdog=0:f:99:*:\[watchdog.*\]
[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 イベントは監視されず、処理されません。これによるデメリットは、プロセスとスレッドの調整がプロファイルアプリケーションでのみ実行されることです。
例2.12 動的スケジューラー機能の無効化
以下の例では、CPU 1 と 3 を分離しながら、動的スケジューラー機能を無効にします。
[scheduler] runtime=0 isolated_cores=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 オプションで指定された場所の外部に書き込むことを防ぎます。
例2.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 正規表現で指定されたプロセスおよびスレッドは移動されません。
cgroup_ps_blacklist オプションは、指定された cgroups に属するプロセスを除外します。このオプションで指定された正規表現は、/proc/PID/cgroups の cgroup 階層と照合されます。コンマ (,) は、正規表現の一致前に cgroups v1 階層を /proc/PID/cgroups から分離します。以下は、正規表現が照合される内容の例です。
10:hugetlb:/,9:perf_event:/,8:blkio:/
10:hugetlb:/,9:perf_event:/,8:blkio:/
複数の正規表現はセミコロン (;) で区切ることができます。セミコロンは論理 'or' 演算子を表します。
例2.14 cgroups を使用したスケジューラーからのプロセスの除外
以下の例では、scheduler プラグインは、cgroup /daemons に属するプロセスを除いて、すべてのプロセスをコア 1 から移動します。\b 文字列は、単語境界に一致する正規表現のメタ文字です。
[scheduler] isolated_cores=1 cgroup_ps_blacklist=:/daemons\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:
[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例2.15 移行を決定するためにタスクの "cache hot" 値を設定します。
古いカーネルで以下のパラメーターを設定すると、
sysctlは500000の値を/proc/sys/kernel/sched_migration_cost_nsファイルに書き込むことを意味します。[sysctl] kernel.sched_migration_cost_ns=500000
[sysctl] kernel.sched_migration_cost_ns=500000Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、最近のカーネルでは、
schedulerプラグインを介して次のパラメーターを設定するのと同じです。[scheduler] sched_migration_cost_ns=500000
[scheduler] sched_migration_cost_ns=500000Copy to Clipboard Copied! Toggle word wrap Toggle overflow つまり、TuneD は
500000の値を/sys/kernel/debug/sched/migration_cost_nsファイルに書き込みます。