

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 您的 Amazon EC2 AL2 实例的处理器状态控制
<a name="processor_state_control"></a>

C 状态控制当核心处于空闲状态时可以进入的睡眠级别。C 状态从 C0 (最浅空闲状态，此时核心完全唤醒并在执行指令) 开始编号，一直增进到 C6 (最深空闲状态，此时核心关闭)。

P 状态控制核心的所需性能（以 CPU 频率表示）。P 状态从 P0 (最高性能设置，此时核心可以使用 Intel 睿频加速技术提高频率) 开始编号，然后从 P1 (请求最大基准频率的 P 状态) 一直增加到 P15 (可能最低的频率)。

改变 C 状态或 P 状态设置可以增加处理器性能一致性，减少延迟，还可以针对特定工作负载对实例进行调校。默认 C 状态和 P 状态设置可提供最大性能，是大多数工作负载的最佳选择。但是，如果您的应用程序更适合以牺牲较高的单核或双核频率的方式来降低延迟，或需要在较低频率下保持稳定性能 (而不适合使用突发式睿频加速频率)，那么可以考虑运用对这些实例可用的 C 状态或 P 状态设置。

有关允许操作系统控制处理器 C 状态和 P 状态的 Amazon EC2 实例类型的信息，请参阅 Amazon EC2 *用户*指南[中的 Amazon EC2 实例的处理器状态控制](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/processor_state_control.html)。

以下部分介绍了不同的处理器状态配置以及如何监控配置效果。这些程序是为亚马逊 Linux 编写的，适用于亚马逊 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-perf)
+ [通过限制深层 C 状态实现高性能和低延迟](#c-states)
+ [变化最少的基准性能](#baseline-perf)

## 具有最大睿频加速频率的最高性能
<a name="turbo-perf"></a>

这是 Amazon Linux AMI 的默认处理器状态控制配置，推荐大多数工作负载使用。此配置可提供最高性能，且变化更少。允许非活动核心进入深层睡眠状态可提供单核或双核进程所需的热空间，以达到最大睿频加速潜能。

以下示例显示了具有两个有效执行工作且达到其最大处理器睿频加速频率的核心的 `c4.8xlarge` 实例。

```
[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
```

在此示例中，v CPUs 21 和 28 以其最大睿频加速频率运行，因为其他内核已进入`C6`睡眠状态以节省功耗并为工作内核提供功率和散热空间。v CPUs 3 和 10（分别与 v CPUs 21 和 28 共享一个处理器内核）处于该`C1`状态，正在等待指令。

在以下示例中，所有 18 个内核都在积极执行工作，因此没有空间来实现最大睿频加速，但它们都以 3.2 GHz 的 “全核 Turbo Boost” 速度运行。

```
[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 状态，这可以降低处理器的反应延迟，但反过来也会减少其他核心达到睿频加速频率可用的空间。

禁用深层睡眠状态的常见情形是 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 状态。

   ```
   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. 重启实例以启用新的内核选项。

   ```
   [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 状态。

   ```
   # 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. 重启实例以启用新的内核选项。

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

以下示例显示的 `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
...
```

在此示例中，v CPUs 19 和 28 的内核以 3.2 的速度运行 GHz，其他内核处于 `C1` C 状态，正在等待指令。虽然运行中的核心没有达到其最大睿频加速频率，但非活动核心对新请求的响应速度将比其处于深层 `C6` C 状态时快得多。

## 变化最少的基准性能
<a name="baseline-perf"></a>

您可以通过 P 状态减少处理器频率的变化。P 状态控制核心的所需性能 (以 CPU 频率的形式)。大多数工作负载在 P0 状态下性能更好，该状态要求采用睿频加速频率。但是，您可能需要调校系统以获得稳定性能而非突发式性能，而突发式性能可能会在启用睿频加速频率后出现。

英特尔高级矢量扩展（AVX 或 AVX2）工作负载可以在较低的频率下表现良好，而 AVX 指令可以消耗更多的功率。通过禁用睿频加速来以较低的频率运行处理器，可以降低所使用的性能并保持更稳定的速度。有关优化实例配置和 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 及更高版本 — 支持英特尔 Granite Rapids（例如 R8i）
+ Linux 内核版本 5.10 及更高版本 — 支持 AMD Milan（例如 m6a）
+ Linux 内核版本 5.6 及更高版本 — 支持英特尔 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**

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 状态。

   ```
   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. 重启实例以启用新的内核选项。

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

1. 如果您需要 `P1` P 状态提供的较少处理器速度变化，请运行以下命令禁用睿频加速。

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

1. 在工作负载完成后，您可以使用以下命令重新启用睿频加速。

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

**限制 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 状态。

   ```
   # 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. 重启实例以启用新的内核选项。

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

1. 如果您需要 `P1` P 状态提供的较少处理器速度变化，请运行以下命令禁用睿频加速。

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

1. 在工作负载完成后，您可以使用以下命令重新启用睿频加速。

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

以下示例显示了一个具有 2 V 的`c4.8xlarge`实例，在基准核心频率下CPUs 主动执行工作，但没有睿频加速。

```
[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
```

v CPUs 21 和 28 的内核以 2.9 的基准处理器速度积极执行工作 GHz，所有非活动内核也在 `C1` C 状态下以基准速度运行，随时可以接受指令。