У нас есть несколько программ в стиле «конвейера», чувствительных к задержкам, которые имеют ощутимое снижение производительности при запуске на одном ядре 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. разделитель ")) нельзя использовать, так как файл мог быть записан другим приложением в другой операционной системе.