День добрый!
Сорри за офтоп, но проблему помог выявить именно Nginx.
Сервер обрабатывает несколько тысяч запросов в секунду:
nginx -> статические запросы, картинки
-> бэкенд для динамических запросов: сервер на С использующий Libevent
Сервер крутится на FreeBSD 7.2 (проверено и на 8.1) и использует Kqueue.
Периодически, ~0.1% от общего числа запросов, Nginx фиксирует ошибку, таймаут ожидания ответа от бэкенда.
Переключение бэкенд сервера с использования Kqueue на Poll решает проблему, Poll справляется с нагрузкой, но хотелось бы найти проблему и использовать Kqueue.
Ситуация стабильно воспроизводится под реальной нагрузкой запросами пользователей.
Воспроизвести проблему с помощью нагрузки утилитой http_load (по 1000 запросов в секунду с нескольких машин) получается далеко не всегда, не могу понять в чем разница!?
Изучение логов Libevent в бэкенде (по проблемным запросам) показывает:
- принимается входящее от Nginx соединение.
- сокет регистрируется в Kqueue и ожидает поступления данных для чтения.
- проходит время таймаут (60 секунд), Nginx закрывает соединение со своей стороны.
- Kqueue сообщает о появлении данных для чтения и возвращает сокет в Libevent, затем данные попадают обработчику бэкенд сервера.
Возможно кто-то сталкивался с таким странным поведением Kqueue?
Nginx работает стабильно на этом же сервере, использует Kqueue.
Может быть гуру смогут помочь разобраться, в чем может быть проблема? Игорь, Масим?