CPU クォータが設定されている場合の省電力周波数ガバナーの動作

CPU クォータが設定されている場合の省電力周波数ガバナーの動作

cpu cgroup サブシステムで cpu.cpu_quota_us を設定することによるアプリケーション パフォーマンスへの影響を理解しようとしています。基本的に CPU クォータを減らして、CPU の数を増やして「有効な」CPU が同じになるようにすると、アプリケーションに影響しますか? たとえば、4 CPU 100% クォータ構成は、8 CPU 50% クォータ構成と同じですか?

私はCPUを集中的に使用する簡単なプログラムを書いた。 https://github.com/ashu-mehra/cpu-quota-test次の cgroup 構成で実行しました。

1) 4つのCPUを持ち、クォータ制限のないcgroupの場合

2) 8つのCPUと50%のクォータを持つcgroupの場合

このプログラムを 32 スレッドで実行すると、2 つの構成でプログラムによって報告されるスループットに次の違いがあることに気付きました。

4CPU@100 8CPU@50
176236 87252.5

8CPU@50 のパフォーマンスは、4CPU@100 の半分以下です。

さらにデバッグを進めると、私のシステムは「省電力」CPU 周波数ガバナーを使用するように構成されていることに気付きました。このモードでは、プログラムが 4CPU@100 で実行されているとき、コアの CPU 周波数は最大になりますが、8CPU@50 の場合はコアの CPU 周波数ははるかに低くなります。

CPU 周波数ガバナーを「パフォーマンス」に変更すると (これは使用可能な唯一の他の周波数ガバナーです)、コアが最大周波数で実行され始めるため、8CPU@50 のパフォーマンスが大幅に向上します。

4CPU@100 8CPU@50
175804 163831

私のシステムの詳細は次のとおりです:

Ubuntu 16.04.2 LTS

カーネル 4.4.0-103-generic

CPUFreq ガバナーに関して次の質問があります。

1) このリンクhttps://www.kernel.org/doc/Documentation/cpu-freq/governors.txt「CPUfreq ガバナー「powersave」は、scaling_min_freq と scaling_max_freq の境界内で CPU を最低周波数に静的に設定します。」と書かれていますが、負荷が増加すると周波数が変化することに気づきました。「powersave」は実際にはどのように機能するのでしょうか?

2) 「powersave」CPU 周波数ガバナーが使用されており、CPU クォータが設定されている場合に、CPU 周波数が最大まで上昇しないのはなぜですか。CPU クォータの設定により、「powersave」の動作がおかしくなるのでしょうか。

答え1

質問 1 で参照されているドキュメントは、acpi-cpufreq CPU 周波数スケーリング ドライバーに関するものです。intel_pstate CPU 周波数スケーリング ドライバーを使用していると思いますが、確信はありません。確実に知るには、システムに問い合わせてください。

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate
intel_pstate

intel_pstate ドライバーの powersave ガバナーは、acpi-cpufreq ドライバーの ondemand ガバナーと同様に動作します。制御アルゴリズムは変更されていますが、十分に新しいカーネルを使用している場合は、負荷ベースになるはずです。

使用を 50% に制限すると、負荷ベースのアルゴリズムに CPU 周波数を上げるだけの負荷がかからないため、CPU 周波数はほとんど上がらないか、まったく上がりません。

関連情報