我正在进行一些基准测试,并希望在EC2中禁用超线程,以查看它对我的测试应用程序性能的影响。
我的应用程序的单个实例在执行期间仅使用1个线程。
据我所知,我无法访问EC2机器的BIOS以禁用超线程,因为它们都是虚拟化的。但是我使用chcpu
命令来禁用一半可用的vCPU(线程),这样我就可以模拟超线程禁用环境。
对于此基准测试,我使用C4.xlarge,其中4vCPU逻辑编号为0到3。
我运行此命令sudo chcpu -d 1,3
,禁用vCPU 1和3。
在这样做时,我假设vCPU 0和1来自单个底层裸机核心,vCPU 2和3来自另一个核心。
这就是我知道我的假设是错误的,因为vCPU 0和4可能来自相同的裸机核心,或者所有这些都可能来自不同的裸机核心。
有没有人有更好的方法在EC2实例中禁用超线程?
亚马逊重新安排vCPU,以便在检测到一半vCPU被禁用时来自不同的核心?
答案 0 :(得分:2)
我在寻找解决方案时发现了这个问题。
AWS有关于此here
的说明运行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
(我们要禁用4-7),执行:
echo 0> / SYS /装置/系统/ 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
答案 1 :(得分:1)