У меня проблема с производительностью большого приложения, написанного на C ++. Программа использует только 150% ЦП, в то время как сервер представляет собой 24-ядерный гиперпотоковый EPY C, а другие аналогичные приложения могут надежно выдерживать ожидаемую нагрузку ЦП 4800%. iotop
практически не показывает операций ввода-вывода, что ожидалось.
Поскольку программа явно не привязана ни к вводу-выводу, ни к ЦП, я проверил strace
и обнаружил, что подавляющее большинство отслеживаемых вызовов ждут на сингле futex
. То есть: 48 из 50 потоков в программе, похоже, блокируют один и тот же фьютекс, что довольно хорошо объясняет, почему загрузка ЦП едва превышает 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 ...>
Теперь для меня проблема: как найти проблемный код? Программа не тупиковая, просто медленная, поэтому обычные методы поиска тупиковых ситуаций не работают.