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