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

Почему мой веб-сервер разрывает соединения при сбросе TCP при высокой нагрузке?

У меня есть небольшая установка VPS с nginx. Я хочу выжать из него как можно больше производительности, поэтому экспериментировал с оптимизацией и нагрузочным тестированием.

Я использую Blitz.io для нагрузочного тестирования, получая небольшой статический текстовый файл и сталкиваюсь с нечетной проблемой, когда сервер, кажется, отправляет сбросы TCP, когда количество одновременных подключений достигает примерно 2000. Я знаю, что это очень большое количество, но из-за использования htop у сервера все еще есть много свободного времени процессора и памяти, поэтому я хотел бы выяснить источник этой проблемы, чтобы посмотреть, смогу ли я продвинуть ее еще дальше.

Я использую Ubuntu 14.04 LTS (64-разрядную версию) на Linode VPS объемом 2 ГБ.

У меня недостаточно репутации, чтобы опубликовать этот график напрямую, поэтому вот ссылка на график Blitz.io:

Вот что я сделал, чтобы попытаться выяснить источник проблемы:

Любые идеи?

РЕДАКТИРОВАТЬ: Я провел новый тест, увеличив количество подключений до 3000 в очень маленьком файле (всего 3 байта). Вот график Blitz.io:

Опять же, согласно Blitz, все эти ошибки являются ошибками «сброса TCP-соединения».

Вот график пропускной способности Linode. Имейте в виду, что это 5-минутное среднее значение, поэтому оно немного отфильтровано (мгновенная пропускная способность, вероятно, намного выше), но все же это ничто:

ЦПУ:

Ввод / вывод:

Вот htop ближе к концу теста:

Я также захватил часть трафика с помощью tcpdump в другом (но похожем на вид) тесте, запустив захват, когда начали поступать ошибки: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

Вот файл, если кто-то хочет на него взглянуть (~ 20 МБ): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing

Вот график пропускной способности от Wireshark:

(Строка - все пакеты, синие полосы - ошибки TCP)

Исходя из моей интерпретации захвата (а я не эксперт), похоже, что флаги TCP RST исходят от источника нагрузочного тестирования, а не от сервера. Итак, если предположить, что со стороны службы нагрузочного тестирования что-то не так, можно ли предположить, что это результат какого-то управления сетью или смягчения последствий DDOS между службой нагрузочного тестирования и моим сервером?

Спасибо!

Чтобы установить максимальное количество открытых файлов (если это вызывает вашу проблему), вам нужно добавить «fs.file-max = 64000» в /etc/sysctl.conf

Несколько идей, которые стоит попробовать, основанные на моем недавнем подобном опыте настройки. Со ссылками:

Вы говорите, что это статический текстовый файл. На всякий случай, если происходит какая-либо восходящая обработка, очевидно, доменные сокеты улучшают пропускную способность TCP по соединению на основе порта TC:

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

Независимо от завершения восходящего потока:

Включите multi_accept и tcp_nodelay: http://tweaked.io/guide/nginx/

Отключить медленный запуск TCP: https://stackoverflow.com/questions/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

Окно оптимизации перегрузки TCP (initcwnd): http://www.nateware.com/linux-network-tuning-for-2013.html

Может быть любое количество источников сброса соединения. В тестере нагрузки могут отсутствовать доступные эфемерные порты, с которых можно инициировать соединение, на устройстве (например, брандмауэре, выполняющем NAT) может быть исчерпан пул NAT, и он не может предоставить исходный порт для соединения, есть ли балансировщик нагрузки или брандмауэр на вашем конце, который, возможно, достиг предела подключения? И если использовать исходный NAT для входящего трафика, это также может вызвать исчерпание порта.

Действительно нужен файл pcap с обоих концов. Что вы хотите найти, так это если попытка подключения отправлена, но никогда не достигает сервера, но по-прежнему выглядит так, как если бы она была сброшена сервером. Если это так, то что-то в строке должно было сбросить соединение. Исчерпание пула NAT - частый источник проблем такого рода.

Кроме того, netstat -st может дать вам дополнительную информацию.

Посмотрите, пожалуйста, сколько портов в TIME_WAIT состояние с помощью команды netstat -patunl| grep TIME | wc -l и изменить net.ipv4.tcp_tw_reuse к 1.