同一 Amazon EC2 实例上 vCPU 之间的速度差异

Speed variation between vCPUs on the same Amazon EC2 instance

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

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

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

30个进程运行几乎相同的计算。磁盘 activity 很少(每 5 分钟几兆字节),并且没有网络 activity 或任何进程间通信。 htop 报告所有进程 运行 始终处于 100%。

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

我的问题是:

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

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

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

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

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

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

如果你把它放在 table 中,你有:

 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(处理器)都是 "Logical Core"。 将有 2 个 "Logical Cores" 与 "Physical Core"

关联

因此,对于您的情况,一种解决方案是禁用超线程:

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

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

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