client timed out & readv() failed

Maxim Dounin mdounin на mdounin.ru
Пт Мар 4 02:24:31 UTC 2016


Hello!

On Fri, Mar 04, 2016 at 12:12:10AM +0300, Evgeniy Berdnikov wrote:

> On Thu, Mar 03, 2016 at 10:49:34PM +0300, Maxim Dounin wrote:
> > On Thu, Mar 03, 2016 at 09:41:09PM +0300, Evgeniy Berdnikov wrote:
> > > On Thu, Mar 03, 2016 at 08:36:28PM +0300, Maxim Dounin wrote:
> > > > Я бы для начала попробовал поискать statefull firewall между 
> > > > фронтендом и бекендом.  Возможно, у него кончаются state'ы, и он 
> > > > таким нехитрым образом пытается об этом сообщить.
> > > 
> > >  Нет, "while sending response to client" и "while reading upstream"
> > >  однозначно свидетельствуют о том, что соединение установлено.
> > >  Поэтому переполнение таблицы коннекций исключается.
> > 
> > Это очень сильно зависит от того, как именно ведёт себя firewall, 
> > когда у него заканчиваются state'ы.  E.g., pf умеет уменьшать 
> > таймауты в случае большого числа state'ов, и соответственно может 
> > убить соединение в любой момент времени.
> 
>  Не думаю, что у вопрошавшего на линке скоростью 10G стоит файрвол.

Практика показывает, что у многих - стоит.  И выливается это 
зачастую как раз в подземный стук при увеличении нагрузки, когда 
state'ы начинают заканчиваться.

> > Так или иначе - "Connection reset by peer" при живом бекенде как 
> > бы намекает на то, что в первую очередь надо смотреть, что 
> > происходит в сети.
> 
>  Я бы скорее подозревал наличие какой-то баги в сетевой карте.
> 
>  Например, в неправильном подсчёте чексуммы для пакетов с опцией sack
>  при включенном rx/tx checksumming offload'е, из-за чего все пакеты при
>  ретрасмитах дропаются. Коннекция умирает по таймауту. Но при этом
>  закрывается пакетом RST, который идёт без sack и потому доходит до
>  ядра получателя, вот и "Connection reset by peer". Так как насытить
>  линк 10G непросто, то потерь мало, но стоит хоть одному фрейму
>  пропасть -- sack, затем ретрансмиссии с sack, таймаут, reset. 

В таком сценарии непонятно, почему бекенд не видит ошибку сразу же, а 
ждёт ещё минуту после RST, после чего закрывает соединение по 
таймауту.

-- 
Maxim Dounin
http://nginx.org/



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