同一 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 小时才能完成。其他过程介于两者之间。
我的问题是:
- 除了与其他用户的资源争用外,是否还有其他原因可能导致同一实例中的 vCPU 之间出现显着的性能差异?就目前而言,该实例相当不适合在 threads/ranks.
之间同步的任何 OpenMP 或 MPI 作业
- 我可以做些什么来实现跨内核的更统一(希望更高)的性能?我在这里基本上排除了超线程作为罪魁祸首,因为六个 "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”。
我正在探索 运行在 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 小时才能完成。其他过程介于两者之间。
我的问题是:
- 除了与其他用户的资源争用外,是否还有其他原因可能导致同一实例中的 vCPU 之间出现显着的性能差异?就目前而言,该实例相当不适合在 threads/ranks. 之间同步的任何 OpenMP 或 MPI 作业
- 我可以做些什么来实现跨内核的更统一(希望更高)的性能?我在这里基本上排除了超线程作为罪魁祸首,因为六个 "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”。