Поток Linux различия в расписании в многоядерных системах?

У нас есть несколько программ в стиле «конвейера», чувствительных к задержкам, которые имеют ощутимое снижение производительности при запуске на одном ядре 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 моего поставщика. Подозрительно, в одном из обновлений говорилось что-то вроде " br = новый BufferedReader (новый FileInputStream (имя файла)); в то время как (правда) {String s = br.readLine (); если (s == null) перерыв; ... } ...

Я читаю файл через BufferedReader

String filename = ...
br = new BufferedReader( new FileInputStream(filename));
while (true) {
   String s = br.readLine();
   if (s == null) break;
   ...
}

. Мне нужно знать, разделены ли строки символом '\ n' или '\ r \ n' есть способ узнать?

Я не хочу открывать FileInputStream, чтобы сначала сканировать его. В идеале я хотел бы спросить BufferedReader, поскольку он должен знать.

Я счастлив переопределить BufferedReader, чтобы взломать его, но я действительно не хочу открывать файловый поток дважды.

Спасибо,

Примечание: текущий разделитель строк (возвращаемый System.getProperty ("line. разделитель ")) нельзя использовать, так как файл мог быть записан другим приложением в другой операционной системе.

12
задан Jonas 13 February 2012 в 02:20
поделиться