Процесс под FreeBSD 9.0 зависает в непрерывном спящем режиме, по-видимому, без системного вызова (пустой wchan)

У меня есть собственный процесс ведения журнала, который считывает из STDIN и отправляет данные через TCP на подписанный сервер ведения журнала. В моем случае STDIN — это журнал доступа, который подключен к Apache httpd 2.2, например, в httpd.conf: CustomLog "|/usr/local/bin/serelog" по умолчанию

Мой процесс serelog иногда уходит в непрерывный сон под FreeBSD 9.0 и не выходит из него. Однако он надежно работает в других операционных системах, включая FreeBSD 8, Linux 2.6 и Linux 3.1.

Как узнать, в чем может быть причина непрерывного сна?

Общая структура такая: httpd --[PIPE]--> serelog --[TCP-CONNECTION]--> scribed

До сих пор я сделал следующий анализ:

  • Использование ps: stat "D" и wchan "-". Таким образом, по-видимому, системного вызова нет, что для меня не имеет особого смысла, поскольку процесс находится в непрерывном спящем режиме и должен находиться в ядре.
  • Поскольку процесс находится в состоянии «D», он не реагирует на удаление -9, как ожидалось.
  • Присоединение фермы к serelog извне из оболочки: Пока ферма подключена, serelog работает без сбоев. Вскоре (в секундах) после отсоединения фермы от serelog, serelog переходит в состояние «D».
  • При присоединении truss к serelog ПОСЛЕ того, как он перешел в состояние «D», truss ничего не печатает
  • В состоянии «D» lsof показывает, что входящий PIPE заполнен. Это ожидаемо, так как в состоянии «D» процесс «спит» и больше не может читать. Исходящее TCP-СОЕДИНЕНИЕ пусто.
  • Если я убью «окружающий» сервер Apache httpd, процесс serelog в конечном итоге завершится (например) через 40 минут.
  • Проверка того, что другие сообщают на форумах о проблеме бесперебойной работы, не увенчалась успехом: в моей настройке нет NFS. И поскольку это сервер, пользователь также не взаимодействует с дисководами компакт-дисков или подключаемым оборудованием.

Итак, теперь я застрял в процессе, который не прерывается, по-видимому, не находится в системном вызове и надежно работает при трассировке. Единственная хорошая вещь заключается в том, что я могу воспроизвести поведение за несколько секунд или минут, когда я отправляю много HTTP-запросов через нагрузочный тест JMeter (5 потоков в JMeter).

Приветствуются любые советы по отладке, настройке параметров ядра.

Привет


person Christian Esken    schedule 20.03.2012    source источник
comment
Что такое системный вызов перед зависанием?   -  person janm    schedule 21.03.2012
comment
Я не знаю системного вызова. Именно в этом суть. ферма ничего не печатает при подключении ПОСЛЕ возникновения проблемы. При креплении фермы ДО возникновения проблемы проблема просто не возникнет. А ps показывает - как wchan.   -  person Christian Esken    schedule 21.03.2012
comment
Может быть ошибка ядра или регрессия. Вы подали PR?   -  person Roland Smith    schedule 27.03.2012
comment
@Roland Smith: Да, тем временем я подал PR в список ошибок FreeBSD: freebsd.org/cgi/query-pr.cgi?pr=166340 . Я обновлю свой вопрос, как только появится решение или существенная информация.   -  person Christian Esken    schedule 29.03.2012


Ответы (1)


Проблема оказалась реальной ошибкой ядра FreeBSD и теперь исправлена ​​в ядре.

Ссылка на PR: http://www.freebsd.org/cgi/query-pr.cgi?pr=166340

Предлагаемый патч: http://lists.freebsd.org/pipermail/freebsd-bugs/2012-May/048610.html

person Christian Esken    schedule 13.06.2012