RHEL6/RHEL7 での "kernel.sched_min_capsularity_ns" パラメータの意味

RHEL6/RHEL7 での

RHEL6 から RHEL7 までのカーネルの振る舞いを研究しながら、我々は次の事実を発見した。RHEL6カーネルパラメータの説明:

> kernel.sched_min_grinderity_ns

sched_min_capsularity_ns はスケジューラ期間の初期値です。スケジューラ期間は、実行可能なすべてのジョブが少なくとも1回実行されることを許可される期間です。 CFSにはタイムスライスの概念はありませんが、期間を最初のタイムブロックとして考えてから、それをタイムスライスに均等に分割できます。各時間フラグメントは実行可能なプロセスに対応します。この調整可能項目は初期値のみを指定します。実行可能ジョブが多すぎると、スケジューラは実行時間が短すぎないように期間を長くします。

/usr/share/doc/kernel-doc-2.6.32/Documentation/scheduler/sched-design-CFS.txt

>kernel.sched_latency_ns

CPU 集約タスクのターゲットプリエンプション遅延を設定します。

パラメータの説明はkernel.sched_min_granularity_ns私たちを混乱させます。このパラメータについての私たちの理解は、実行可能な各タスクがCPUで実行できる最小時間(つまり、実行可能な各タスクに提供されるタイムスライス)であることです。の場合、kernel.sched_latency_ns実行可能なすべてのジョブが1回以上実行される期間。

私たちは他の多くの記事から理解を得ました。これそしてそれ。一部のリンクは異なるカーネルバージョンを参照できますが、パラメータの一般的な説明は変更しないでください。

ベストアンサー1

同意する。 RHEL6のマニュアルは、参照しているマニュアルと一致しません。無視してください。

https://elixir.bootlin.com/linux/v2.6.32/source/Documentation/scheduler/sched-design-CFS.txt#L95

したがって、CFSスケジューラには、以前のスケジューラと同じ「タイムスライス」という概念がなく、経験的な方法もありません。中央調整可能なパラメータは1つだけです(CONFIG_SCHED_DEBUGを有効にする必要があります)。

/proc/sys/kernel/sched_min_granularity_ns

スケジューラを「デスクトップ」(すなわち、低レイテンシ)ワークロードから「サーバ」(すなわち、良好なバッチ)ワークロードに調整するために使用することができる。デフォルトはデスクトップワークロードに適した設定です。

同じバージョンでは、この値のデフォルト値は1msです。これはタイムスライスの最小値です(以前のCONFIG_HZ = 1000に相当)。

https://elixir.bootlin.com/linux/v2.6.32/source/kernel/sched_fair.c#L40

「すべての実行可能ジョブが少なくとも1回実行されることを許可する必要がある期間」という合理的なデフォルトでは、1msは小さすぎます。

/*
 * Targeted preemption latency for CPU-bound tasks:
 * (default: 5ms * (1 + ilog(ncpus)), units: nanoseconds)
 *
 * NOTE: this latency value is not the same as the concept of
 * 'timeslice length' - timeslices in CFS are of variable length
 * and have no persistent notion like in traditional, time-slice
 * based scheduling concepts.
 *
 * (to see the precise effective timeslice length of your workload,
 *  run vmstat and monitor the context-switches (cs) field)
 */
unsigned int sysctl_sched_latency = 5000000ULL;

/*
 * Minimal preemption granularity for CPU-bound tasks:
 * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds)
 */
unsigned int sysctl_sched_min_granularity = 1000000ULL;

おすすめ記事