我正在进行一些基准测试,希望在EC2中禁用超线程,看看它对我的测试应用程序性能的影响。
我的应用程序的单个实例在执行过程中只使用1个线程。
我知道我不能访问EC2机器的BIOS来禁用超线程,因为它们都是虚拟化的。但我已经使用chcpu
命令禁用了一半可用的vCPU(线程),这样我就可以模拟一个禁用超线程的环境。
对于这个基准测试,我使用了一个C4.xlarge,其中4vCPU的逻辑编号从0到3。
我运行这个命令sudo chcpu -d 1,3
,它禁用vCPU1和3。
在这样做的过程中,我假设vCPU 0和1来自一个底层裸金属内核,vCPU 2和3来自另一个内核。
这就是我知道我的假设是错误的,因为vCPU 0和4可能来自同一个裸金属核心,或者它们都可能来自不同的裸金属核心。
有人有更好的方法来禁用EC2实例中的超线程吗?
此外,当亚马逊检测到一半的vCPU被禁用时,它是否会重新排列vCPU,使其来自不同的内核?
我在寻找解决方案时发现了这个问题。
AWS在这里有关于的说明
查找cpu信息
运行lscpu --extended
你会得到一个虚拟CPU的列表,以及它们映射到的核心:
[root@ip-172-31-1-32 ~]# lscpu --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 1 1:1:1:0 yes
2 0 0 2 2:2:2:0 yes
3 0 0 3 3:3:3:0 yes
4 0 0 0 0:0:0:0 yes
5 0 0 1 1:1:1:0 yes
6 0 0 2 2:2:2:0 yes
7 0 0 3 3:3:3:0 yes
禁用某些虚拟CPU
(我们想禁用4-7),做:
echo 0>/sys/devices/system/cpu/cpuN/在线
其中N
是要禁用的虚拟cpu编号。
所以。。。
echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online
禁用超线程,每个物理核心只剩下1个vCPU。
或者使用以下脚本:
#!/usr/bin/env 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
Amazon EC2实例类型页面包括定义:
除T2和m3.mediaum外,每个vCPU都是Intel Xeon内核的超线程。
因此,您可能不想关闭超线程。
另请参阅:
- EC2节点上的超线程论坛讨论
- 白皮书:揭开vCPU实现最佳工作负载性能