master_file_limit
Igor Sysoev
igor на sysoev.ru
Пн Фев 22 00:56:30 MSK 2010
On Mon, Feb 22, 2010 at 12:24:56AM +0300, Kirill A. Korinskiy wrote:
> At Sun, 21 Feb 2010 14:03:07 +0200,
> Alex Vorona <voron at amhost.net> wrote:
> >
> > Привет,
> >
> > При попытке релоада nginx'а с конфигурацией, которая содержит > 1024 файлов(> 500 доменов,
> > по 2 лога на домен), nginx не релоадится с ошибкой
> > 2010/02/21 12:42:42 [emerg] 17723#0: open() "/var/log/nginx/www.domain.com.error.log"
> > failed (24: Too many open files)
>
> дык, он просто выставляет rlimit после того как прочел конфиг, а т.к. ошибка происходит на
> этапе чтения конфига, получаешь что получаешь. В случае reload у тебя уже есть
> стотыщмильонов файловых дискрипторов, вот он и перечитывает их.
>
> Игорь, а зачем было вообще делать rlimit? зачем дублировать ручку системы?
Появление worker_rlimit_... связано с рядом причин:
1) В какой-то момент из Линукса вынесли /proc/sys/kernel/rtsig-max,
заменив на RLIMIT_SIGPENDING, но ручки из userland к нему не приделали.
2) Для того, чтобы разрешить в Линуксе создавать корки, проще написать:
поставьте
worker_rlimit_core 1g;
working_directory /path/to/cores;
3) задавать rlimit на старте не самое тривиальное занятие.
Например, во FreeBSD можно записать в /etc/sysctl.conf:
kern.maxfiles=204800
но на скрипты в /usr/local/etc/rc.d/ это никак не влияет, потому что
эти команды выполняются в разных несвязанных шеллах.
В результате в скрипте старта нужно указать
ulimit -n `sysctl -n kern.maxfilesperproc`
Кроме того, многие рекомендуют ставить лимиты в /etc/limits.conf, что,
разумеется, не решает проблему.
4) Чтобы менять rlimit без рестарта.
--
Игорь Сысоев
http://sysoev.ru
Подробная информация о списке рассылки nginx-ru