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

Sri*_*esh 5 benchmarking amazon-ec2 hyperthreading

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

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

据我了解,我无法访问 EC2 计算机的 BIOS 来禁用超线程,因为它们都是虚拟化的。但我使用该chcpu命令禁用了一半可用的 vCPU(线程),以便我可以模拟禁用超线程的环境。

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

我运行此命令sudo chcpu -d 1,3禁用 vCPU 1 和 3。

在此过程中,我假设 vCPU 0 和 1 来自单个底层裸机核心,vCPU 2 和 3 来自另一个核心。

我知道我的假设是错误的,因为 vCPU 0 和 4 可能来自同一个裸机核心,也可能全部来自不同的裸机核心。

有没有人有更好的方法来禁用 EC2 实例中的超线程?

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

Bra*_*don 5

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

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 
Run Code Online (Sandbox Code Playgroud)

禁用某些虚拟 CPU

(我们想要禁用 4-7),执行以下操作:

echo 0 > /sys/devices/system/cpu/cpuN/online

其中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
Run Code Online (Sandbox Code Playgroud)

禁用超线程并为每个物理核心保留 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*ein 0

Amazon EC2 实例类型页面包含定义:

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

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

也可以看看: