Настройка nginx worker_process для получения 100 тысяч обращений в минуту

115

У нас есть сервер, который обслуживает один файл HTML.

Прямо сейчас на сервере 2 процессора и 2 ГБ оперативной памяти. С blitz.io мы получаем около 12 тысяч подключений в минуту и ​​где-то от 200 таймаутов за эти 60 секунд с 250 одновременными подключениями каждую секунду.

worker_processes  2;

events {
 worker_connections 1024;
}

Если я увеличу тайм-аут, время отклика начнет увеличиваться за секунду.

Что еще я могу сделать, чтобы выжать из этого побольше сока?

ablemike
источник

Ответы:

188

Файл конфигурации:

worker_processes  4;  # 2 * Number of CPUs

events {
    worker_connections  19000;  # It's the key to high performance - have a lot of connections available
}

worker_rlimit_nofile    20000;  # Each connection needs a filehandle (or 2 if you are proxying)


# Total amount of users you can serve = worker_processes * worker_connections

подробнее: Оптимизация nginx для высоких нагрузок трафика

Булат
источник
14
Я думаю, что уравнение для общего количества пользователей в секунду неверно. Вместо этого среднее количество пользователей, обслуживаемых в секунду, должно быть = worker_processes * worker_connections / (keepalive_timeout * 2). Таким образом, указанный выше файл conf может обслуживать ~ 7,6 тыс. Подключений в секунду, что намного больше, чем требуется @ablemike. Однако worker_rlimit_nofile - хорошая директива для использования, если ulimit является ограничительным и вы не хотите его изменять.
Итан
2
@ Этан, почему его нужно делить на 2? Если каждую секунду мы получаем 100 новых подключений, а тайм-аут равен 5, то, начиная с шестой секунды, у нас постоянно будет 5 * 100 подключений, которые еще не завершены на стороне сервера. у нас может быть меньше, если некоторые пользователи сами прерывают соединения
Булат
3
эта формула не работает, если для keepalive установлено значение 0 с (отключено)
Тило
5
Каждое соединение требует 2 дескриптора файлов даже для статических файлов, таких как изображения / JS / CSS. Это как 1 для подключения клиента и 2 для открытия статического файла. Поэтому безопаснее изменить worker_rlimit_nofile = 2 * worker_connections.
Итан
4
Используйте worker_rlimit_nofile, но также следует вызвать ulimit -n, чтобы установить значение счетчика открытых файлов для каждого процесса. Лучше сделать это в сценарии инициализации.
Итан