Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] параметр --rlimit-nofile=COUNT для конфигурирования, по умолчанию 4096
On 28.02.2011 22:42, Igor Sysoev wrote:
2011/02/28 13:21:12 [emerg] 15785#0: open()
"/usr/share/nginx/logs/mbttechnology.access.log" failed (24: Too many
open files)
Это и есть ошибки при reload.
Возможно, нужно добавлять фразу "while reconfiguring".
предлагаю более простой и надежный вариант решения этой проблемы:
при старте nginx установить limit on number of open files
в (40 * 1024) вместо дефолтового для системы значения 1024.
это устранит проблему Too many open files во время service nginx reload,
при этом для worker-процессов можно будет выставить любой нужный лимит
с помощью глобальной директивы worker_rlimit_nofile в конфиге nginx.
А как на это значение будут реагировать ОСы ?
Например, во FreeBSD по умолчанию kern.maxfiles суммарно
для всех процессов около 12000.
Ok. изменил патч,
теперь лимит можно задать во время конфигурирования nginx
например, таким образом: ./configure --rlimit-nofile=16384
по умолчанию, если опция не задана - RLIMIT_NOFILE будет 4096
если надо вернуть старое поведение, тогда --rlimit-nofile=1024
при этом код для изменения RLIMIT_NOFILE не будет скомпилирован.
сейчас nginx перестает реагировать на service nginx reload
если в конфиге есть более чем 512 сайтов с 512 лог-файлами.
после применения патча - этот лимит увеличивается до 2048.
этот же лимит в 4096 открытых файловых дескрипторов будет
действовать и для всех worker-процессов, если начинающий
пользователь не задаст в конфиге директиву worker_rlimit_nofile
в то же время для advanced пользователей появляется возможность
увеличивать RLIMIT_NOFILE для master только с помощью опции configure
без необходимости вручную добавлять ulimit -n 16384 в стартовые скрипты
--
Best regards,
Gena
--- src/core/nginx.c.orig 2011-02-28 19:01:31.000000000 +0200
+++ src/core/nginx.c 2011-03-01 13:32:06.000000000 +0200
@@ -199,6 +199,9 @@ int ngx_cdecl
main(int argc, char *const *argv)
{
ngx_int_t i;
+#if NGX_RLIMIT_NOFILE > 1024
+ struct rlimit rlmt;
+#endif
ngx_log_t *log;
ngx_cycle_t *cycle, init_cycle;
ngx_core_conf_t *ccf;
@@ -266,6 +269,15 @@ main(int argc, char *const *argv)
/* TODO */ ngx_max_sockets = -1;
+#if NGX_RLIMIT_NOFILE > 1024
+ rlmt.rlim_cur = (rlim_t) NGX_RLIMIT_NOFILE;
+ rlmt.rlim_max = (rlim_t) NGX_RLIMIT_NOFILE;
+ if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
+ ngx_log_stderr(0, "setrlimit(RLIMIT_NOFILE, %i) failed",
+ NGX_RLIMIT_NOFILE);
+ }
+#endif
+
ngx_time_init();
#if (NGX_PCRE)
--- configure.orig 2011-03-01 12:50:46.000000000 +0200
+++ configure 2011-03-01 12:56:40.000000000 +0200
@@ -108,5 +108,6 @@
have=NGX_USER value="\"$NGX_USER\"" . auto/define
have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define
+have=NGX_RLIMIT_NOFILE value="$NGX_RLIMIT_NOFILE" . auto/define
. auto/summary
--- auto/options.orig 2011-03-01 12:57:50.000000000 +0200
+++ auto/options 2011-03-01 13:41:59.000000000 +0200
@@ -13,6 +13,7 @@
NGX_LOCK_PATH=
NGX_USER=
NGX_GROUP=
+NGX_RLIMIT_NOFILE=4096
CC=${CC:-gcc}
CPP=
@@ -169,6 +170,8 @@
--builddir=*) NGX_OBJS="$value" ;;
+ --rlimit-nofile=*) NGX_RLIMIT_NOFILE="$value" ;;
+
--with-rtsig_module) EVENT_RTSIG=YES ;;
--with-select_module) EVENT_SELECT=YES ;;
--without-select_module) EVENT_SELECT=NONE ;;
@@ -318,6 +321,9 @@
--builddir=DIR set the build directory
+ --rlimit-nofile=COUNT maximum number of open file descriptors
+ allowed by default for the nginx process
+
--with-rtsig_module enable rtsig module
--with-select_module enable select module
--without-select_module disable select module
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru
|