День добрый!
Есть сервер, обрабатывающий около 2К запросов в секунду. Запросы идут на nginx и передаются на backend. Раньше в роли бэкенда был php скрипт, запускаемый через fastcgi. В связи с возрастающей на сервер нагрузкой был реализован демон на С, использующий libevent для работы с сетью.
После смены бэкенда на демона в error.log переодически сыплются ошибки:
2011/08/08 18:48:20 [error] 30456#0: *17869889685 upstream timed out (60: Operation timed out) while reading response header from upstream, client: XX.XX.XX.XX, server: someserver.com, request: "GET /query/xxx/yyy/ HTTP/1.1", upstream: "http://127.0.0.1:8888/query/xxx/yyy/", host: "someserver.com", referrer: "http://somereferrer.com/"
Выставление бОльших таймаутов не помогло решить проблему.
Возможно проблема где-то в бэкенде, но:
1) Запросы, отправляемые из браузера, через nginx или напрямую на backend, обрабатываются за доли секунды.
2) Внутренние очереди сообщений демона (через которые проходят запросы на обрабоку между сетевым потоком и потоком воркером и результаты на отправку) не превышают пары десятков ожидающих.
3) Очередь на коннект:
%netstat -Lan
Current listen queue sizes (qlen/incqlen/maxqlen)
Proto Listen Local Address
tcp4 320/0/2048 127.0.0.1.8888 --- демон
tcp4 0/0/4096 *.80 --- nginx
4) Активные соединения по демону:
%netstat -tn | grep 8888 | wc -l
16836
%netstat -tn | grep 8888 | grep -v "TIME_WAIT" | wc -l
1203
ОС: FreeBSD 7.2
nginx: nginx version: nginx/1.0.0
Подскажите, как диагностировать проблему?
Спасибо!