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