Re: Зависание nginx

Maxim Dounin mdounin на mdounin.ru
Сб Янв 29 17:13:11 MSK 2011


Hello!

On Sat, Jan 29, 2011 at 01:51:12PM +0300, Andrey Ilyin wrote:

> Добрый день!
> 
> Позвольте  привлечь  ваше  внимание  к  проблеме  зависания nginx'a на
> FreeBSD.
> 
> Nginx перестает принимать новые запросы, возникают ошибки
> Operation timed out after 10000 milliseconds with 0 bytes received
> Failure when receiving data from the peer
> 
> При  этом  nginx  начинает  использовать  100%  CPU  и это значение не
> изменяется.
> 
> Хуже  всего,  что  не  получается  убить  процессы nginx'a ни одним из
> kill'ов,  приходится  перезапускать  сервер.

Если процесс не убивается по kill -9 - значит, проблема в ядре.  
Народная мудрость.

> Подробнее я уже написал на форуме http://forum.nginx.org/read.php?20,170386 ,
> но   боюсь,   что   в  не  очень  популярной  ветке, и скорого ответа я
> могу не дождаться.

Форум - вообще "не очень популярен", если хочется получить ответ - 
лучше пользоваться списком рассылки.

Судя по логу - проблема возникает при очередном уходе в 
sendfile():

...
2010/12/14 13:05:11 [debug] 2692#0: *427301 http filename: "/usr/local/www/data/cnode.slideboom.com/out/237643/original/237643.pps"
...
2010/12/14 13:05:22 [debug] 2692#0: *427301 http write filter: l:1 f:0 s:2312984
2010/12/14 13:05:22 [debug] 2692#0: *427301 http write filter limit 0
2010/12/14 13:05:22 [debug] 2692#0: *427301 sendfile() sent only 76528 bytes (35: Resource temporarily unavailable)
2010/12/14 13:05:22 [debug] 2692#0: *427301 sendfile: -1, @6307048 76528:2312984
2010/12/14 13:05:22 [debug] 2692#0: *427301 http write filter 00000008012D1D80
2010/12/14 13:05:22 [debug] 2692#0: *427301 http copy filter: -2 "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 http writer output filter: -2, "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 event timer: 83, old: 1292353582593, new: 1292353582704
2010/12/14 13:05:22 [debug] 2692#0: *427301 http run request: "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 http writer handler: "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 http output filter "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 http copy filter: "/out/237643/original/237643.pps?"
2010/12/14 13:05:22 [debug] 2692#0: *427301 http postpone filter "/out/237643/original/237643.pps?" 0000000000000000
2010/12/14 13:05:22 [debug] 2692#0: *427301 write old buf t:0 f:1 0000000000000000, pos 0000000000000000, size: 0 file: 6383576, size: 2236456
2010/12/14 13:05:22 [debug] 2692#0: *427301 http write filter: l:1 f:0 s:2236456
2010/12/14 13:05:22 [debug] 2692#0: *427301 http write filter limit 0

Дальше лог обрывается, видимо всё.  Т.е. ушли в sendfile() и из 
него не вернулись.

Я бы рекомендовал начать с простого: убедиться, что выключение 
sendfile проблему лечит (sendfile_max_chunk тоже может помочь, но 
маловероятно).

Дальше воспроизводить и лечить проблему в ядре, в частности:

1) убедиться, что используемая файловая система - не ZFS 
(безумству храбрых и всё такое, но на ZFS в 8.1 гарантированны 
проблемы при использовании sendfile);

2) убедиться, что рассматриваемый файл нормально читается;

3) внимательно изучить различные системные ресурсы, особенно 
заканчивающиеся;

4) перечитать commit-логи

и т.п.

По описанию вообще очень похоже на PR kern/138999 [1], но в 8.1 уже 
должно быть исправлено.

[1] http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/138999

Maxim Dounin



Подробная информация о списке рассылки nginx-ru