Назад | Перейти на главную страницу

TCP нулевой размер окон и полный размер окон

Проблема, с которой мы сталкиваемся, заключается в том, что время отклика некоторых HTTP-соединений превышает 60 с (около 5%). Я обнаружил, что проблема должна возникать между веб-сервером и балансировщиком нагрузки.

Вот мой вывод, мы попробовали два набора серверов:

Настройка A: только 1 веб-сервер (сервер A), весь трафик TCP напрямую указывает на этот сервер.

Настройка B: балансировщик нагрузки + сервер A, вес сервера A равен 100. С алгоритмом «Round Robin с постоянным IP-адресом»

Для установки A соединение TCP действительно стабильно, коэффициент тайм-аута составляет менее 1%. Однако для установки B коэффициент тайм-аута составляет более 5%, и вот в чем проблема. (тайм-аут соединения установлен на клиенте 60 с)

Мы протестировали эти два параметра в общей среде (за 10 минут), в которой есть ближайший номер пакета (около 700 000 пакетов) и трафик. В результате мы получили 2 набора tcpdump, я обнаружил несколько странных записей журнала и посчитал их следующим образом:

                            Setup A                Setup B
TCP Zero window size        0                      611
TCP Window Full             0                      3672
TCP Out-Of-Order            4147                   4577
TCP Retransmission          23665                  21551
TCP Dup Ack                 10592                  10121

Для приведенного выше результата я совершенно уверен, что это проблема с окном TCP, поэтому я попытался включить перезагрузку net.ipv4.tcp_window_scaling>, но это не помогает. Еще пробовал отключить iptables, тоже не помогает. Я не знаю, влияет ли какая-либо конфигурация на окно TCP.

Одна вещь, которую стоит знать, это наш ip loadbalancer xx.xx.117.128, все пакеты, помеченные как TCP Window Full, от сервера A до xx.xx.117.25, и все пакеты, отмеченные как размер окна TCP Zero, от xx.xx .117.25 к серверу A

Я спросил специалиста по softlayer, что такое xx.xx.117.25, и они сказали: «xx.xx.117.25 - это адрес, с которого балансировщик нагрузки будет подключаться к вашим реальным серверам». Они предполагают, что это проблема брандмауэра, как я упоминал выше. Я тестировал с выключенным iptables. Таким образом, мы можем устранить этот фактор

Это то, что я обнаружил до сих пор.

Возможно, вас интересует конфигурация sysctl, и вот она:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmall = 4294967296
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 1000
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 20

вот снимок состояния tcp сервера A в настройке A

604 TIME_WAIT
7 SYN_RECV
1 LISTEN
2 FIN_WAIT1
1 ESTABLISHED
1 CLOSING

Не совсем уверен, почему TIME_WAIT так велик (у меня есть entable tcp_tw_reuse и tcp_tw_recycle). Я также отслеживал статус tcp в настройке B, количество TIME_WAIT еще меньше (около 300-400)

для конфигурации apache:

KeepAlive Off
<IfModule prefork.c>
StartServers       5
MinSpareServers   10
MaxSpareServers   50
ServerLimit      500
MaxClients       500
MaxRequestsPerChild  4000
</IfModule>

Пожалуйста помоги. огромное спасибо

Вы пробовали свою настройку без tcp_tw_recycle и tcp_tw_reuse параметры? По крайней мере tcp_tw_recycle может вызвать проблемы с балансировщиками нагрузки.

Также количество розеток в TIME_WAIT state не должно быть проблемой, так как оно далеко не 30k, что является количеством портов по умолчанию, доступных в Linux.

Если вы хотите быть уверены, что доступно достаточно портов, вы можете установить net.ipv4.ip_local_port_range sysctl в 1024 65535.