私はLinuxカーネルのCompletely Fair SchedulerがCPU帯域幅制御をどのように実行するのかを理解しようとしてきました。
たくさん読んだ後でも、CFS が各 cgroup が独自の CFS サイクルを定義できるようにする方法と、これがkernel.sched_cfs_bandwidth_slice_us
sysctl 設定とどのように関連付けられるかはまだ理解できません。
例A:単一のCPUシステムには、異なるCFS期間として定義された2つのcgroupがあります。各cgroupのクォータはCPU時間の50%を表し、合計100%です。
cgroup-A: cpu.cfs_period_us=100ms
cpu.cfs_quota_us=50ms
cgroup-B: cpu.cfs_period_us=1000ms
cpu.cfs_quota_us=500ms
各cgroupに実行中のプロセスがある場合、CFS期間が与えられた場合、これらのプロセスはどのようにスケジュールされますか(どちらのプロセスも常にCPU時間が必要であると仮定)。
例B:cgroup-Bのクォータが実際に物理的に満たすことができるよりも高い場合はどうなりますか? cgroup-BはCPU時間の90%を設定し、cgroup-Aは引き続きクォータをCPU時間の50%に設定します。
cgroup-A: cpu.cfs_period_us=100ms
cpu.cfs_quota_us=50ms
cgroup-B: cpu.cfs_period_us=1000ms
cpu.cfs_quota_us=900ms
クォータを超えた場合、CFSはどのようにプロセスをスケジュールしますか?
答え1
各cgroupに実行中のプロセスがある場合、CFS期間が与えられた場合、これらのプロセスはどのようにスケジュールされますか(どちらのプロセスも常にCPU時間が必要であると仮定)。
構成とは、システム全体の50%ではなく、CPUコア/ HTの50%を意味します。
クォータを超えた場合、CFSはどのようにプロセスをスケジュールしますか?
上記と同じで、過剰なサブスクリプションがない場合、両方のプロセスがそれぞれ0.5 CPUと0.9 CPU時間を使用できることを意味します。これを理解するには、システムに20個のCPUコア/ HTがある状況を考えてください。