在AWS EC2中禁用超线程的更好方法是什么?

时间:2017-01-23 20:47:48

标签: amazon-ec2 benchmarking hyperthreading

我正在进行一些基准测试,并希望在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被禁用时来自不同的核心?

2 个答案:

答案 0 :(得分:2)

我在寻找解决方案时发现了这个问题。

AWS有关于此here

的说明

查找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 /装置/系统/ 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)

Amazon EC2 Instance Type page包含以下定义:

  

除了T2和m3.medium之外,每个vCPU都是Intel Xeon核心的超线程

因此,您可能想要关闭超线程。

另见: