

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon EC2 AL2 執行個體的處理器狀態控制
<a name="processor_state_control"></a>

C-state 可控制核心在閒置狀態要進入的休眠等級。C-state 從 C0 (最淺閒置狀態，此時核心處於喚醒狀態並執行指令) 開始編號，最高可到 C6 (最深閒置狀態，此時核心會關閉)。

P-states 則可控制所需的核心效能 (CPU 頻率)。P-state 從 P0 (最高效能設定，此時核心可視需要使用 Intel Turbo Boost 技術來提高頻率) 開始編號，之後則從 P1 (請求最大基準頻率的 P-state) 到 P15 (最低適用頻率)。

建議您變更 C-state 或 P-state 設定來提高處理器效能穩定性、減少延遲或針對特定工作負載微調執行個體。預設 C-state 和 P-state 設定提供最大效能，適合多數工作負載使用。然而，若您的應用程式更適合犧牲較高的單核心或雙核心頻率以降低延遲，或在較低頻率更能展現穩定效能 (而不適合使用突增 Turbo Boost 頻率)，請考慮嘗試調整這些執行個體的 C-state 或 P-state 設定。

如需可讓作業系統控制處理器 C-state 和 P-state 的 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 發行版本。

**注意**  
此頁面上的範例使用以下項目：  
**turbostat** 公用程式，用於顯示處理器頻率和 C-state 資訊。根據預設，**turbostat** 執行個體在 Amazon Linux 上可用。
**stress** 命令，用於模擬工作負載。若要安裝 **stress**，首先透過執行 **sudo amazon-linux-extras install epel** 啟用 EPEL 儲存庫，然後執行 **sudo yum install -y stress**。
若輸出未顯示 C-state 資訊，請將 **--debug** 選項併入命令 (**sudo turbostat --debug stress *<options>***) 中。

**Topics**
+ [具備最高 Turbo Boost 頻率的最佳效能](#turbo-perf)
+ [限制深層的 C-state 達到高效能與低延遲](#c-states)
+ [以最低變異取得基準效能](#baseline-perf)

## 具備最高 Turbo Boost 頻率的最佳效能
<a name="turbo-perf"></a>

此為 Amazon Linux AMI 的預設處理器狀態控制組態，建議多數工作負載使用。此組態提供最佳效能，而且變異較低。允許未使用的核心進入更深的休眠狀態，可提供單核心或雙核心處理器達到最大 Turbo Boost 潛力所需的散熱餘裕。

下列範例以 `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-state 達到高效能與低延遲
<a name="c-states"></a>

C-state 可控制核心在未使用時要進入的休眠等級。建議您控制 C-state 來微調系統的延遲與效能。核心進入休眠狀態需要時間，而且雖然休眠核心讓其他核心更有餘裕加速至更高頻率，但是欲喚醒該休眠核心並開始執行工作也需要時間。例如，若負責處理網路封包中斷的核心處於休眠狀態，則處理此類中斷的服務就可能受到延遲。您可將系統設定為不使用深層 C-state，藉此減少處理器反應延遲，但同時也會壓縮其他核心進行 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` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   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` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

1. 儲存檔案並結束您的編輯器。

1.  執行下列命令來重建開機組態。

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

1. 重新啟動執行個體以啟用新的核心選項。

   ```
   [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` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   # 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` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

1. 儲存檔案並結束您的編輯器。

1. 重新啟動執行個體以啟用新的核心選項。

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

下列範例以 `c4.8xlarge` 執行個體為例，其中具備兩個執行工作並以「All Core Turbo Boost」核心頻率運作的運作中核心。

```
[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-state。雖然運作中核心並未達到最大 Turbo Boost 頻率，但是未使用的核心將比處於深層 `C6` C-state 更能夠快速回應新的請求。

## 以最低變異取得基準效能
<a name="baseline-perf"></a>

您可使用 P-state 來減少處理器頻率的變異。P-state 則可控制所需的核心效能 (CPU 頻率)。多數工作負載以 P0 運作的效能較佳，此時會要求使用 Turbo Boost。然而，若要取得穩定效能，而非 Turbo Boost 啟用才出現的突增效能，建議您微調系統。

Intel Advanced Vector Extensions (AVX 或 AVX2) 工作負載能夠以較低頻率展現優異效能，而 AVX 指令也得以使用更多電力。停用 Turbo Boost 讓處理器以較低頻率運作，能夠減少功耗並保持速度穩定。如需有關最佳化 AVX 的執行個體組態與工作負載的詳細資訊，請參閱 [Intel 網站](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-state。較新世代 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
```

如果此命令的輸出表示缺乏支援，我們建議您將核心升級。

本節將說明如何限制深層休眠狀態並停用 Turbo Boost (透過請求 `P1` P-state)，為這些類型的工作負載提供低延遲及最小的處理器速度變異。

**限制更深層的睡眠狀態，並在 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` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   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` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

1. 儲存檔案並結束您的編輯器。

1.  執行下列命令來重建開機組態。

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

1. 重新啟動執行個體以啟用新的核心選項。

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

1. 當您需要 `P1` P-state 提供的低處理器速度變異，請執行下列命令以停用 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` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   # 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` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

1. 儲存檔案並結束您的編輯器。

1. 重新啟動執行個體以啟用新的核心選項。

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

1. 當您需要 `P1` P-state 提供的低處理器速度變異，請執行下列命令以停用 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"
   ```

下列範例以 `c4.8xlarge` 執行個體為例，其中具備兩個執行工作並以基準核心頻率 (無 Turbo Boost) 運作的 vCPU。

```
[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-state 下同時以基準速度運作並準備好接受指令。