同じプロセスが異なる「CPU」で前後にバウンスされるのはなぜですか?

同じプロセスが異なる「CPU」で前後にバウンスされるのはなぜですか?

完全なCPUコアを使用しているがシングルスレッドプロセスを開始するいくつかの長期実行タスクのパフォーマンスのトラブルシューティングを行っています。私はこれらのプロセスが他のCPUにジャンプし続けることを観察しました。同じプロセスが別のCPUに移動されるのはなぜですか?カーネルスケジューラが実行中のプロセスをあまり頻繁に移動したり、まったく移動しないことは正常ではないようです。しかし、さまざまなプロセスでこれらの動作を見ることができます。プロセスがアクティブになるにつれて、複数のCPUで変更されるようです。

私はこの行動を観察しますtop。対応する列を追加しますLast Used Cpu。その後、プロセスIDが同じままであるにもかかわらず、他のCPUに変更され続ける興味深いプロセスを観察しました。

オーバーレイジョブがバランスよく実行されている間に複数のCPUでプロセスを維持する必要があるにもかかわらず、プロセスが同じCPUで一時的に互いに競合することが多いため、一部のジョブではパフォーマンスが一貫しないほど多様です。これらのタスクが実行されている間、サーバーはこれらのプロセスを除いてほとんどの時間アイドル状態です。したがって、タスク1が1つのCPUセットからプロセスを開始し、タスク2が最終的に別のCPUセットから開始され、そのまま残されることを望みます.

EC2のAmazon Linux 2カーネル4.14.x

答え1

Linux スケジューラは自然な CPU 好みを使用します。つまり、パフォーマンス上の理由から、スケジューラはできるだけ長く同じCPUにプロセスを維持しようとします。通常のLinuxシステムで使用できますtaskset

しかし、私が理解したのは、専用インスタンスがないと、EC2で多くのCPU共有が発生することです。プロセスをvCPUに接続することもできますが、これは単なる外観です。

答え2

topを使用してこの現象を観察する方法を作成します。 Man Topが認めたように、これがあなたの分析に適したツールであるかどうかはわかりません。

  1. P - 最後に使用されたCPU(SMP)最後に使用されたプロセッサを表す番号。実際のSMP環境では、カーネルは意図的に弱い親和性を使用するため、これは頻繁に変更される可能性があります。さらに、トップ実行自体がこれらの弱い親和性を破り、より多くのプロセスがCPUをより頻繁に交換できるようにすることができます(CPU時間に対する追加の要求のため)。

私は個人的に/proc/interruptsに報告された再予約された割り込みの数に依存することを好みます。

答え3

重複するジョブが実行されている場合でも、異なるCPU間でバランスをとる必要があります。

いいえ、そうではありません。どのスケジューラを使用しているかは明らかではありませんが、私が知っている限り、現在のすべての主流ディストリビューションは基本的に完全に公正なスケジューラを使用しています。使用可能なCPUに基づいてCPUにジョブを割り当てます。プロセスで使用した最後のCPUは次のとおりです。最初の選択ターゲット、同じハイパースレッドグループの次のCPU、同じソケットのCPU(同じL2キャッシュIIRC共有?) - そしてNUMAを処理すると、状況が複雑になり始めます。インターネットにアクセスしてみると、すべて記録されています。

ハッピーマシンでは、プロセスはCPUで実行するために使用可能な最大タイムスロットに達しません。タスクは何かを行います。つまり、何かが起こるまで待たなければならないので、その場を譲らなければならないという意味です。平均負荷がCPUの数に近づくと、CPUリソースに対する競合が発生し、スケジューラはタスクが準備される前に(プリエンプトされた)CPUでタスクを開始し始めます。一般に、これはシステムスループットをわずかに減少させる。

CPU アフィニティアルゴリズムに重みを与えるために使用されるいくつかの係数を調整できます。sysctl -A | grep "sched" | grep -v "domain"パラメータを表示するには実行してください。ただし、カーネルは実行時に CFS をある程度調整します。

これらのタスクが実行されている間、サーバーはこれらのプロセスを除いてほとんどアイドル状態です。

本当に?これらのプロセスはネットワークまたはストレージI / Oを実行しません。

関連情報