在AWS EC2中禁用超线程的更好方法



我正在进行一些基准测试,希望在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实现最佳工作负载性能

相关内容

  • 没有找到相关文章

最新更新