У меня есть небольшая установка VPS с nginx. Я хочу выжать из него как можно больше производительности, поэтому экспериментировал с оптимизацией и нагрузочным тестированием.
Я использую Blitz.io для нагрузочного тестирования, получая небольшой статический текстовый файл и сталкиваюсь с нечетной проблемой, когда сервер, кажется, отправляет сбросы TCP, когда количество одновременных подключений достигает примерно 2000. Я знаю, что это очень большое количество, но из-за использования htop у сервера все еще есть много свободного времени процессора и памяти, поэтому я хотел бы выяснить источник этой проблемы, чтобы посмотреть, смогу ли я продвинуть ее еще дальше.
Я использую Ubuntu 14.04 LTS (64-разрядную версию) на Linode VPS объемом 2 ГБ.
У меня недостаточно репутации, чтобы опубликовать этот график напрямую, поэтому вот ссылка на график Blitz.io:
Вот что я сделал, чтобы попытаться выяснить источник проблемы:
worker_rlimit_nofile
установлен на 8192nofile
установите 64000 для жестких и мягких ограничений для root
и www-data
пользователь (от имени которого работает nginx) в /etc/security/limits.conf
нет никаких признаков того, что что-то идет не так /var/log/nginx.d/error.log
(обычно, если вы работаете с ограничениями файлового дескриптора, nginx будет печатать сообщения об ошибках, говорящие об этом)
У меня есть настройка ufw, но нет правил ограничения скорости. Журнал ufw показывает, что ничего не блокируется, и я попытался отключить ufw с тем же результатом.
/var/log/kern.log
/var/log/syslog
Я добавил следующие значения в /etc/sysctl.conf
и загрузил их sysctl -p
без эффекта:
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 2000
Любые идеи?
РЕДАКТИРОВАТЬ: Я провел новый тест, увеличив количество подключений до 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.