E-HPC集群的每个计算节点都是一台ECS实例,默认情况下,ECS实例均已开启CPU超线程。在部分HPC场景下,需要关闭CPU超线程以获得更好的性能表现。本文介绍如何关闭计算节点的CPU超线程。
背景信息
CPU是中央处理器,一个CPU可以包含若干个物理核,通过超线程HT(Hyper-Threading)技术可以将一个物理核变成两个逻辑处理核。ECS的超线程基于HT技术,允许在一个物理核上并发地运行两个线程(Thread),一个线程可以视为一个vCPU,vCPU是ECS实例的虚拟处理核。在部分HPC场景下,需要关闭计算节点的CPU超线程,使得计算节点获得更好的性能表现。
注意事项
各类型实例规格是否支持关闭超线程如下:
仅部分企业级x86计算规格的ECS实例支持关闭超线程,具体请参见更改CPU选项。
弹性裸金属服务器不支持直接关闭超线程,但可以从软件层面关闭超线程。
超级计算集群SCC默认已关闭超线程。
企业级x86计算规格实例关闭超线程
创建集群后,如果需要扩容计算节点,可以配置扩容的计算节点是否开启超线程。
对于企业级x86计算规格的ECS实例,创建后不支持关闭超线程。
手动扩容
手动扩容时,在新建节点页签下,可以配置实例是否开启HT。具体操作,请参见手动扩容集群。
在集群扩容对话框的新建节点页签下,选择节点规格(如 ecs.c7.large),并在底部的关闭 HT下拉选项中配置是否关闭超线程。其他配置项包括交换机 ID、付费类型、镜像、队列、主机名前缀、系统盘等,配置完成后单击立即购买。
自动伸缩
配置自动伸缩时,在全局配置区域,可以配置实例是否开启HT。具体操作,请参见配置自动伸缩。
弹性裸金属服务器关闭超线程
弹性裸金属服务器可以在实例创建后在软件层面(GuestOS内部)关闭超线程,包括设置nr_cpus和改变vCPU状态两种方式。GuestOS内部要关闭HT,实际上是要模拟一个物理核上对应一个逻辑核,所以将每个物理核上的对应一个逻辑核关闭,保留一个物理核对应一个逻辑核就能达到关闭超线程的效果,可以理解为offline一半的vCPU,且这些vCPU均一一分布在对应的物理核上。
对于裸金属服务器,实际需要在主板BIOS上关闭超线程,这涉及到硬件重启,链路较长且相对较慢,无法保证SLA。因此提供设置两种软件层面的方式,可以实现类似关闭超线程的效果。
方式 | 优点 | 缺点 |
设置nr_cpu |
|
|
改变vCPU状态 | 通过命令改变vCPU状态时无需重启实例。配置后可以使用 |
|
由于实际生产业务多样,阿里云无法真实模拟上述两种方式是否会对业务产生影响。在实际生产环境中使用两种软件层面的方式关闭超线程时,请您务必做好测试,确认是否对您的业务有所影响。
设置nr_cpus
nr_cpus是一个内核参数,作用是限定内核最大支持的CPU数量,取值范围为2~255。如果要实现关闭超线程的效果,可以设置nr_cpus=实例规格vCPU/2,这样内核支持的最大CPU数量就只有实际规格的一半,实际只使用一半的vCPU,达到offline一半vCPU的要求,并且nr_cpus offline的一半vCPU均是lscpu命令可以看到的后一半vCPU,实际对应offline的就是每个物理核上的一个逻辑核。
以ecs.ebmc6me.16xlarge规格为例,该规格有64个vCPU,操作系统是CentOS 7,设置nr_cpus的操作步骤如下:
远程连接弹性裸金属服务器。具体操作,请参见使用Workbench登录Linux实例。
执行
lscpu命令查看vCPU情况,确认实例是否已开启超线程。预期返回如下,如果
CPU(s)的值和实例规格的vCPU数一致,且Thread(s) per core为2,则表明该实例开启了超线程。~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-63 Thread(s) per core: 2 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2799.896 CPU max MHz: 3900.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15,32-47 NUMA node1 CPU(s): 16-31,48-63 Flags: fpu vme de pse tsc msr pae mce cx8 apic se修改grub文件。
vim /boot/grub2/grub.cfg按
i进入编辑模式,添加nr_cpus=实例规格vCPU/2,此处示例为nr_cpus=32。然后按Esc键退出编辑模式,输入:wq保存配置。
重启ECS实例。
查看效果。
执行
lscpu命令查看vCPU情况。预期返回如下,可以看到
CPU(s)为32,且Thread(s) per core为1,表明实例已关闭超线程。[root@iZu ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 32 On-line CPU(s) list: 0-31 Thread(s) per core: 1 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2301.000 CPU max MHz: 2301.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15 NUMA node1 CPU(s): 16-31 Flags: fpu vme de pse tsc msr pae mce cx8 apic se nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds执行
lscpu --extend命令,确认vCPU分布情况。预期返回如下,可以看到32个vCPU分布在32个物理核上,实现了关闭超线程的效果。
~]# lscpu --extend CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 2301.0000 1000.0000 1 0 0 1 1:1:1:0 yes 2301.0000 1000.0000 2 0 0 2 2:2:2:0 yes 2301.0000 1000.0000 3 0 0 3 3:3:3:0 yes 2301.0000 1000.0000 4 0 0 4 4:4:4:0 yes 2301.0000 1000.0000 5 0 0 5 5:5:5:0 yes 2301.0000 1000.0000 6 0 0 6 6:6:6:0 yes 2301.0000 1000.0000 7 0 0 7 7:7:7:0 yes 2301.0000 1000.0000 8 0 0 8 8:8:8:0 yes 2301.0000 1000.0000 9 0 0 9 9:9:9:0 yes 2301.0000 1000.0000 10 0 0 10 10:10:10:0 yes 2301.0000 1000.0000 11 0 0 11 11:11:11:0 yes 2301.0000 1000.0000 12 0 0 12 12:12:12:0 yes 2301.0000 1000.0000 13 0 0 13 13:13:13:0 yes 2301.0000 1000.0000 14 0 0 14 14:14:14:0 yes 2301.0000 1000.0000 15 0 0 15 15:15:15:0 yes 2301.0000 1000.0000 16 1 1 16 16:16:16:1 yes 2301.0000 1000.0000 17 1 1 17 17:17:17:1 yes 2301.0000 1000.0000 18 1 1 18 18:18:18:1 yes 2301.0000 1000.0000 19 1 1 19 19:19:19:1 yes 2301.0000 1000.0000 20 1 1 20 20:20:20:1 yes 2301.0000 1000.0000 21 1 1 21 21:21:21:1 yes 2301.0000 1000.0000 22 1 1 22 22:22:22:1 yes 2301.0000 1000.0000 23 1 1 23 23:23:23:1 yes 2301.0000 1000.0000 24 1 1 24 24:24:24:1 yes 2301.0000 1000.0000 25 1 1 25 25:25:25:1 yes 2301.0000 1000.0000 26 1 1 26 26:26:26:1 yes 2301.0000 1000.0000 27 1 1 27 27:27:27:1 yes 2301.0000 1000.0000 28 1 1 28 28:28:28:1 yes 2301.0000 1000.0000 29 1 1 29 29:29:29:1 yes 2301.0000 1000.0000 30 1 1 30 30:30:30:1 yes 2301.0000 1000.0000 31 1 1 31 31:31:31:1 yes 2301.0000 1000.0000
改变vCPU状态
您可以通过命令改变vCPU的状态,实现offline一半vCPU,即offline每个物理核的一个逻辑核。
以ecs.ebmc6me.16xlarge规格为例,该规格有64个vCPU,操作系统是CentOS 7,改变vCPU状态的操作步骤如下:
远程连接弹性裸金属服务器。具体操作,请参见使用Workbench登录Linux实例。
执行
lscpu命令查看vCPU情况,确认实例是否已开启超线程。预期返回如下,如果
CPU(s)的值和实例规格的vCPU数一致,且Thread(s) per core为2,则表明该实例开启了超线程。~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-63 Thread(s) per core: 2 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2799.896 CPU max MHz: 3900.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15,32-47 NUMA node1 CPU(s): 16-31,48-63 Flags: fpu vme de pse tsc msr pae mce cx8 apic se创建并执行脚本,改变vCPU状态。
创建脚本。
vim test.sh脚本内容如下:
#!/bin/bash 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执行脚本。
sh test.sh
查看效果。
执行
lscpu命令查看vCPU情况。预期返回如下,可以看到后32个vCPU已经offline,且
Thread(s) per core为1,表明实例已关闭超线程。# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 64 On-line CPU(s) list: 0-31 Off-line CPU(s) list: 32-63 Thread(s) per core: 1 Core(s) per socket: 16 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz Stepping: 7 CPU MHz: 2800.036 CPU max MHz: 3900.0000 CPU min MHz: 1000.0000 BogoMIPS: 4600.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 1024K L3 cache: 22528K NUMA node0 CPU(s): 0-15 NUMA node1 CPU(s): 16-31 Flags: fpu vme de pse tsc msr pae mce cx8 apic s pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg f执行
lscpu --extend命令,确认vCPU分布情况。预期返回如下,可以看到后32个vCPU已经offline,且均为每个物理核上的一个逻辑核。
[root@iZuf6d2vgqoyhr~]# lscpu --extend CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 3900.0000 1000.0000 1 0 0 1 1:1:1:0 yes 3900.0000 1000.0000 2 0 0 2 2:2:2:0 yes 3900.0000 1000.0000 3 0 0 3 3:3:3:0 yes 3900.0000 1000.0000 4 0 0 4 4:4:4:0 yes 3900.0000 1000.0000 5 0 0 5 5:5:5:0 yes 3900.0000 1000.0000 6 0 0 6 6:6:6:0 yes 3900.0000 1000.0000 7 0 0 7 7:7:7:0 yes 3900.0000 1000.0000 8 0 0 8 8:8:8:0 yes 3900.0000 1000.0000 9 0 0 9 9:9:9:0 yes 3900.0000 1000.0000 10 0 0 10 10:10:10:0 yes 3900.0000 1000.0000 11 0 0 11 11:11:11:0 yes 3900.0000 1000.0000 12 0 0 12 12:12:12:0 yes 3900.0000 1000.0000 13 0 0 13 13:13:13:0 yes 3900.0000 1000.0000 14 0 0 14 14:14:14:0 yes 3900.0000 1000.0000 15 0 0 15 15:15:15:0 yes 3900.0000 1000.0000 16 1 1 16 16:16:16:1 yes 3900.0000 1000.0000 17 1 1 17 17:17:17:1 yes 3900.0000 1000.0000 18 1 1 18 18:18:18:1 yes 3900.0000 1000.0000 19 1 1 19 19:19:19:1 yes 3900.0000 1000.0000 20 1 1 20 20:20:20:1 yes 3900.0000 1000.0000 21 1 1 21 21:21:21:1 yes 3900.0000 1000.0000 22 1 1 22 22:22:22:1 yes 3900.0000 1000.0000 23 1 1 23 23:23:23:1 yes 3900.0000 1000.0000 24 1 1 24 24:24:24:1 yes 3900.0000 1000.0000 25 1 1 25 25:25:25:1 yes 3900.0000 1000.0000 26 1 1 26 26:26:26:1 yes 3900.0000 1000.0000 27 1 1 27 27:27:27:1 yes 3900.0000 1000.0000 28 1 1 28 28:28:28:1 yes 3900.0000 1000.0000 29 1 1 29 29:29:29:1 yes 3900.0000 1000.0000 30 1 1 30 30:30:30:1 yes 3900.0000 1000.0000 31 1 1 31 31:31:31:1 yes 3900.0000 1000.0000 32 - - - ::: no - - 33 - - - ::: no - - 34 - - - ::: no - - 35 - - - ::: no - - 36 - - - ::: no - - 37 - - - ::: no - - 38 - - - ::: no - - 39 - - - ::: no - - 40 - - - ::: no - - 41 - - - ::: no - - 42 - - - ::: no - - 43 - - - ::: no - - 44 - - - ::: no - - 45 - - - ::: no - - 46 - - - ::: no - - 47 - - - ::: no - - 48 - - - ::: no - - 49 - - - ::: no - - 50 - - - ::: no - - 51 - - - ::: no - - 52 - - - ::: no - - 53 - - - ::: no - - 54 - - - ::: no - - 55 - - - ::: no - - 56 - - - ::: no - - 57 - - - ::: no - - 58 - - - ::: no - - 59 - - - ::: no - - 60 - - - ::: no - - 61 - - - ::: no - - 62 - - - ::: no - - 63 - - - ::: no - -