阿帕奇崩溃; “系统中打开的文件过多”

我在MediaTemple(dv)服务器上使用mpm_prefork运行Apache2。 最近我的服务器configuration没有发生重大变化。 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崩溃。 帮帮我?

我build议你尝试在文件/ etc / default / apache2的顶部添加一行这样的ulimit -n 16384 ,然后重新启动。

也看到这个链接 。

从'man proc':

/ proc / sys / fs / file-max该文件为所有进程打开的文件数定义了一个系统范围的限制。 (另请参阅setrlimit(2),进程可以使用它来设置每进程限制RLIMIT_NOFILE,可打开的文件数)。如果您收到大量有关用完文件句柄的错误消息,请尝试增加这个值:

  echo 100000 > /proc/sys/fs/file-max The kernel constant NR_OPEN imposes an upper limit on the 

值可以放在文件最大。

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

将/ proc / sys / fs / inode-max增加到/ proc / sys / fs / file-max的新值的3-4倍,否则将耗尽inode。

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

目前开放。 它包含三个数字:分配的文件句柄的数量; 免费文件句柄的数量; 和最大数量的文件句柄。 内核dynamic分配文件句柄,但不会再释放它们。 如果分配的文件数量接近最大值,则应考虑增加最大值。 当可用文件句柄的数量很大时,您在文件句柄的使用中遇到了一个高峰,您可能不需要增加最大值。

第二个数字是值得一看,看看第一个数字是你需要增加。 如果是这样,你可以在/etc/sysctl.conf中设置它:

 fs.file-max=512000 

请注意,这设置了系统限制; 每个用户的限制设置为“ulimit”,你已经表明你已经熟悉了。

检查lsof,看看实际发生了什么。 超过不合理的上限往往是由于泄漏或其他错误。

MediaTemple 使用的是Virtuozzo虚拟化技术? Virtuozzobuild立在OpenVZ之上。 在OpenVZ上打开文件的数量是有限制的。 也许是你的遏制者达到了极限?

运行这个命令(如果可以的话):

cat / proc / user_beancounters

并查看numfile资源的值。

尝试在启动Apache之前运行“ulimit -n 8192”。 它可能正在运行到最大打开的文件限制。

这可能正是它听起来像 – 你的服务器有更多的文件打开内核configuration处理。

我假设你有一个共享服务器? 如果你在服务器上有root权限,那么你可以用ulimit -n提高Web服务器用户的限制,直到在/ proc / sys / fs / file-max中configuration的最大值,但是你可能需要一个共享服务器与您的服务提供商交谈。

假设你分享这个服务器,你所在的特定服务器也可能是过度拥挤的,在这种情况下,MediaTemple将需要将你们中的一些人洗牌。

或者,您最近是否向Web存在添加了任何新function,或者stream量增加了很多?

我已经通过将以下内容添加到/ usr / sbin / apachectl来解决了我的问题:

 ULIMIT_MAX_FILES="ulimit -n 16384" 

问题似乎已经平息,至less在过去12个小时。