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