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