【问题标题】:Speed variation between vCPUs on the same Amazon EC2 instance同一 Amazon EC2 实例上的 vCPU 之间的速度变化
【发布时间】:2015-05-10 01:55:58
【问题描述】:

我正在探索在 Amazon EC2 上运行数值计算的可行性。我目前正在运行一个c4.8xlarge 实例。它有 36 个 vCPU,每个 is a hyperthread 是一个 Haswell Xeon 芯片。实例以 HVM 模式运行 Ubuntu。

我有一个完全顺序(即单线程)程序的 GCC 优化二进制文件。因此,我启动了 30 个 CPU 固定实例:

for i in `seq 0 29`; do
    nohup taskset -c $i $BINARY_PATH &> $i.out &
done

这 30 个进程运行几乎相同的计算。磁盘活动很少(每 5 分钟几兆字节),也没有任何网络活动或进程间通信。 htop 报告所有进程都以 100% 持续运行。

此时整个过程已经运行了大约 4 个小时。六个流程 (12-17) 已经完成了它们的任务,而流程 0、20、24 和 29 看起来需要 4 小时才能完成。其他进程介于两者之间。

我的问题是:

  1. 除了与其他用户的资源争用之外,是否还有其他因素可能导致同一实例中 vCPU 之间的性能出现显着差异?就目前而言,该实例相当不适合在线程/等级之间同步的任何 OpenMP 或 MPI 作业。
  2. 我可以做些什么来在内核之间实现更均匀(希望更高)的性能?我在这里基本上排除了超线程作为罪魁祸首,因为六个“快速”进程是相同物理内核上的超线程。也许有一些与 NUMA 相关的问题?

【问题讨论】:

  • 假设您的内核和 Amazon 的虚拟机管理程序都没有移动线程,那么您有 6 个物理内核,每个内核运行 1 个“快速”进程,然后有 12 个物理内核,每个内核运行 2 个“慢”进程。这增加了 18 个物理内核,这很可能是 Amazon 将您的 36 个 vCPU 映射到的位置。因此,仅超线程就足以导致这种行为。
  • 为了获得更均匀的性能,请尝试在您的 36 个 vCPU 实例中运行 18 或 36 个进程。如果这还不够好,请尝试找出 vCPU 和物理内核之间的确切映射,然后相应地绑定您的进程。

标签: amazon-web-services amazon-ec2


【解决方案1】:

我的经验是在 c3 实例上。可能与 c4 类似。

例如,以具有 8 个 vCPU 的 c3.2xlarge 实例为例(下面的大部分解释来自与 AWS 支持人员的直接讨论)。

事实上,只有前 4 个 vCPU 可用于繁重的科学计算。最后 4 个 vCPU 是超线程。对于科学应用程序,使用超线程通常没有用处,它会导致上下文交换或减少每个线程的可用缓存(和相关带宽)。

要找出 vCPU 和物理内核之间的确切映射,请查看 /proc/cpuinfo

  • “physical id”:显示物理处理器id(c3.2xlarge中只有一个处理器)
  • “processor”:给出 vCPU 的数量
  • “core id”:告诉您哪些 vCPU 映射回每个 Core ID。

如果你把它放在一个表中,你有:

 physical_id   processor    core_id
 0             0            0
 0             1            1
 0             2            2
 0             3            3
 0             4            0
 0             5            1
 0             6            2
 0             7            3

您也可以从“thread_siblings_list”中获取此信息。 cpuX 的硬件线程在与 cpuX 相同的内核中的内部内核映射 (https://www.kernel.org/doc/Documentation/cputopology.txt):

cat /sys/devices/system/cpu/cpuX/topology/thread_siblings_list

启用超线程后,每个 vCPU(处理器)都是一个“逻辑核心”。 将有 2 个与“物理核心”关联的“逻辑核心”

因此,在您的情况下,一种解决方案是使用以下命令禁用超线程:

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

c3.2xlarge 的 X 为 4...7

编辑:您只能在 HVM 实例中观察到这种行为。在 PV 实例中,此拓扑被管理程序隐藏:/proc/cpuinfo 中的所有核心 id 和处理器 id 都是“0”。

【讨论】:

  • 感谢您的回答。我怀疑这很可能是这种情况,但无法确认,因为我目前没有运行实例。下次我会留意的。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多