c++ - 在 24 核 CPU 中增加线程数超过 4 会导致性能下降

标签 c++ multithreading ubuntu multiprocessing multicore

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

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

最佳答案

我终于找到原因了。多个 CPU 在具有不同距离的服务器上具有不同的内存。当我创建线程时,直到在一个 cpu 上创建了 4 个线程,但是第五个线程将被放置在第二个 cpu 上,这会降低性能,因为在操作系统中不使用 NUMA。 所以当我禁用第二个 cpu 的内核时,6 个线程的性能如预期的那样提高了。 您可以使用以下命令禁用第 7 个核心:

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

关于c++ - 在 24 核 CPU 中增加线程数超过 4 会导致性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41095859/

相关文章:

c++ - MVS C++ 错误 : string subscript out of range

c++ - 关于 "Address-of operator"(&)和c、c++中数组的问题

c# - Thread.Join 似乎错误地返回 false

linux - 日期 : extra operand '+%s'

c++ - 高效地在容器中查找多个项目

multithreading - 当我在 Clojure 中定义来自多个线程的变量时会发生什么?

java - 线程转储分析

python - 在 ubuntu 上为 arm board(beaglebone black)交叉编译 opencv 2.4.5-链接 CXX 共享库错误为 92%

linux - Ubuntu:在启动时使用 args 启动 shell 脚本

c++ - libcurl 使用相同的用户定义端口发送定期请求