
Я запускаю 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. Вероятно, он упирается в ограничение на максимальное количество открытых файлов.