【问题标题】:Performance Decrease by Increasing Threads Number More Than 4 in 24 Core CPU在 24 核 CPU 中增加线程数超过 4 会导致性能下降
【发布时间】:2016-12-12 07:18:34
【问题描述】:

我有一个 Intel Xeon E5-2620,它有 24 on 2 CPU。我编写了一个应用程序,它创建了 24 个线程来使用 openssl 解密 AES。当我在 100 万个数据解密上将线程数从 1 增加到 24 时,我得到如下图所示的结果。

问题是当我增加线程数时,我确定的所有内核都变为 100%,并且由于系统的 32GB ram 总是至少有一半的 ram 是空闲的,这表明问题不是内核使用或 ram 限制。 我想知道我应该设置一个特殊参数来提高操作系统级别的性能还是进程限制不能达到最大性能超过 4 个线程。 不得不提的是,当我执行“openssl evp ...”来测试 aes 加密解密时,由于进程分叉,它的性能比一个核心性能提高了大约 20 倍。 有人知道吗?

【问题讨论】:

  • 一个问题是一半的“核心”不是实际核心,而是一种虚拟核心,通过一些流水线技巧进行模拟。这就是为什么当你超过 12 个线程时会有一个(小)颠簸。
  • openssl evp 是单线程的吗?
  • 有很多可能的解释,但我们只能猜测如果你不向我们展示基准cosde ...(提示)。
  • 首先,根据 Intel ARK,处理器有 6 个内核(具有超线程)。其次,我的猜测是您的代码并行化可能被破坏了,但是您设法阻止处理器能够使用 Intel Boost Turbo。因此,正在高效工作的(唯一?)核心的 CPU 频率最多降低了 20%。

标签: c++ multithreading ubuntu multiprocessing multicore


【解决方案1】:

我终于找到了原因。多个 CPU 在具有不同距离的服务器上具有不同的内存。当我创建线程直到在一个 cpu 上创建 4 个线程但第五个线程将放置在第二个 cpu 上时,由于未在 os. 因此,当我禁用第二个 cpu 的内核时,6 个线程的性能按预期提高了。 您可以使用以下命令禁用第 7 核:

cd /sys/devices/system/cpu/
echo 0 > cpu6/online

【讨论】:

  • 这里Intel® Xeon® Processor E5-2620 显示Max # of Memory Channels = 4。此外,从图表时间增加 4 核心后。这些东西有关系吗?我猜核心可能有专用的内存通道,当线程被创建时,它们是均匀分布的,这样每个核心都可以通过核心获得自己的内存通道。因此,从第 5 个线程开始,内存争用开始了。仅创建 4 个线程时,能否显示单个线程的 core/cpu-id?
【解决方案2】:

如果多处理提供 20 倍的加速,而等效的多线程仅提供 2.5 倍,那么多线程代码显然存在瓶颈。此外,这个瓶颈与硬件架构无​​关。

它可能存在于您的代码或底层库中。如果不详细研究这两者,真的是无法判断的。

我将从查看您的多线程应用程序中的锁争用开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多