

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EC2 AL2 インスタンスのプロセッサ状態制御
<a name="processor_state_control"></a>

C ステートはアイドル時のコアのスリープレベルを制御します。C ステートはC0 (コアがアクティブで、命令を実行している最も浅い状態) から始まる番号が付けられ、C6 (コアの電源がオフになっている最も深いアイドル状態) まで移行します。

P ステートはコアに希望するパフォーマンス (CPU 周波数) を制御します。P ステートはP0 (コアが Intel Turbo Boost Technology を使用して可能であれば周波数を上げることができる最高パフォーマンスの設定) から始まる番号が付けられ、P1 (最大限のベースライン周波数をリクエストする P ステート) から P15 (最小限の周波数) まで移行します。

プロセッサのパフォーマンスの安定性を向上させたり、レイテンシーを減らしたり、インスタンスを特定のワークロード用に調整するために、C ステートまたは P ステートの設定を変更したいと思う場合があるかもしれません。デフォルトの C ステートおよび P ステートの設定はほとんどの作業負荷に対して最適なパフォーマンスを提供します。ただし、アプリケーションにおいて、より高いシングルコアまたはデュアルコアの周波数でレイテンシーを軽減したい場合、またはバースト的な Turbo Boost 周波数よりも低い周波数でより安定したパフォーマンスを維持することを優先する場合、これらのインスタンスで利用可能な C ステートまたは P ステートを試みることを考慮してください。

オペレーティングシステムがプロセッサの C ステートと P ステートを制御する機能を提供する Amazon EC2 インスタンスタイプについては、[Amazon EC2 ユーザーガイド」の「Amazon EC2 インスタンスのプロセッサステートコントロール](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/processor_state_control.html)」を参照してください。 *Amazon EC2 *

以下のセクションでは、プロセッサのさまざまなステート設定と、設定の効果をモニタリングする方法について説明します。これらの手順は 用に記述され、Amazon Linux に適用されますが、Linux カーネルバージョン 3.9 以降の他の Linux ディストリビューションでも機能する可能性があります。

**注記**  
このページの例では、以下を使用しています。  
プロセッサの周波数と C ステート情報を表示する **turbostat** ユーティリティ。**turbostat** ユーティリティは Amazon Linux でデフォルトで使用できます。
ワークロードをシミュレートする **stress** コマンド。**stress** をインストールするには、まず **sudo amazon-linux-extras install epel** を実行して EPEL リポジトリを有効にし、次に **sudo yum install -y stress** を実行します。
出力に C ステート情報が表示されない場合は、コマンド (**--debug**) に **sudo turbostat --debug stress *<options>*** オプションを含めます｡

**Topics**
+ [最大 Turbo Boost 周波数による最高パフォーマンス](#turbo-perf)
+ [深い C ステートの制限による高パフォーマンスと低レイテンシー](#c-states)
+ [変動性が最も低いベースラインパフォーマンス](#baseline-perf)

## 最大 Turbo Boost 周波数による最高パフォーマンス
<a name="turbo-perf"></a>

これは、Amazon Linux AMI のデフォルトのプロセッサのステート制御設定であり、ほとんどのワークロードにお勧めします。この設定では、変動性を抑え、最高パフォーマンスを実現します。非アクティブなコアは深いスリープ状態になることができるため、シングルまたはデュアルコアプロセスが Turbo Boost の潜在能力を最大限に引き出すために必要な発熱量の余裕を実現できます。

次の例は、2 個のコアでアクティブに処理を実行する `c4.8xlarge` インスタンスが Turbo Boost の最大周波数に到達した状況を示しています。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [30680] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30680] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.54 3.44 2.90   0   9.18   0.00  85.28   0.00   0.00   0.00   0.00   0.00  94.04 32.70 54.18  0.00
 0   0   0   0.12 3.26 2.90   0   3.61   0.00  96.27   0.00   0.00   0.00   0.00   0.00  48.12 18.88 26.02  0.00
 0   0  18   0.12 3.26 2.90   0   3.61
 0   1   1   0.12 3.26 2.90   0   4.11   0.00  95.77   0.00
 0   1  19   0.13 3.27 2.90   0   4.11
 0   2   2   0.13 3.28 2.90   0   4.45   0.00  95.42   0.00
 0   2  20   0.11 3.27 2.90   0   4.47
 0   3   3   0.05 3.42 2.90   0  99.91   0.00   0.05   0.00
 0   3  21  97.84 3.45 2.90   0   2.11
...
 1   1  10   0.06 3.33 2.90   0  99.88   0.01   0.06   0.00
 1   1  28  97.61 3.44 2.90   0   2.32
...
10.002556 sec
```

この例では、vCPU 21 と 28 が最大 Turbo Boost 周波数で実行され、他のコアは `C6` スリープ状態になることで電力を節約し、実行中のコアに電力と発熱の余裕を持たせています。vCPU 3 と 10 (それぞれ vCPU 21 および 28 とプロセッサコアを共有する) は `C1` ステートであり、命令を待っています。

以下の例では、18 個のコアはすべてアクティブに処理を実行しているため、Turbo Boost の最大周波数のための余裕はありませんが、すべてのコアが「all core Turbo Boost」の速度である 3.2 GHz で実行されています。

```
[ec2-user ~]$ sudo turbostat stress -c 36 -t 10
stress: info: [30685] dispatching hogs: 36 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30685] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
            99.27 3.20 2.90   0   0.26   0.00   0.47   0.00   0.00   0.00   0.00   0.00 228.59 31.33 199.26  0.00
 0   0   0  99.08 3.20 2.90   0   0.27   0.01   0.64   0.00   0.00   0.00   0.00   0.00 114.69 18.55 99.32  0.00
 0   0  18  98.74 3.20 2.90   0   0.62
 0   1   1  99.14 3.20 2.90   0   0.09   0.00   0.76   0.00
 0   1  19  98.75 3.20 2.90   0   0.49
 0   2   2  99.07 3.20 2.90   0   0.10   0.02   0.81   0.00
 0   2  20  98.73 3.20 2.90   0   0.44
 0   3   3  99.02 3.20 2.90   0   0.24   0.00   0.74   0.00
 0   3  21  99.13 3.20 2.90   0   0.13
 0   4   4  99.26 3.20 2.90   0   0.09   0.00   0.65   0.00
 0   4  22  98.68 3.20 2.90   0   0.67
 0   5   5  99.19 3.20 2.90   0   0.08   0.00   0.73   0.00
 0   5  23  98.58 3.20 2.90   0   0.69
 0   6   6  99.01 3.20 2.90   0   0.11   0.00   0.89   0.00
 0   6  24  98.72 3.20 2.90   0   0.39
...
```

## 深い C ステートの制限による高パフォーマンスと低レイテンシー
<a name="c-states"></a>

C ステートは非アクティブ時のコアのスリープレベルを制御します。C ステートを制御して、システムのレイテンシーとパフォーマンスを調整することができます。コアをスリープ状態にするには時間がかかります。また、スリープ状態のコアによって、別のコアが高い周波数で動作するための余裕が生まれますが、そのスリープ状態にあるコアが再び稼働し処理を実行するのにも時間がかかります。例えば、ネットワークパケットの中断を処理するように割り当てられたコアがスリープ状態である場合、その中断の処理に遅延が生じる可能性があります。より深い C ステートを使用しないようにシステムを設定できます。これにより、プロセッサの応答のレイテンシーは減少しますが、他のコアの Turbo Boost 用の余裕も減少します。

深いスリープ状態を無効にする一般的なシナリオとして、Redis データベースアプリケーションがあります。このアプリケーションは、最速のクエリ応答時間を実現するために、データベースをシステムメモリ内に格納します。

**AL2 で深いスリープ状態を制限するには**

1. 適切なエディタで `/etc/default/grub` ファイルを開きます。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. `GRUB_CMDLINE_LINUX_DEFAULT` 行を編集し `intel_idle.max_cstate=1` と `processor.max_cstate=1` のオプションを追加します。これにより、アイドル状態にあるコアの最も深い C ステートとして `C1` を設定します。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` オプションでは、インテルベースのインスタンスで C ステート制限が設定され、また、`processor.max_cstate=1` オプションでは、AMD ベースのインスタンスで C ステート制限が設定されます。両方のオプションを設定に追加しておくと安心です。これにより、インテルと AMD のインスタンスに対し、共通の方法で目的の動作を設定することができます。

1. ファイルを保存し、エディタを終了します。

1.  起動設定を再構築するには、次のコマンドを実行します。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 新しい kernel オプションを有効にするためにインスタンスを再起動します。

   ```
   [ec2-user ~]$ sudo reboot
   ```

**Amazon Linux AMI で深いスリープ状態を制限するには**

1. 適切なエディタで `/boot/grub/grub.conf` ファイルを開きます。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 最初のエントリの `kernel` 行を編集して `intel_idle.max_cstate=1` と `processor.max_cstate=1` オプションを追加し、アイドル状態のコアの最も深い C ステートに `C1` を設定します。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1  processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` オプションでは、インテルベースのインスタンスで C ステート制限が設定され、また、`processor.max_cstate=1` オプションでは、AMD ベースのインスタンスで C ステート制限が設定されます。両方のオプションを設定に追加しておくと安心です。これにより、インテルと AMD のインスタンスに対し、共通の方法で目的の動作を設定することができます。

1. ファイルを保存し、エディタを終了します。

1. 新しい kernel オプションを有効にするためにインスタンスを再起動します。

   ```
   [ec2-user ~]$ sudo reboot
   ```

次の例では、2 つのコアが「all core Turbo Boost」コア周波数でアクティブに処理を実行している `c4.8xlarge` インスタンスを示します。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5322] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5322] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.56 3.20 2.90   0  94.44   0.00   0.00   0.00   0.00   0.00   0.00   0.00 131.90 31.11 199.47  0.00
 0   0   0   0.03 2.08 2.90   0  99.97   0.00   0.00   0.00   0.00   0.00   0.00   0.00  67.23 17.11 99.76  0.00
 0   0  18   0.01 1.93 2.90   0  99.99
 0   1   1   0.02 1.96 2.90   0  99.98   0.00   0.00   0.00
 0   1  19  99.70 3.20 2.90   0   0.30
...
 1   1  10   0.02 1.97 2.90   0  99.98   0.00   0.00   0.00
 1   1  28  99.67 3.20 2.90   0   0.33
 1   2  11   0.04 2.63 2.90   0  99.96   0.00   0.00   0.00
 1   2  29   0.02 2.11 2.90   0  99.98
...
```

この例では、vCPU 19 および 28 のコアは 3.2 GHz で実行中であり、その他のコアは `C1` C ステートで、命令を待機しています。稼働中のコアは Turbo Boost の最大周波数には到達していませんが、非アクティブなコアはより深い `C6` C ステートにある場合と比べて、新しいリクエストに迅速に応答します。

## 変動性が最も低いベースラインパフォーマンス
<a name="baseline-perf"></a>

P ステートによってプロセッサの周波数の変動性を抑制することができます。P ステートはコアに希望するパフォーマンス (CPU 周波数) を制御します。ほとんどのワークロードでは、Turbo Boost をリクエストする、P0 でパフォーマンスが向上します。ただし、Turbo Boost 周波数が有効であるときに発生する可能性があるバースト的なパフォーマンスではなく、安定したパフォーマンスになるようにシステムを調整することもできます。

Intel Advanced Vector Extensions (AVX または AVX2) のワークロードは低い周波数でもパフォーマンスに優れ、AVX 命令はより多くの処理能力を使用できます。Turbo Boost を無効にして、プロセッサをより低い周波数で実行すると、使用される処理能力が抑えられ、より安定した速度が維持されます。AVX のインスタンス設定とワークロードの最適化の詳細については、[インテルのウェブサイト](https://www.intel.com/content/www/us/en/developer/articles/technical/the-intel-advanced-vector-extensions-512-feature-on-intel-xeon-scalable.html?wapkw=advanced%20vector%20extensions)を参照してください。

CPU がアイドル状態のドライバは P ステートを制御します。最近の世代の CPU には、以下のようにカーネルレベルでの対応が可能な、更新された CPU アイドルドライバが必要です。
+ Linux カーネルバージョン 6.1 以降 – Intel Granite Rapids (R8i など) をサポート
+ Linux カーネルバージョン 5.10 以降 – AMD Milan をサポート (M6a など)
+ Linux カーネルバージョン 5.6 以降 – Intel Icelake (M6i など) をサポート

実行中のシステムのカーネルが CPU を認識するかどうかを確認するには、次のコマンドを実行します。

```
if [ -d /sys/devices/system/cpu/cpu0/cpuidle ]; then echo "C-state control enabled"; else echo "Kernel cpuidle driver does not recognize this CPU generation"; fi
```

このコマンドの出力により、サポートが不十分であることを確認した場合は、カーネルをアップグレードすることをお勧めします。

このセクションでは、深いスリープ状態を制限し、(`P1` P ステートをリクエストすることにより) Turbo Boost を無効にすることで、これらのタイプのワークロードに対して、低レイテンシーを提供し、プロセッサ速度の変動性を最低限に抑える方法を説明します。

**深いスリープ状態を制限し、AL2 で Turbo Boost を無効にするには**

1. 適切なエディタで `/etc/default/grub` ファイルを開きます。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. `GRUB_CMDLINE_LINUX_DEFAULT` 行を編集し `intel_idle.max_cstate=1` と `processor.max_cstate=1` のオプションを追加します。これにより、アイドル状態にあるコアの最も深い C ステートとして `C1` を設定します。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` オプションでは、インテルベースのインスタンスで C ステート制限が設定され、また、`processor.max_cstate=1` オプションでは、AMD ベースのインスタンスで C ステート制限が設定されます。両方のオプションを設定に追加しておくと安心です。これにより、インテルと AMD のインスタンスに対し、共通の方法で目的の動作を設定することができます。

1. ファイルを保存し、エディタを終了します。

1.  起動設定を再構築するには、次のコマンドを実行します。

   ```
   [ec2-user ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 新しい kernel オプションを有効にするためにインスタンスを再起動します。

   ```
   [ec2-user ~]$ sudo reboot
   ```

1. `P1` P ステートによってプロセッサ速度の変動性を抑える必要がある場合は、次のコマンドを実行して Turbo Boost を無効にします。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. ワークロードが終了したら、次のコマンドで Turbo Boost を再度有効にすることができます。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

**Amazon Linux AMI で深いスリープ状態を制限し、Turbo Boost を無効にするには**

1. 適切なエディタで `/boot/grub/grub.conf` ファイルを開きます。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 最初のエントリの `kernel` 行を編集して `intel_idle.max_cstate=1` と `processor.max_cstate=1` オプションを追加し、アイドル状態のコアの最も深い C ステートに `C1` を設定します。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1 processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` オプションでは、インテルベースのインスタンスで C ステート制限が設定され、また、`processor.max_cstate=1` オプションでは、AMD ベースのインスタンスで C ステート制限が設定されます。両方のオプションを設定に追加しておくと安心です。これにより、インテルと AMD のインスタンスに対し、共通の方法で目的の動作を設定することができます。

1. ファイルを保存し、エディタを終了します。

1. 新しい kernel オプションを有効にするためにインスタンスを再起動します。

   ```
   [ec2-user ~]$ sudo reboot
   ```

1. `P1` P ステートによってプロセッサ速度の変動性を抑える必要がある場合は、次のコマンドを実行して Turbo Boost を無効にします。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. ワークロードが終了したら、次のコマンドで Turbo Boost を再度有効にすることができます。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

次の例では、2 つの vCPU が、Turbo Boost を使用せずに、ベースラインコア周波数でアクティブに処理を実行している `c4.8xlarge` インスタンスを示します。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5389] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5389] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.59 2.90 2.90   0  94.41   0.00   0.00   0.00   0.00   0.00   0.00   0.00 128.48 33.54 200.00  0.00
 0   0   0   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00   0.00   0.00   0.00   0.00  65.33 19.02 100.00  0.00
 0   0  18   0.04 2.90 2.90   0  99.96
 0   1   1   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   1  19   0.04 2.90 2.90   0  99.96
 0   2   2   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00
 0   2  20   0.04 2.90 2.90   0  99.96
 0   3   3   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   3  21  99.95 2.90 2.90   0   0.05
...
 1   1  28  99.92 2.90 2.90   0   0.08
 1   2  11   0.06 2.90 2.90   0  99.94   0.00   0.00   0.00
 1   2  29   0.05 2.90 2.90   0  99.95
```

vCPU 21 および 28 のコアは、ベースラインプロセッサ速度の 2.9 GHz でアクティブに処理を実行し、すべての非アクティブなコアも、`C1` C ステートのベースライン速度で実行され、すぐに命令を受け付けることができます。