Я пытаюсь увеличить количество одновременных подключений, которые может обрабатывать мой сервер.
$uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
$ulimit -Sn
65536
$ulimit -Hn
65536
Конфигурация Nginx имеет следующие строки:
worker_processes 4; # or 8
worker_rlimit_nofile 60000;
events {
worker_connections 1024;
}
Также есть сонный (спящий бесконечно) бэкэнд python asyncio HTTP, используемый через восходящий поток.
И через несколько секунд нагрузочного тестирования:
2016/11/03 05:13:44 [alert] 15#15: 1024 worker_connections are not enough
2016/11/03 05:13:44 [alert] 15#15: 1024 worker_connections are not enough
пока
$netstat -anvpt | wc -l
1156 # or twice bigger if there is 8 worker processes.
htop
показывает, что есть 4 (или 8) рабочих процесса nginx и используется только 50% 1 ядра ЦП (в то время как 3 других ядра простаивают). Более детальное расследование netstat
выходные данные показывают, что используются только 2 рабочих процесса, и оба они потребовали не более половины из 1024 разрешенных соединений (как от клиентов к nginx, так и от nginx к восходящему потоку).
Кроме того, внутри работают nginx и backend. docker
контейнеры.
UPD: Если я увеличу worker_connections
до 10240 я буду обрабатывать гораздо больше клиентов, и производительность ЦП будет узким местом. Но вопрос в том, почему я столкнулся с сообщением 1024 worker_connections are not enough
пока еще есть 2 или 6 простаивающих рабочих.
Прибытие сюда поздно, но для гуглеров попробуйте увеличить лимит рабочих процессов (или использовать автоматический режим):
worker_processes auto;
В соответствии с Документация Nginx, они напрямую влияют друг на друга:
Следует иметь в виду, что это число включает в себя все соединения (например, соединения с прокси-серверами, среди прочего), а не только соединения с клиентами. Еще одно соображение заключается в том, что фактическое количество одновременных подключений не может превышать текущий предел максимального количества открытых файлов, который может быть изменен worker_rlimit_nofile.