Мне кажется тут может помочь Off-CPU анализ. Можно попробовать подписаться на евенты планировщика с помощью perf и отслеживать когда треды уходят в ожидание:
echo 1 | sudo tee /proc/sys/kernel/sched_schedstats # надо разрешить сбор статов планировщика
sudo perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -g --call-graph=dwarf -- ./a.out # a.out -- ваш бинарь, скомпиленный с дебаг символами (иначе стека не увидим)
# Ждём пока программа завершиться и perf выплюнет perf.data файл
sudo perf report # запускается tui'шка в которой можно посмотреть где эти евенты происходили
Легче конечно получить FlameGraph и по нему глянуть. Как это сделать можно глянуть тут. Или с помощью bcc/tools/offcputime.