Re: Nginx reload, выедает CPU

Serge Negodyuck serg at petrovich.kiev.ua
Wed Aug 28 15:16:42 UTC 2013


28 августа 2013 г., 0:38 пользователь Maxim Dounin <mdounin at mdounin.ru> написал:
> Hello!
>
> On Tue, Aug 27, 2013 at 10:59:25PM +0300, Serge Negodyuck wrote:
> >
>> > Поигравшись с  "while true; do gdb66 -ex "backtrace full" --batch -p
>> > 41159; done"
>> > получилось, что бОльшую часть времени эти процессы проводят в
>> > состоянии: " if (c[i].fd != -1 && c[i].idle) {":
>>
>> Добавление usleep(1) решило все проблемы:
>>
>> --- ngx_process_cycle.c.orig 2013-08-27 22:42:36.000000000 +0300
>> +++ ngx_process_cycle.c 2013-08-27 22:42:46.000000000 +0300
>> @@ -792,6 +792,7 @@
>>                      c[i].close = 1;
>>                      c[i].read->handler(c[i].read);
>>                  }
>> +               usleep(1);
>>              }
>>
>>              if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)
>>
>>
>> IMHO, как-то грязновато. Может можно как-то по событиям? Или вынести
>> цикл по дескрипторам соединений в отдельный поток.
>
> Этот цикл - занимается закрытием idle-соединений, и выполняется
> только при получении из ядра каких-либо событий (i.e. - редко).
> Если время теряется в нём - это как бы намекает, что в ядре nginx
> почему-то не остаётся, а сразу возвращается обратно.  В этом и
> есть настоящая проблема.
>
> Было бы интересно посмотреть на nginx -V (интересует, в первую
> очередь, отсутствие сторонних модулей/патчей), полный конфиг и
> debug log.  Ссылка на всякий случай:
>
> http://nginx.org/ru/docs/debugging_log.html

# nginx -V
nginx version: nginx/1.4.2
TLS SNI support enabled
configure arguments: --prefix=/usr/local/etc/nginx --with-cc-opt='-I
/usr/local/include' --with-ld-opt='-L /usr/local/lib'
--conf-path=/usr/local/etc/nginx/nginx.conf
--sbin-path=/usr/local/sbin/nginx --pid-path=/var/run/nginx.pid
--error-log-path=/var/log/nginx-error.log --user=www --group=www
--with-debug --with-file-aio
--http-client-body-temp-path=/var/tmp/nginx/client_body_temp
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
--http-proxy-temp-path=/var/tmp/nginx/proxy_temp
--http-scgi-temp-path=/var/tmp/nginx/scgi_temp
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp
--http-log-path=/var/log/nginx-access.log --with-http_dav_module
--with-http_gzip_static_module --with-http_realip_module
--with-http_stub_status_module --with-pcre
--add-module=/usr/ports/www/nginx/work/gabor-nginx-x-rid-header-0daa3cc
--with-http_ssl_module

nginx-x-rid-header вряд ли тут при чем. Он участвует только при новом запросе.

Урезаная версия конфига в атаче (Убрана большая часть локейшинов, и
виртуальных хостов с похожим конфигом на разных ip адресах около 10.)

В дебаг логе ничего - только события от таймера

2013/08/28 16:14:10 [debug] 27687#0: posted events 0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: worker cycle
2013/08/28 16:14:10 [debug] 27687#0: kevent timer: -1, changes: 0
2013/08/28 16:14:10 [debug] 27687#0: kevent events: 1
2013/08/28 16:14:10 [debug] 27687#0: kevent: 0: ft:-7 fl:0020
ff:00000000 d:1 ud:0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: timer delta: 2
2013/08/28 16:14:10 [debug] 27687#0: posted events 0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: worker cycle
2013/08/28 16:14:10 [debug] 27687#0: kevent timer: -1, changes: 0
2013/08/28 16:14:10 [debug] 27687#0: kevent events: 1
2013/08/28 16:14:10 [debug] 27687#0: kevent: 0: ft:-7 fl:0020
ff:00000000 d:1 ud:0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: timer delta: 1
2013/08/28 16:14:10 [debug] 27687#0: posted events 0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: worker cycle
2013/08/28 16:14:10 [debug] 27687#0: kevent timer: -1, changes: 0
2013/08/28 16:14:10 [debug] 27687#0: kevent events: 1
2013/08/28 16:14:10 [debug] 27687#0: kevent: 0: ft:-7 fl:0020
ff:00000000 d:1 ud:0000000000000000
2013/08/28 16:14:10 [debug] 27687#0: timer delta: 2

Cобытий таймера порядка 600-700 в секунду. Я так понимаю, при
timer_resolution 1ms их должно быть около 1000.  Значит, что-то мешает
таймеру выполняться.

И я, всё же, думаю что это тот цикл по соединениям.
Соединений на воркер у меня 32000, таймер работает 1000 раз в секунду.
Т.е. в секунду процессор должен делать 32 миллиона итераций по циклу.
Не знаю, много это или мало. Думаю, прилично.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nginx.conf
Type: application/octet-stream
Size: 3377 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20130828/d1edb3f2/attachment.obj>


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