Почему кеш nginx создает задержки?

Евгений Удовихин eudovihin at gmail.com
Sat Feb 7 06:25:05 UTC 2015


Один php скрипт занимается раздачей статистики с сайта в двух видах.
Кешируется по сути один файл на секунду (так надо). При этом есть два типа
запросов, и кеш настроен их различать. Для первого типа всегда отдается
бекендом с заголовком header("X-Accel-Expires: 0"); а для второго
header("X-Accel-Expires: 1"); Все работает. Запросы первого типа не
кешируются вообще, запросы второго типа кешируются на секунду. В кеше 1
файл как раз второго типа.

А теперь вопрос - почему кеш nginx может создавать задержки. Т.е. вот идут
запросы нормально, время ответа 150мс, и тут вдруг внезапно задержка - от
2с до 20с, бывало. При этом другие запросы к серверу идут как обычно по
расписанию (раз в 2 секунды). Более того, зависший запрос может так и
висеть, когда следующие за ним уже отправились и выполнились. Бывало
выполнялось по 10 следующих запросов за те 20 секунд зависания. И
естественно данные приходили в развисшем запросе устаревшие. Не могу понять
почему такое может быть ...

Параметры кеширования nginx

proxy_cache_path /tmp/site levels= keys_zone=pagecache:1m
max_size=1m;proxy_cache             pagecache;proxy_cache_valid
200 1s;proxy_cache_lock on;proxy_cache_lock_timeout
100s;proxy_cache_use_stale  updating;proxy_ignore_headers Expires
Cache-Control;if ($arg_callback) {
  set $callback callback;
}proxy_cache_key
$scheme$proxy_host$uri$arg_widget$arg_layer$callback;proxy_pass_header
"X-Accel-Expires";sub_filter 'callback' $arg_callback;



Контроль и замена callback - это для jQuery ajax'а фикс, можете не обращать
внимания. Стоит cache_lock + proxy_cache_use_stale updating, т.е. при
ожидании обновления кеша должны отдаваться старые данные. Все так и
происходит во задержек проблем на сервере, проблема явно не тут. Тем более
что последующие за зависшим вопросы проходят нормально, а зависший все еще
висит, явно не ожидание обновления кеша.

Сам ответ на бекенде генерируется в пределах 30мс, проверял по mircotime()
php.

Запросы, которые не попадают в location с кешированием, тоже иногдла
заредживаются, но на пару секунд максимум. Число worker стоит auto, сервер
мощный и не перегружен.

В кеше 1 файл, не думаю что проблема в задержка HDD. Т.е. прям реально в
папке /tmp/site всего 1 файл с кешем. Плюс к тому зависают не только
вопросы из кешируемой группы, но и запросы из некешируемой тоже. Хотя они
всегда должны сразу уходить на бекенд и возвращаться с ответом.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20150207/a6d518d6/attachment.html>


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