LINUX.ORG.RU
ФорумAdmin

Как вычислить оптимальное значение worker_connections

 


1

3

Настраиваю nginx как http-сервер для php-сайтов. В /etc/nginx/nginx.conf всегда есть такие настройки:

# Это понятно, в большинстве случаев ставим по количеству ядер процессора.
# В случаях, когда требуются интенсивные операции ввода-вывода при несложных вычислениях, увеличиваем в 1,5-2 раза
worker_processes 2;
events {
        # А это значение как вычислить?
        worker_connections 1024;
}
В большинстве мануалов рекомендуют поставить 1024 и забить. Но в каких-то ставят больше, в каких-то меньше. Как вычислить оптимальное значение?

Поставьте munin + плагин для nginx и смотрите сколько используете.
Как только будет не хватать, увидите ошибки в error.log
Рекомендую добавить epoll в events.

events {
        worker_connections 1024;
        use epoll;
}

poiuty ()
Ответ на: комментарий от poiuty

А в каких ситуациях worker_connections надо уменьшать?

TDrive ★★★★★ ()
Ответ на: комментарий от poiuty

Ясно, спасибо за рекомендацию munin. Но в некоторых случаях ведь можно как-то прикинуть стартовое значение. Например, вот тут http://searchengines.guru/showpost.php?p=9599053&postcount=42 товарищ говорит, что для конфигурации i7-920 и 8 GB оперативы ставить 1024 worker_connections это «над вами хорошо пошутили». И даже предлагает значение worker_connections = 16384, что значительно больше 1024. От чего следует хотя бы отталкиваться при проставлении начального значения?

iamroman ()

Расчет простой: 1 / <время выполнения задачи, cек.>. Т.о. 1024 подобрано в расчете, что задача выполняется за менее 0.001 с.

Вторая причина, это ulimits nofile. По дефолту во многих дистрибутивах это равно 1024.

В среднем, один процесс (он же worker) nginx может выдавать 40-50k rps для статичных файлов до 100кб.

Если nginx читает файлы, работает с php-fpm и т.д., то значение можно увеличить до 10-60к. Дальше смотреть реальную нагрузку.

Если nginx запускает внутри себя какие-то модули на lua и т.д. и что-то вычисляет, то надо считать время выполнения операций и исходя из этого числа выбирать значение так, чтобы процесс не «захлебывался» от того, что задача выполняется слишком долго, когда в очереди стоит еще 100500 запросов от клиентов.

gh0stwizard ★★★★★ ()
Ответ на: комментарий от gh0stwizard

Вторая причина, это ulimits nofile. По дефолту во многих дистрибутивах это равно 1024.

1. А как правильно изменять максимальное число открытых файлов, через worker_rlimit_nofile или редактируя /etc/security/limits.conf?

2. И еще вопрос. Вот здесь http://habrahabr.ru/post/198982/ пишут, что следует ставить worker_rlimit_nofile = worker_connections * worker_processes * 2 Понятно, что если установить маленький лимит, то это может привести к ошибке «Открыто слишком много файлов», а чем плохи большие лимиты по открытым файлам? Можно ли тут переборщить?)

iamroman ()
Ответ на: комментарий от iamroman

1. Системные настройки не зависят от настроек приложения. Менять надо и там и там.

2. Меньше читай хабру :-) Установить можно и 65к, все упрётся в ОЗУ (процесс будет жрать больше памяти) и ЦП (процесс будет сжирать 100% процессорного времени для 1 ядра).

Настройки подбирают для того, чтобы:

а) заставить процесс работать оптимальным образом, учитывая, что рано или поздно все упрется в ЦП.

б) причиноследствие: клиентские соединения не должны ждать слишком долго

gh0stwizard ★★★★★ ()
Ответ на: комментарий от gh0stwizard

1. У worker_rlimit_nofile нет значения по умолчанию http://nginx.org/ru/docs/ngx_core_module.html#worker_rlimit_nofile получается, что если значение не задано явно, то оно берется из системных настроек. Значит лучше вообще его не указывать и редактировать сразу системную настройку? Тогда зачем существует worker_rlimit_nofile?

iamroman ()
Ответ на: комментарий от iamroman

Возможно, это сделано для упрощения, т.к. процесс nginx изначально запускается из под root (с дальнейшим понижением прав). Следовательно, он может делать все, что угодно. Вобщем, смотри сам.

gh0stwizard ★★★★★ ()
Ответ на: комментарий от iamroman

Значит лучше вообще его не указывать и редактировать сразу системную настройку?

Ну открывать файлы нужно не только nginx. Еще в доке же написано

Используется для увеличения ограничения без перезапуска основного процесса.

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

«Увеличение ограничения» это в смысле только лишь уменьшение ограничивающего значения? То есть, если в системной настройке ограничение 2048, то мы в worker_rlimit_nofile можем поставить 1024, но никак не 4096?

iamroman ()
Ответ на: комментарий от iamroman

Ну поставить выше системной настройки точно не выйдет. Я думаю они имеют в виду случай, когда поменяли системную настройку, и нужно, чтобы nginx это подхватил без перезапуска (limits.conf по-моему применяются только для новых процессов). Еще, как вариант, что под юзером nginx еще что-то запускается, и системный лимит нужно разделить, или системный лимит стоит по всем процессам.

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

Оказывается, можно ставить worker_rlimit_nofile в любое значение не меняя системных настроек и все будет работать, я сам не знаю как это проверить, но тут пишут, что именно так http://serverfault.com/a/641001 Да и в доках по worker_rlimit_nofile ничего не пишут касательно того, что нужно параллельно править системные настройки.

iamroman ()
Ответ на: комментарий от iamroman

В статье по твоему линку, он выше лимит меняет.

Сам посуди, если nginx-у система даёт открыть только, скажем, 1024 файла, то какая разница, сколько ты выставишь в конфиге nginx, система ему больше 1024 всё-равно не разрешит открытью

generator ★★★ ()
Ответ на: комментарий от generator

По моему линку автор там комментирует ниже, что круто, даже не нужно ничего менять через ulimit и все ставится только лишь с worker_rlimit_nofile.

iamroman ()
Ответ на: комментарий от iamroman

Возможно у него nginx от рута работает, там по умолчанию без лимита в системе, вроде как. В любом случае, я объясняю логику. Если система запрещает пользователью открывать больше 1024-х файлов, то от любых параметров и конфигов в пользовательских файлах ничего не зависит.

generator ★★★ ()
Ответ на: комментарий от generator

gh0stwizard выше писал:

Возможно, это сделано для упрощения, т.к. процесс nginx изначально запускается из под root (с дальнейшим понижением прав). Следовательно, он может делать все, что угодно.

iamroman ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.