<div dir="ltr"><div>я на досуге поизучал это место кода, тоже пришел к мнению, что закончилась область shared memory (диагностика могла бы быть более развернутая в логе).<br><br></div>я пока склоняюсь к мнению, что это не должно быть фатальным, ну не смогли положить в кеш, чего горевать то. каких-то серьезных аргументов за то, что в этом случае надо фейлить, пока не придумал.<br></div><div class="gmail_extra"><br><div class="gmail_quote">8 июня 2016 г., 0:12 пользователь Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<span class=""><br>
On Thu, Jun 02, 2016 at 11:37:52PM +0500, Илья Шипицин wrote:<br>
<br>
> Добрый день!<br>
><br>
> используем кеш около 4-х лет.<br>
><br>
> сегодня случилась 500-я ошибка с вот такой записью в логе<br>
><br>
> 2016/06/02 14:50:07 [alert] 89233#0: could not allocate node in cache keys<br>
> zone "static"<br>
><br>
> насколько я вижу по коду, это приводит к 500-му статусу.<br>
><br>
> какая логика была заложена в это поведение ? казалось бы, не получилось<br>
> сохранить объект в кеше, не беда, отдаем как есть.<br>
<br>
</span>"Не получилось" - редкое событие, в большинстве случаев связанное<br>
с фатальными проблемами.  Разделять фатальные и нефатальеные<br>
проблемы, и соответственно по разному их обрабатывать - можно, но<br>
пока такой необходимости приминительно к заканчивающемуся в месту<br>
в зоне разделяемой памяти - не возникало.<br>
<span class=""><br>
> и, собственно, в чем была наша ошибка конфигурации кеша, почему оно не<br>
> вытеснило старые элементы?<br>
><br>
> кеш вот такой<br>
><br>
>     proxy_cache_path /var/tmp/nginx/cache levels=2 keys_zone=static:5m<br>
> inactive=210m max_size=500m;<br>
>     proxy_cache_key "$scheme$http_host$request_uri$is_args$args";<br>
<br>
</span>Сконфигурированная зона разделяемой памяти - 5 мегабайт, т.е.<br>
где-то 40 тысяч элементов.  Такой размер зоны будет достаточен,<br>
если выполняется одно из следующих условий:<br>
<br>
- Средний размер элемента в кеше превышает 10 килобайт (т.к.<br>
  max_size = 500 мегабайт);<br>
<br>
- В кеш сладывается меньше 3 элементов в секунду (т.к. inactive =<br>
  210 минут).<br>
<br>
В остальных случаях будет зона разделяемой памяти будет<br>
переполняться и будет работать механизм экстренного вытеснения<br>
старых элементов.  После вытеснения - делается попытка выделить<br>
память под элемент ещё раз.  Нюанс состит в том, что<br>
свежеосвобождённую память может сразу же занять другой рабочий<br>
процесс.  Вероятно, именно это и произошло в описанном случае.<br>
<br>
В nginx 1.9.13+ cache manager, помимо inactive/max_size, умеет ещё<br>
и следить за количеством элементов кеша.  Однако эта логика<br>
включается только когда переполнение уже случилось, так что<br>
полностью от проблем - не избавляет.<br>
<br>
Лучше всего конфигурить кеш так, чтобы зона не переполнялась и<br>
необходимости в экстренном вытеснении старых элементов - не<br>
возникало.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/" rel="noreferrer" target="_blank">http://nginx.org/</a><br>
<br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></font></span></blockquote></div><br></div>