Мое первое предположение состоит в том, что планировщик Linux не поместил ваши потоки в отдельные ядра.
Планировщик Linux пытается очень усердно сохранить задачи на процессоре, который они использовали в последний раз, чтобы кэш-память имела наилучшие шансы для хранения соответствующих и полезных данных или инструкций. Я обнаружил, что на самом деле это не перебалансирует. (Я знаю, я даже видел код, который утверждает, что выполняет перебалансировку, но я заметил рабочие нагрузки с интенсивным использованием ЦП, все выполнявшиеся ранее на одном и том же уровне, не переходя на другое ядро.)
Использует ли ваш код механизм taskset(1)
, sched_setaffinity(2)
или cpuset(7)
, чтобы вручную распространять задачи, требующие большого объема вычислений, на все процессоры? Если нет, я советую сначала попробовать taskset(1)
, чтобы посмотреть, улучшится ли ваша пропускная способность, и включить вызовы sched_setaffinity(2)
в вашу программу, если вы увидите ожидаемые улучшения.