5

在扩展以使用具有一定内存密集型作业(在我的情况下为 2.5GB)的云实例上的所有内核时,是否有其他人注意到糟糕的性能?

当我在我的四核至强芯片上本地运行作业时,使用 1 个内核和所有 4 个内核之间的差异是所有内核的速度降低了大约 25%。据我了解,这是可以预料的;随着内核用完,时钟频率下降是多核芯片设计的一部分。

但是,当我在多核虚拟实例上运行作业时,我发现使用 1 个内核和所有内核之间的处理时间减慢了 2 到 4 倍。我在 GCE、EC2 和 Rackspace 实例上看到了这一点。而且我已经测试了许多不同的实例类型,主要是提供的最快的。

那么其他具有相同大小的内存使用量的工作的其他人是否看到过这种行为?

我正在运行的作业是用 fortran 编写的。我没有写它们,我也不是一个真正的 fortran 人,所以我对它们的了解是有限的。我知道他们的 I/O 需求很低。当我在它们运行时观察它们时,它们似乎受 CPU 限制。它们无需相互通信即可运行,即,令人尴尬的并行。它们每个占用大约 2.5GB 的内存。

所以到目前为止,我最好的猜测是,消耗这么多内存的作业会受到虚拟化层内存管理的巨大打击。也可能是我的工作正在争夺 I/O 资源,但根据专家的说法,这似乎不太可能。

我现在的解决方法是使用 GCE,因为它们具有单核实例,实际上运行工作的速度与我笔记本电脑的芯片一样快,并且几乎按核心按比例定价。

4

1 回答 1

1

您可能会遇到内存带宽限制,具体取决于您的数据访问模式。

linuxperf工具可能会对此有所了解,但我承认我并不完全理解您对问题的描述。如果我理解正确:

  1. 在笔记本电脑上运行一份单线程程序需要 X 分钟才能完成。

  2. 在笔记本电脑上运行 4 个单线程程序副本,每个副本需要 X * 1.25 分钟才能完成。

  3. 在各种云实例上运行一份单线程程序需要 X 分钟才能完成。

  4. 在 N 核虚拟云实例上运行 N 个单线程程序副本,每个副本需要 X * 2-4 分钟才能完成。

如果是这样,听起来您要么遇到内核争用,要么陷入内存 I/O 争用。看看各种 fortran 编译器选项是否有助于优化内存访问模式会很有趣;例如,启用 SSE2 加载/存储内在函数或其他优化。您还可以将结果与 gcc 和 intel 的 fortran 编译器进行比较。

于 2014-07-29T04:40:23.473 回答