我有一台Intel Xeon E5-2620,它有24个2 CPU。我编写了一个应用程序,它使用openssl创建了24个用于解密AES的线程。当我在100万次数据解密时将线程数从1增加到24时,我得到一个结果,如下图。
问题是当我增加线程数时,我确定的所有核心都变为100%并且由于系统的32GB ram总是至少有一半的ram是免费的,这表明问题不是核心使用或ram限制。 我想知道我应该设置一个特殊的参数来提高操作系统级别的性能,或者是进程限制,它不能达到超过4个线程的最大性能。 我必须提一下,当我执行“openssl evp ...”来测试aes加密解密时,由于进程分叉,它的性能比一个核心性能提高了大约20倍。 有没有人有任何想法?
答案 0 :(得分:1)
我终于找到了原因。多个CPU在具有不同距离的服务器上具有不同的RAM。当我创建线程直到在一个单独的cpu上创建4个线程但第五个线程将被放置在第二个cpu上时由于在os中没有使用NUMA而降低了性能。 因此,当我禁用第二个cpu的内核时,6个线程的性能会按预期增加。 您可以使用以下命令禁用第7个核心:
cd /sys/devices/system/cpu/
echo 0 > cpu6/online
答案 1 :(得分:0)
如果多处理提供20倍的加速,而等效的多线程只提供2.5倍,那么多线程代码显然存在瓶颈。此外,这个瓶颈与硬件架构无关。
它可能是您的代码或底层库中的内容。如果不对两者进行详细研究,这是不可能的。
我首先看一下多线程应用程序中的锁争用。