web-dev-qa-db-ja.com

intel_idleに費やされた多くの時間

これを書いている時点で、htopは、カーネルスレッド(赤いバー)にそれぞれ約50%の2つのコアを示しています。私が知っている以前のブートから、これは時間の経過とともにそれぞれ50%で3コア、さらには4コアに増加するでしょう。 htopが示すスレッドには、1%を超えるCPU使用率はありません。これはちょっと変ですね。

さらに調査を試みたところ、ルートとしてperf record -aを使用したところ、すべてのサンプルの11.3%が関数intel_idleのコマンドswapperのカーネルスレッドにあることがわかりました。

このswapperコマンドは、htopに表示される奇妙なCPU使用に対応すると想定しますが、次の質問のいくつかを誰かに説明できます。

  • 何が原因ですか?それは私の設定のバグか何かですか?
  • これは私のシステムの全体的なパフォーマンスに影響しますか?
  • どうすればこれを取り除くことができますか?

私のシステムの詳細:

$ uname -a
Linux [...] 4.8.0-0.rc2.git2.2.fc26.x86_64 #1 SMP Wed Aug 17 22:16:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
Stepping:              3
CPU MHz:               799.804
CPU max MHz:           4200.0000
CPU min MHz:           800.0000
BogoMIPS:              8016.00
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Flags:                 [...]

pdate:負荷がかかっている場合の動作は少し異なります。 (最初に、それぞれ50%の3つのコアになり、perfがintel_idle内で27%を報告することに注意してください)sysbench --test=cpu --num-threads=8 --max-requests=1000000 runでCPUにストレスをかけ、htopperfを再度確認しました。 Htopは、カーネルで100%の3つのコア(アイドル時に50%で表示される同じコア)と100%のユーザーランドで5つのコアを報告しました。 Perfは、sysbenchが私のCPUの85%を占め、残りの15%を説明していないと報告しました...これが何を意味するのかわかりません私のCPUは効果的に85%のパフォーマンスに削減されますか?

6
example

私はIntelプロセッサーの電源管理について何も知りませんし、Linuxコードも見ていないので、この答えはほとんど投機的なものです。

電源管理に関するデロバートの説明 が起こっていると思います。電源管理は、消費電力とパフォーマンスの間の妥協です。プロセッサがピークパフォーマンスの100%で使用されていない場合は、周波数を下げると効果的ですが、速度は遅くなりますが、温度は下がります。

Linuxは、CPU周波数を時間とともに変化させます。その方法は governors と呼ばれるポリシーによって制御されます。一般的な考え方は、システムがCPUをフルパフォーマンスでしばらく使用していないと、CPU周波数が低下するということです。逆に、CPUがしばらくの間ビジー状態である場合、カーネルは頻度を増やします。

intel_idleがスケジュールされていることは、コアがコードを実行していないことを意味しますが、実際には電力をほとんど消費しない「サスペンド」モードです。これは、周波数を単に下げるよりも大幅に電力を節約しますが、コストが高くなります。CPUは interrupt が発生すると復帰しますが、これには時間がかかります(数十マイクロ秒?もっと?)。

すべてのコアを十分に活用していないときにintel_idleが表示されるのはまったく正常です。これにより、CPUを常にフルスピードで動作させる場合と比較して、多くの電力(プロセッサ自体と冷却装置の両方)が節約されます。このメカニズムを無効にする必要がある唯一の理由は、非常に低い latency が必要な場合です。 CPUを集中的に使用するアプリケーションを実行すると、表示されるintel_idleが少なくなります。 CPUアイドルモードを使用しても、システムが大量のCPUパワーを必要とすることをカーネルがまだ完全に決定していない移行期間を除いて、パフォーマンスは低下しません。

コアを完全に飽和させると、0%に達しますintel_idle。実行中のすべてのコードとデータがCPUキャッシュに収まらないため、すべてのコアを飽和させることは難しい場合があります(特別に設計されたベンチマークで行うことができます)。制限要因はRAMアクセス速度。 「すべてのコードとデータ」には、ユーザーインターフェイスを含め、マシンで実行されているすべてのものが含まれます。実際には、すべてのコアを飽和させることはまれです。