Я пытался настроить наши экземпляры веб-сервера Ubuntu 14.04 LTS, на которых размещаются как веб-приложения, так и nginx с обратным проксированием, чтобы обрабатывать как можно больше запросов / с с данным оборудованием. Это экземпляр c4.2xl EC2 с 8x vCPU.
Я использую следующие два инструмента для тестирования на своем офисном компьютере (НЕ оба одновременно):
wrk -c1000 -d2m -t8 --timeout 90 --latency http://api.mysite.com/2/ping
# or
ab -k -n 100000 -c 1000 http://api.mysite.com/2/ping
Я вижу, что бегая ss -tan | wc -l
Я всегда использую максимум 65,5 тыс. Подключений в TIME-WAIT
Моя установка ОС:
net.ipv4.ip_local_port_range value="15000 65000"
/etc/security/limits.conf
содержит www-data hard nofile 100000/etc/pam.d/common-session*
обновлены, чтобы прочитать вышеизложенноеИ настройка nginx:
worker_processes auto; # will result in 8 on this machine
events {
worker_connections 8192;
multi_accept on;
use epoll;
}
Вверх по течению к api, проксируемому на nginx, ниже, используется для получения очень высокого максимума различных четверок TCP, что означает, что у меня почти никогда не заканчиваются эфемерные порты в nginx -> app:
upstream my_api {
server 127.0.0.1:3004;
server 127.0.0.2:3004;
server 127.0.0.3:3004;
[...]
}
У меня возникла аналогичная проблема с моим экземпляром m3.large, где вместо 65k я максимизировал 32k. Разница между двумя экземплярами заключается в том, что первый имеет 2vCPU, второй - 8, первый - 7,5 ГБ памяти, а второй - 15 ГБ.
Похожая проблема описана в этом посте (Масштабирование за пределами 65k открытых файлов (TCP-соединения)), но, похоже, это не применимо в моем случае, так как в моем меньшем экземпляре vm.max_map_count
65530, но он никогда не проходит мимо 32k соединений в TIME-WAIT
.
Я думал, что сначала ограничение было только # процессов * # рабочих, но в меньшем экземпляре я все еще ограничен 32 КБ, даже если я подниму # рабочих на процесс до 25 КБ каждый, так что это не так.
Я не уверен, какую ручку настраивать на данном этапе, мне не ясно, откуда могут взяться эти жесткие ограничения. Здесь нужна помощь.
Интересно, что я не вижу, чтобы соединения были полностью отклонены ни с одной из этих машин, поскольку TIME-WAIT достигает этого «предела». Возможно, очереди сокетов заполняются за кулисами, и клиент просто повторно пытается установить соединение позже, поэтому я не вижу постоянных сбоев.
Обновить:
На экземпляре c4.8xlarge я могу получить до 262 тыс. Соединений в режиме TIME-WAIT с теми же точными конфигурациями развертывания. Даже ограничение количества воркеров nginx до 1 не меняет этого. Все еще не уверен, в чем будет разница.
Обновление 2:
Я сильно подозреваю, что это связано с тем, что разные экземпляры имеют разные net.ipv4.tcp_max_tw_buckets
значения, которые, насколько я могу судить, точно соответствуют наблюдаемому мной шаблону.
Посмотри на net.ipv4.netfilter.ip_conntrack_max
настраиваемый. Для получения дополнительной информации вы можете прочитать это сообщение ServerFault
У вас заканчиваются исходные порты на исходном компьютере.
Для определения соединения вам необходимы: IP-адрес источника, порт источника, IP-адрес назначения и порт назначения. Поскольку исходный IP-адрес, целевой IP-адрес и целевой порт всегда одинаковы в ваших тестах, у вас есть только одна переменная: исходный порт. Ваш стек TCP / IP не может обрабатывать более 64 КБ различных исходных портов (на самом деле немного меньше).
Стресс-тестирование из одной точки никогда не является хорошей идеей, но вы могли бы немного сжать это, включив net.ipv4.tcp_tw_recycle для повторного использования портов в состоянии TIME_WAIT, но это может вызвать у вас проблемы из-за агрессивного повторного использования портов .