Re: Иногда кеш растет сверх лимита

Maxim Dounin mdounin на mdounin.ru
Вт Авг 18 11:38:49 UTC 2015


Hello!

On Tue, Aug 18, 2015 at 09:40:15AM +0300, Gena Makhomed wrote:

> On 17.08.2015 23:10, Maxim Dounin wrote:
> 
> >>>Наиболее неприятный из известных мне нюансов состоит в том, что
> >>>неразблокированные элементы кеша остаются, если какому-либо из
> >>>рабочих процессов сказать TERM.  Например, такое иногда практикуют
> >>>для принудительного завершения старых рабочих процессов, плавное
> >>>завершение которых занимает слишком много времени.
> >>
> >>Эту проблему можно решить, если элементы кеша блокировать не навсегда,
> >>а на какое-то определенное количество времени, и по прошествии этого
> >>времени - считать существующую блокировку элемента недействительной.
> >
> >Чтобы блокировать "не навсегда", умеющий это обрабатывать код
> >должен быть в том числе со стороны запроса, которому данная
> >блокировка нужна.  Чтобы периодически блокировку обновлял, и был
> >готов к тому, что её уберут, и всё это - со всеми прилагающимися
> >дополнительными затратами ресурсов.  В противном случае - будут
> >segfault'ы, если таки выкинут нужную блокировку.
> 
> Хорошо, тогда другое предложение:
> 
> В функции ngx_shmtx_lock блокировка делается через
> ngx_atomic_cmp_set, при этом, вместо 0 записывается
> ngx_pid, следовательно, если блокировка стоит -
> всегда можно узнать, какой именно процесс
> эту блокировку поставил.

Речь про блокировки отдельных элементов кеша, а не всей зоны 
разделяемой памяти.  С зоны разделяемой памяти блокировку после 
падения процессов мы снимать умеем, см. ngx_shmtx_force_unlock().

[...]

> >На практике вполне неплохо работает вывод сообщений в логи и
> >перемещение заблокированных элементов в начало очереди,
> >реализованное для обработки удаления старых элементов по inactive.
> >Проблемы, судя по рассылке, наблюдаются у тех, кто очистку по
> >inactive фактически выключил - и, видимо, в сочетании с какой-то
> >ещё проблемой, какой - пока непонятно.
> 
> Если удалять заблокированные элементы - разве не будут segfault'ы?

Их никто не удаляет, их перемещают и ругаются в лог.  См. 
ngx_http_file_cache_expire().

-- 
Maxim Dounin
http://nginx.org/



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