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

Amazon ec2 在AWS EC2中禁用超线程的更好方法?,amazon-ec2,benchmarking,hyperthreading,Amazon Ec2,Benchmarking,Hyperthreading,我正在做一些基准测试,希望在EC2中禁用超线程,以查看它对测试应用程序性能的影响 我的应用程序的单个实例在执行期间仅使用1个线程 我知道我无法访问EC2机器的BIOS来禁用超线程,因为它们都是虚拟化的。但是我已经使用chcpu命令禁用了一半可用的vCPU(线程),这样我就可以模拟禁用超线程的环境 对于这个基准测试,我使用的是C4.xlarge,4vCPU的逻辑编号为0到3 我运行这个命令sudochcpu-d1,3,它禁用vCPUs 1和3 在执行此操作时,我假设vCPUs 0和1来自单个底层裸

我正在做一些基准测试,希望在EC2中禁用超线程,以查看它对测试应用程序性能的影响

我的应用程序的单个实例在执行期间仅使用1个线程

我知道我无法访问EC2机器的BIOS来禁用超线程,因为它们都是虚拟化的。但是我已经使用
chcpu
命令禁用了一半可用的vCPU(线程),这样我就可以模拟禁用超线程的环境

对于这个基准测试,我使用的是C4.xlarge,4vCPU的逻辑编号为0到3

我运行这个命令
sudochcpu-d1,3
,它禁用vCPUs 1和3

在执行此操作时,我假设vCPUs 0和1来自单个底层裸机内核,而vCPUs 2和3来自另一个内核

这就是我知道我的假设是错误的地方,因为vCPU 0和4可能来自同一个裸金属核心,或者它们都可能来自不同的裸金属核心

有人有更好的方法在EC2实例中禁用超线程吗

亚马逊是否重新排列vCPU,以便在检测到一半vCPU被禁用时,它们来自不同的内核?

包括以下定义:

每个vCPU都是Intel Xeon内核的超线程(T2和m3.medium除外)

因此,您可能不想关闭超读功能

另见:

  • 白皮书:

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

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/online

其中
N
是要禁用的虚拟cpu号

所以

禁用超线程,并为每个物理核心保留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

这意味着我实例中的每个vCPU都是一个超线程,对吗?另外,通过禁用每2个超线程中的1个(vCPU),我将禁用该特定核心的超线程。我的假设是,如果您使用一个包含4个vCPU的EC2实例,并且您设法禁用了超线程,那么您可能只会得到2个vCPU。我找不到任何关于哪个vCPU映射到哪个内核的说明。这正是我的问题。我不知道哪个vCPU映射到哪个内核,因此不知道要禁用哪个vCPU来模拟禁用超线程的运行时环境。有没有办法找到映射?鉴于虚拟化环境,我怀疑AWS不打算用户修改虚拟化层,也不打算修改超线程配置。您应该以配置实例的方式使用实例对AmazonEC2进行基准测试。这将是未来工作负载的可靠、可复制的环境。我不知道2017年的情况,但现在您可以使用EC2 CPU选项关闭HT。在Linux中,关闭每个奇数编号的内核/线程将禁用HT,因为cpu就是这样枚举的;do echo 1>/sys/devices/system/cpu/$cpu/online;完成
#!/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