Re: Соединение с Upstream занимает 1 секунду.

Maxim Dounin mdounin на mdounin.ru
Пт Ноя 17 14:18:57 UTC 2017


Hello!

On Fri, Nov 17, 2017 at 07:50:30AM -0500, KycKyc wrote:

> Здравствуйте, столкнулся со следующей проблемой.
> Связка nginx + uwsgi, на продакшн сервере соединение с
> upstream($upstream_connect_time) занимает 1 секунду (+-3ms), бывает раз в
> 20-30 запросов проскакивает запрос с временем соединения в 0 сек,
> промежуточных значений замечено небыло.
> Запросы логируются только с 1го IP.
> Upstream обслуживает http API.
> 
> Статика отдается моментально.
> Соединение с websocket upstream (тоже uwsgi) сервером занимает 0 секунд.
> 
> Так же, в системном журнале никаких предупреждений нет.
> 
> В чем может быть проблема ?
> 
> nginx.conf:
> https://pastebin.com/WipnHPkd
> 
> Конфиг сервера:
> https://pastebin.com/bfVCxP78
> 
> Текущий stub_status:
> Active connections: 19993 	
> server accepts handled requests
>  359071 359071 1362273 
> Reading: 0 Writing: 10343 Waiting: 9639
> 
> 
> Для примера залогировал один запрос.
> 
> Nginx debug log:
> https://pastebin.com/sN30E6Ye
> 
> tcpdump:
> https://imgur.com/a/ntC4h

Если верить дампу, то между установлением соединения прошло меньше 
1 миллисекунды.  Если верить логу - больше 1 секунды.  При этом 
ip-адреса в дампе и в логе - не совпадают.

Я тут вижу два варианта:

- либо дамп не от того запроса,

- либо дамп не полный и за секунду до этого был ещё один 
  SYN-пакет, который почему-то в дамп не попал.

Вообще, судя по описанным симптомам - проблему надо искать на 
стороне бэкенда, скорее всего он просто перегружен и не успевает 
отвечать на запросы.  В результате первый SYN он просто игнорирует 
из-за переполнения очереди соединений (ибо Linux, и 
net.ipv4.tcp_abort_on_overflow по умолчанию 0), соединение 
устанавливается только после повторной отправки SYN'а - и вот она, 1 
секунда задержки на любой коннект к перегруженному бэкенду.

Так что рекомендация простая: смотреть внимательно на бэкенд, в 
частности - на его listen queue ("ss -nlt" в помощь).  Ну и дальше 
решать проблему с загрузкой бэкенда.

-- 
Maxim Dounin
http://mdounin.ru/


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