我有一个用 C++ 编写的大型应用程序的性能问题。该程序仅使用 150% 的 CPU,而服务器是 24 核超线程 EPYC 和其他类似应用程序可以可靠地达到预期的 4800% CPU 负载。iotop
显示几乎没有 I/O,这是预期的。
由于该程序显然既不受 I/O 限制也不受 CPU 限制,我检查strace
并发现绝大多数跟踪调用都是等待单个futex
. 也就是说:程序的 50 个线程中有 48 个似乎锁定了同一个 futex,这很好地解释了为什么 CPU 负载仅勉强超过 100%。
例子:
[pid 11581] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 11580] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 11579] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 11578] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 11577] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
[pid 11576] futex(0x55acec47a900, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
现在我的问题是:我如何找到有问题的代码?该程序不是死锁,只是速度慢,所以通常的查找死锁的技术不起作用。