CPUが部分的にアイドル状態の場合、1つのCPUの一部に制限されたプロセスがより遅く実行されるのはなぜですか?

CPUが部分的にアイドル状態の場合、1つのCPUの一部に制限されたプロセスがより遅く実行されるのはなぜですか?

システムの残りの部分がアイドル状態であるかどうかにかかわらず、ジョブは同じリソース割り当てを受け取り、それ以上は割り当てられてはなりません。目標は、システムの他の負荷に関係なく、予測可能な時間内に作業を完了することです。

努力するシステムCPUAllocationCPUQuotaおよびを単純なシングルスレッドテストプログラムと組み合わせて使用​​すると、少ない回数で実行するのに時間がかかることがわかります。

制限がない場合、プロセスの実行には15秒かかります。 CPUの20%に制限されたとき、予想通り5つのインスタンスを実行するのに約75秒かかりました5*15=75

したがって、CPUの20%に制限されている場合、インスタンス数(CPUあたり最大5つ)に関係なく、各インスタンスを実行するのに75秒かかります。

しかし、ますます少数のインスタンスを実行するために(使用されていないCPU容量を残して)、予想75秒以上かかり、単一インスタンスを実行するために(他のシステムをロードせずに)250秒かかりました。

これは言葉ではありません。単一のプロセスは75秒かかり、これは5つのプロセスを実行するのにかかる時間と同じです。

未使用のCPU容量を「吸収」するために別のプロセスを実行している場合は、75秒以内に完了するインスタンスの数が減ると予想できます。

なぜこれが起こるのですか?

そして

他のシステムの負荷に関係なく、ジョブを実行するのに同様の時間がかかることを確実にして、望ましい効果を達成するためのより適切な方法はありますか?

システム実験中に使用したが直接使用cgroupより適切な場合もあれば、より適切な場合もあります)。


テスト用のsystemdサービスユニットファイル

$ cat /etc/systemd/system/cputest\@.service

[Service]
User=nobody
SyslogIdentifier=cputest
ExecStart=/usr/local/bin/cputest.rb
CPUAffinity=1
CPUQuota=20%

テスト手順は意図的に非効率的です。パイのアルゴリズム:

$ cat cat /usr/local/bin/cputest.rb

#!/usr/bin/ruby
PRECISION = 10 ** 8 # decimal places
PI_TARGET = (Math::PI * PRECISION).to_i
d  = neg = 1
pi_test = pi = 0
START = Time.now.to_f
def elapsed() Time.now.to_f - START end
while pi_test != PI_TARGET do
  pi += neg * (4.0/d)
  pi_test = (pi * PRECISION).to_i
  d+=2
  neg*=-1
end
puts elapsed()

次に実行

for i in {1..4}; do sudo systemctl start cputest@$i; done

成果物の収集

sudo journalctl -xft cputest

答え1

利用率の低いCPUが遅くなるのは、CPUに適用された省電力技術によるものと思われます。 CPUが最大値に達したときに許可ターボチャージャーそしてより速く走りなさい。 20%に制限すると最大値に達しないため、実行速度が遅くなります。

私はこのCPUを搭載したノートパソコンで開発をしています。サーバーを見つけて再テストを実行しましたが、期待した結果が得られました。

「パフォーマンス」チューナーを使用する以外はテストをしませんでしたが、あまり違いはありませんでした。まだBIOS設定やこれに似た項目に入っていません。この動作は、電力を節約するように設計されたシステムでプロセスのCPUを制限するときに注意する必要があると思います。

関連情報