Apache дает сбой; «Слишком много открытых файлов в системе»

Apache дает сбой; «Слишком много открытых файлов в системе»

Я запускаю Apache2 с mpm_prefork на сервере MediaTemple (dv). В последнее время в конфигурацию моего сервера не вносилось никаких существенных изменений. httpd.conf в настоящее время установлен следующим образом:

MaxKeepAliveRequests 200
KeepAliveTimeout 15

<IfModule prefork.c>
    StartServers           10
    MinSpareServers        10
    MaxSpareServers        10
    MaxClients            200
    MaxRequestsPerChild   4000
</IfModule>

Но я получаю следующую ошибку непосредственно перед полным сбоем Apache:

[Thu Jun 04 18:30:24 2009] [warn-phpd] mmap cache can't open /var/www/vhosts/mydomain.com/httpdocs/filename.php - Too many open files in system (pid 19873)

Меня начинает раздражать необходимость постоянно нянчиться с этим сервером и перезапускать его, когда Apache падает. Помогите?

решение1

Предлагаю вам попробовать добавить такую ​​строкуulimit -n 16384в начало файла /и т.д./по умолчанию/apache2и затем перезапуск.

Также см. этосвязь.

решение2

из 'man proc':

/proc/sys/fs/файл-макс Этот файл определяет общесистемный предел количества открытых файлов для всех процессов. (См. также setrlimit(2), который может использоваться процессом для установки предела для каждого процесса, RLIMIT_NOFILE, на количество файлов, которые он может открыть.) Если вы получаете много сообщений об ошибках о том, что закончились дескрипторы файлов, попробуйте увеличить это значение:

          echo 100000 > /proc/sys/fs/file-max

          The  kernel constant NR_OPEN imposes an upper limit on the

значение, которое может быть помещено в file-max.

          If you  increase  /proc/sys/fs/file-max,  be  sure  to 

увеличьте /proc/sys/fs/inode-max в 3-4 раза относительно нового значения /proc/sys/fs/file-max, иначе у вас закончатся иноды.

   **/proc/sys/fs/file-nr**
          This (read-only)  file  gives  the  number  of  files 

в настоящее время открыто. Он содержит три числа: количество выделенных дескрипторов файлов; количество свободных дескрипторов файлов; и максимальное количество дескрипторов файлов. Ядро выделяет дескрипторы файлов динамически, но не освобождает их снова. Если количество выделенных файлов близко к максимуму, вам следует рассмотреть возможность увеличения максимума. Когда количество свободных дескрипторов файлов велико, вы столкнулись с пиком использования дескрипторов файлов, и вам, вероятно, не нужно увеличивать максимум.

Второе число стоит посмотреть, чтобы понять, нужно ли увеличивать первое число. Если да, то вы можете установить его в вашем /etc/sysctl.conf с помощью:

fs.file-max=512000

Обратите внимание, что это устанавливаетсистемаограничение; ограничение на пользователя устанавливается с помощью «ulimit», о котором вы уже указывали, что знакомы.

решение3

Проверьте lsof, чтобы увидеть, что на самом деле происходит. Превышение неоправданно высокого лимита часто происходит из-за утечки или другой ошибки.

решение4

Попробуйте запустить "ulimit -n 8192" перед запуском apache. Вероятно, он упирается в ограничение на максимальное количество открытых файлов.

Связанный контент