CPUIdle: 要求にもかかわらず、カーネルが C6 状態エントリを拒否するのはなぜですか?

CPUIdle: 要求にもかかわらず、カーネルが C6 状態エントリを拒否するのはなぜですか?

ワークロードの実行中にカーネルが各c状態で費やす時間を測定しようとしたときに奇妙な動作を見つけました。カーネルはカーネルにC6に移動するように要求しますが、ハードウェアはC1にのみ残ります。

ワークロードはCPU 2-5の4コアで実行され、Turbostatを使用してc状態統計を取得します。 1秒の測定間隔のデータは次のとおりです。

| CPU  | C1% | C1E% | C6%   | CPU%c1 | CPU%c6 |
| :---:|:---:|:---:|:------:|:------:|:------:|
|    2 |1.57 | 0.00|  78.98 | 74.22  |  6.09  |
|    3 |1.80 | 0.00|  78.80 | 74.64  |  5.72  |
|    4 |2.07 | 0.00|  78.66 | 74.02  |  6.48  |
|    5 |1.69 | 0.00|  78.87 | 74.80  |  5.53  |

カーネルはこの時間中にコアがほぼ80%の時間C6にあるはずですが、ハードウェアは実際にはC6で時間の6%しか消費し、ほとんどC1に残ります。テーブルには1秒間の統計のみが含まれていますが、ワークロード全体の実行(約40秒)中に発生したほぼすべての内容をカバーしています。 C6に移動してC1に移動するようにカーネルの要求をハードウェアが拒否するのはなぜですか?

上記の実験を実行しているサーバーに関する情報は次のとおりです。

Model name: Intel(R) Xeon(R) Platinum 8280M CPU @ 2.70GHz

Thread(s) per core: 1

Kernel version: 5.15.0-69-generic

CPUidle driver: intel_idle

CPUidle governor: menu

Enabled idle states: POLL, C1, C6 (C1E is disabled)

関連情報