У нас есть несколько чувствительных к времени ожидания программ типа конвейера, которые имеют ощутимое снижение производительности при запуске на одном ядре Linux по сравнению с другим. В частности, мы видим лучшую производительность с ядром 2.6.9 CentOS 4.x (RHEL4) и худшую производительность с ядром 2.6.18 из CentOS 5.x (RHEL5).
Под "конвейерной" программой я подразумеваю ту, которая имеет несколько потоков. Несколько потоков работают с общими данными. Между каждым потоком есть очередь. Таким образом, поток A получает данные, отправляет данные в Qab, поток B извлекает данные из Qab, выполняет некоторую обработку, затем передает данные в Qbc, поток C извлекает данные из Qbc и т. Д. Исходные данные поступают из сети (сгенерированной третьей стороной).
Мы в основном измеряем время с момента получения данных до момента, когда последний поток выполняет свою задачу. В нашем приложении мы видим увеличение от 20 до 50 микросекунд при переходе с CentOS 4 на CentOS 5.
Я использовал несколько методов профилирования нашего приложения и определил, что дополнительная задержка в CentOS 5 возникает из-за операций с очередями (в частности, выталкивания).
Тем не менее, я могу улучшить производительность в CentOS 5 (до уровня CentOS 4), используя набор задач для привязки программы к подмножеству доступных ядер.
Так что мне кажется, что между CentOS 4 и 5 произошли некоторые изменения (предположительно в ядре), из-за которых потоки планировались по-другому (и это различие неоптимально для нашего приложения).
Хотя я могу «решить» эту проблему с помощью набора задач (или в коде через sched_setaffinity ()), я предпочитаю не делать этого. Я надеюсь, что есть какое-то настраиваемое ядро (или, может быть, набор настроек), чьи значения по умолчанию были изменены между версиями.
У кого-нибудь есть опыт с этим? Возможно, еще несколько областей для расследования?
Обновление: В данном конкретном случае проблема была решена путем обновления BIOS от поставщика сервера (Dell). Я вырвал свои волосы довольно долго на этом. Пока я не вернулся к основам и не проверил обновления BIOS моего поставщика. Подозрительно, в одном из обновлений сказано что-то вроде «улучшить производительность в режиме максимальной производительности». После того, как я обновил BIOS, CentOS 5 стал быстрее - вообще говоря, но особенно в моих тестах очереди и реальных производственных работах.