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