Re: 500-я ошибка при использовании кеша

Maxim Dounin mdounin на mdounin.ru
Вт Июн 7 19:12:57 UTC 2016


Hello!

On Thu, Jun 02, 2016 at 11:37:52PM +0500, Илья Шипицин wrote:

> Добрый день!
> 
> используем кеш около 4-х лет.
> 
> сегодня случилась 500-я ошибка с вот такой записью в логе
> 
> 2016/06/02 14:50:07 [alert] 89233#0: could not allocate node in cache keys
> zone "static"
> 
> насколько я вижу по коду, это приводит к 500-му статусу.
> 
> какая логика была заложена в это поведение ? казалось бы, не получилось
> сохранить объект в кеше, не беда, отдаем как есть.

"Не получилось" - редкое событие, в большинстве случаев связанное 
с фатальными проблемами.  Разделять фатальные и нефатальеные 
проблемы, и соответственно по разному их обрабатывать - можно, но 
пока такой необходимости приминительно к заканчивающемуся в месту 
в зоне разделяемой памяти - не возникало.

> и, собственно, в чем была наша ошибка конфигурации кеша, почему оно не
> вытеснило старые элементы?
> 
> кеш вот такой
> 
>     proxy_cache_path /var/tmp/nginx/cache levels=2 keys_zone=static:5m
> inactive=210m max_size=500m;
>     proxy_cache_key "$scheme$http_host$request_uri$is_args$args";

Сконфигурированная зона разделяемой памяти - 5 мегабайт, т.е.  
где-то 40 тысяч элементов.  Такой размер зоны будет достаточен, 
если выполняется одно из следующих условий:

- Средний размер элемента в кеше превышает 10 килобайт (т.к. 
  max_size = 500 мегабайт);

- В кеш сладывается меньше 3 элементов в секунду (т.к. inactive = 
  210 минут).

В остальных случаях будет зона разделяемой памяти будет 
переполняться и будет работать механизм экстренного вытеснения 
старых элементов.  После вытеснения - делается попытка выделить 
память под элемент ещё раз.  Нюанс состит в том, что 
свежеосвобождённую память может сразу же занять другой рабочий 
процесс.  Вероятно, именно это и произошло в описанном случае.

В nginx 1.9.13+ cache manager, помимо inactive/max_size, умеет ещё 
и следить за количеством элементов кеша.  Однако эта логика 
включается только когда переполнение уже случилось, так что 
полностью от проблем - не избавляет.

Лучше всего конфигурить кеш так, чтобы зона не переполнялась и 
необходимости в экстренном вытеснении старых элементов - не 
возникало.

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



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