C ステート (C-state) とは、CPU のアイドル時の状態を定義したものです。CPU がアイドル状態になると、省電力機能によってその状態は C0 (アクティブ状態) から、段階的に深いレベルへと移行し、最終的に C6 (消費電力が最小の状態) に達します。CPU がより深い C ステートに入ると、ウェイクアップ時のレイテンシーが増加し、リアルタイム性の要求が高いシナリオではパフォーマンスに影響を与える可能性があります。したがって、パフォーマンスの一貫性が求められる場合は、C ステートを C1 に変更して vCPU の応答レイテンシーを短縮することを推奨します。
背景情報
vCPU の負荷が低い場合、OS は消費電力削減のため、vCPU をより深い省電力状態 (高レベルの C ステート) へ移行させます。しかし、この深い状態からのウェイクアップには一定のレイテンシーが伴い、特に NIC の割り込み発生時などに応答レイテンシーとして顕在化します。したがって、OS レベルで深い C ステートを無効化し、vCPU を意図的に浅い C ステート (C1など) に維持する手法は、ウェイクアップレイテンシーの短縮に加え、HLT や MWAIT 命令実行時のハイパーバイザ起因オーバーヘッド低減にも効果的です。このウェイクアップレイテンシーの具体的な値は、CPU のチップロアーキテクチャによって異なります。
手順
この手順では、ecs.g8i.large インスタンスと Alibaba Cloud Linux 3 を例に、vCPU の高レベルの C ステートを無効にする方法を説明します。なお、コマンドの出力結果はインスタンスタイプとイメージによって異なるため、実際の環境に応じて確認してください。
ECS インスタンスにログインします。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
現在のシステムで使用されている CPUidle ドライバーと、サポートされている C ステートを確認します。
説明次のコマンドを実行しても CPUidle ドライバーが表示されない場合は、OS イメージが古い可能性があります。イメージの更新を検討してください。
cpupower idle-info以下のような出力結果が返されます。
Number of idle statesはサポートされている C ステートの数を示し、Available idle statesはサポートされている具体的な C ステートを示します。
/etc/default/grubファイルで、 C ステートに関連するパラメーターを変更します。/etc/default/grub ファイルを開きます。
sudo vim /etc/default/grubiキーを押して挿入モードに入ります。GRUB_CMDLINE_LINUX=の行を見つけ、行の末尾にintel_idle.max_cstate=1とprocessor.max_cstate=1を追加します。これにより、アイドル状態の vCPU の最大 C ステートが C1 に制限されます。
Escキーを押し、:wqと入力してからEnterキーを押して、設定ファイルを保存して閉じます。GRUB 設定ファイルを再生成します。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
インスタンスを再起動し、設定を有効にします。
sudo reboot変更後の CPUidle ドライバーと C ステートを再度確認します。
cpupower idle-info以下の出力例のように、利用可能な C ステートが POLL および C1 のみに制限されていれば、設定は正しく適用されています。
