Re: корка

Maxim Dounin mdounin на mdounin.ru
Пт Янв 13 11:06:01 UTC 2012


Hello!

On Fri, Jan 13, 2012 at 02:44:05PM +0400, Domrachev Ivan wrote:

> >> вывалилась корка.
> >> дебаг логов нет, т.к. не знаю как воспроизвести.
> > А error_log'и есть?
> > grep -F '[alert]' /path/to/error/log
> 
> в этот день не было error_log'ов.
> 
> правда в конфиге:
> ....
> error_log error emerg;

Безумству храбрых поём мы песню...

> ....
> http {
> ...
>  error_log error crit;
> ...
> 
> >> #0  0x0000000000473c54 in ngx_http_file_cache_free (c=0x8014cb020, tf=0x0)
> >>     at src/http/ngx_http_file_cache.c:930
> >> 930             ngx_queue_remove(&fcn->queue);
> >> [New Thread 8014041c0 (LWP 100157)]
> >> (gdb) bt
> >> #0  0x0000000000473c54 in ngx_http_file_cache_free (c=0x8014cb020, tf=0x0)
> >>     at src/http/ngx_http_file_cache.c:930
> >> #1  0x000000000046892e in ngx_http_upstream_finalize_request (r=0x801530600, u=0x801514a60, rc=-1)
> >>     at src/http/ngx_http_upstream.c:3014
> >> #2  0x000000000046be92 in ngx_http_upstream_process_header (r=0x801530600, u=0x801514a60)
> >>     at src/http/ngx_http_upstream.c:2028
> >> #3  0x000000000046961a in ngx_http_upstream_handler (ev=0x8015d4ab0)
> >>     at src/http/ngx_http_upstream.c:917
> >> #4  0x000000000044a4d5 in ngx_kqueue_process_events (cycle=0x801443050, timer=Variable "timer" is not available.
> >> )
> >>     at src/event/modules/ngx_kqueue_module.c:683
> 
> > [...]
> 
> >> из чужих модулей только nginx_upload_module-2.2.0.
> >> опции компиляции надо?
> >> саму корку+бинарник надо?
> >> конфиги надо?
> 
> > В "proxy_cache_path inactive=" стоит что?
> 
> proxy_cache_path /cache_path levels= keys_zone=d:50m inactive=10s;
> ...
> proxy_cache_valid 200 301 302 304 10s;

В 1.0.x сейчас так жить не будет, надо ставить inactive больше (а 
для контроля размера кеша использовать размер зоны и max_size).

Проблема в том, что по истечению inactive nginx пытается удалить 
элемент кеша, и если он вдруг заблокирован каким-то рабочим 
процессом - решает, что процесс, поставивший блокировку, умер, и 
всё равно удаляет (логгируя alert про это).  Поскольку элемент 
кеша вполне может быть заблокирован более чем на 10 секунд - в 
результате случается segmentation fault в процессе, который с этим 
элементом работал.

В 1.1.11 логика изменена (больше в таких случаях элементы не 
удаляются, просто пропускаются) и segmentation fault'ов быть не 
должно:

    *) Bugfix: a segmentation fault might occur in a worker process if small
       time was used in the "inactive" parameter of the "proxy_cache_path"
       directive.

Maxim Dounin



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