Процесс под FreeBSD 9.0 зависает в беспрерывном сне без системного вызова (пустой wchan) - PullRequest
1 голос
/ 20 марта 2012

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

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

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

Общая структура выглядит следующим образом: httpd - [PIPE] -> serelog - [TCP-CONNECTION] -> scribed

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

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

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

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

Привет

1 Ответ

1 голос
/ 13 июня 2012

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

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

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

...