禁用英特尔超线程技术
如果基础架构配置和应用程序设置需要,可以在客户虚拟机上禁用英特尔超线程技术(英特尔 HT 技术)。
本主题中有关在客户虚拟机上禁用英特尔超线程技术的说明仅适用于在使用基于英特尔处理器的主机上配置的虚拟服务器。
了解禁用英特尔超线程技术的原因
英特尔超线程技术是一个描述同步多线程(SMT)的术语。 超线程技术将每个物理内核分成两个虚拟处理器。 超线程技术就像把一条只有一条车道的宽阔马路变成两条相对较窄的车道。 如果车速过慢或过快,双车道公路比单车道公路能提供更好的服务。 当文件 I/O、网络 I/O 和其他较慢的操作与 CPU 密集型操作混合时,超线程技术可提供更好的应用性能。 与单线程模式相比,超线程技术的性能优势通常在 0-30% 之间。 某些应用程序的性能也可能会下降。
超线程技术并不总是可取的。 在这种情况下,您可能更愿意禁用它,并以单线程模式运行内核。 考虑禁用超线程技术有三个主要原因。 第一个原因与软件许可有关。 许多传统软件供应商,如电子设计自动化(EDA)工具提供商,无论使用超线程技术还是单线程模式,都要求为每个 CPU 提供许可证。 当内核处于超线程技术模式时,尽管应用程序的性能并没有比单线程模式高出两倍,但所需的许可证数量却是单线程模式的两倍。 因此,EDA 和其他从业人员禁用了超线程技术,更倾向于在单线程模式下运行软件。
禁用超线程技术的第二个原因是为了避免负载平衡问题和超线程技术带来的操作系统开销。 高性能计算(HPC)应用程序通常会创建与物理内核数量相同的消息传递接口(MPI)任务,并让操作系统在不同的物理内核上管理每个 MPI 任务。 启用超线程技术后,操作系统可看到两倍的 CPU。 虽然操作系统通常会将 MPI 任务映射到一个内核的两个线程之一,但偶尔也会将两个任务都放在一个物理内核上,让其他内核空闲出来。 在一个物理内核上同时执行这两项任务而其他内核空闲的情况下,会导致系统利用率达不到最佳状态,应用程序性能也会发生变化。 此外,操作系统内核会为每个运行中的 CPU 分配数据结构并不断更新,这样在超线程技术模式下就能分配更多的内核空间,减轻管理开销。 通过禁用超线程技术减轻操作系统开销,有助于许多高性能计算应用程序实现最佳性能。
禁用超线程技术的第三个原因是安全性。 一些用户倾向于禁用超线程技术,以避免与超线程技术执行相关的任何侧信道攻击可能性。IBM Cloud不会在两个客户的虚拟机之间共享一个物理内核,因此不可能发生此类攻击。
如果确定禁用超线程技术适合您的配置,您可以使用以下方法之一在 IBM Cloud 中的客户虚拟机 (VM) 上禁用超线程技术。
在客户虚拟机中检查超线程技术状态并更改它:基础知识
虚拟机启动并运行后,您可以在 Linux 操作系统上使用 lscpu
命令检查超线程技术状态。 您会看到类似以下内容的输出:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
...
在此示例中,请注意每个内核的线程数显示为 2,表明已启用超线程技术。 虚拟机有 4 个物理内核和 8 个虚拟 CPU。 Linux内核的现代版本允许用户根据每个内核禁用超线程技术。 您可以启用超线程技术运行某些内核,禁用超线程技术运行其他内核。 要查看每个核心的情况,可以使用 lscpu --extended
命令。 您会看到类似以下内容的输出:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 0 0 2 5:5:2:0 yes
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
前面的示例输出显示,每个内核有 2 个 CPU,并且两个 CPU 都在线。 核心 0 有兄弟姐妹:CPU 0 和 CPU 1。 要获取同级列表,可以在设备文件系统的 thread_sibling_list
中找到数据,如下例所示:
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
0-1
0-1
2-3
2-3
4-5
4-5
6-7
6-7
某些内核和 CPU 架构在线程同级列表中使用逗号(, )而不是连字符(-)。
您可以通过在相应 CPU 的设备文件系统中的在线字段中写入零 ( 0 ) 来禁用单个核心的超线程技术。 例如,要禁用核心 2(上一示例中的 CPU 5)上的超线程技术,请运行以下命令:
echo 0 > /sys/devices/system/cpu/cpu5/online
运行 lscpu --extended
命令时,该命令会使 CPU 5 脱机,禁用内核 2 上的超线程技术,但其他内核仍保持超线程技术模式,如下例所示:
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 - - - ::: no
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
您可以对每个内核重复前面的过程,禁用虚拟机的超线程技术。 当虚拟机拥有大量 CPU 时,这可能会很困难。 下面的脚本是一个非常简单的 bash 脚本,用于禁用每个内核上的超线程技术:
#!/bin/bash
for vcpu in `cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2 | cut -d- -f2 | uniq`; do
echo 0 > /sys/devices/system/cpu/cpu$vcpu/online
done
为特定内核和相关 CPU 启用超线程技术
如果想再次启用超线程技术,可在每个 CPU 的联机字段中写入 1。
echo 1 > /sys/devices/system/cpu/cpu5/online
为虚拟机中的所有内核启用超线程技术
或者,也可以使用以下简单的 bash 脚本为虚拟机启用超线程技术。
#!/bin/bash
for vcpu in `lscpu --extended | grep "no" | awk '{print $1}'`; do
echo 1 > /sys/devices/system/cpu/cpu$vcpu/online
done
在我的客户虚拟机中启用和禁用超线程技术:脚本
您还可以尝试使用 Wyatt Gorman 创建的 脚本来启用和禁用超线程技术。 下载并运行脚本后,您将获得以下选项:
OPTIONS
-d | --disable Disable Hyper-Threaded vCPUs
-e | --enable Enable Hyper-Threaded vCPUs
-s | --show Show Hyper-Threading status
-h | --help Display this usage output
您可以获取超线程技术状态,禁用超线程技术,并为虚拟机中的所有内核启用超线程技术。 但是,如果需要在部分内核上禁用超线程技术,请按照基础知识部分的步骤操作。
启动时在客户虚拟机中启用和禁用超线程技术:用户数据
IBM Cloud提供了一种在创建虚拟服务器实例时指定可选数据的方法,以便在实例配置时配置实例或运行脚本;这种方法称为用户数据。
在虚拟服务器实例创建过程中,可以在 IBM Cloud 控制台的用户数据部分指定以下示例代码:
#cloud-config
bootcmd:
- for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done
您在用户数据字段中提供的脚本会在实例启动过程中禁用超线程技术。 您将看到 CPU 已禁用的信息:
dmesg |grep offline
[ 9.488364] smpboot: CPU 1 is now offline
[ 9.544370] smpboot: CPU 3 is now offline
[ 9.572823] smpboot: CPU 5 is now offline
[ 9.600633] smpboot: CPU 7 is now offline
您可以使用类似的方法将此流程注入 Terraform。