proxy_cache_background_update
Maxim Dounin
mdounin на mdounin.ru
Ср Июн 14 13:53:49 UTC 2017
Hello!
On Wed, Jun 14, 2017 at 02:52:58PM +0300, Domrachev Ivan wrote:
> приветствую
>
> если одновременно использовать
> sendfile on;
> tcp_nopush on;
> proxy_cache_background_update on;
>
> то ломается логика работы proxy_cache_background_update: иногда возвращается часть закэщированного варианта,
> потом енджайникс ждёт секунд 5 и досылает остаток.
> если спрашивать раз в секунду, а proxy_cache_valid any 2s то в логах получается так:
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:46 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" MISS 5.123
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:47 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:48 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:54 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" STALE -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:55 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:27:56 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:03 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" STALE -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:04 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> 127.0.0.1 127.0.0.1 - [14/Jun/2017:14:28:05 +0300] "GET / HTTP/1.1" 200 65536 "-" "Wget/1.16.3 (freebsd10.1)" HIT -
> тайминги запросов
> 5.12 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
> 5.14 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
> 5.14 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
> 0.10 real 0.00 user 0.00 sys
>
> если любую из этих опций отключить:
> sendfile on;
> tcp_nopush on;
> то всё нормализуется
Проблема понятная: TCP_NOPUSH задерживает отправку неполных
пакетов клиенту до снятия соответствующего флага, а флаг снимается
только при переходе в keepalive, т.е. после того, как отработает
background-подзапрос. Простейший workaround - отключить
tcp_nopush.
Как именно это править, и стоит ли вообще править - пока не совсем
понятно. Возможно, стоит снимать TCP_NOPUSH чуть раньше.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru