Apache和内存使用情况

我用通常的LAMP堆栈(prefork Apache MPM)+ suPHP租用Gentoo服务器。

有时,我的服务器内存不足,速度变慢(响应ping,但实际上不可能login,而通过SSH发送的击键可能需要几分钟的时间才能回显,处理的更less)。 在系统日志中也有很多oom_killer的东西。

这是我在其中一个时刻看到的top

顶部 -  16:45:05最多22天,8:08 3用户,平均负载:104.26,103.87,93.3
任务:共393次,跑步1次,睡眠388次,停止0次,僵尸4次
 Cpu:4.6%us,9.3%sy,0.8%ni,0.0%id,84.8%wa,0.0%hi,0.5%si,0.0%st
 Mem:总共2042128k,使用1634392k,使用407736k,缓冲1792k
交换:共0k,已用0k,免费0k,caching了27724k

   PID用户PR NI VIRT RES SHR S%CPU%MEM时间+命令
  3125 apache 20 0 288m 105m 1368 S 0 5.3 0:01.00 apache2
  2886 apache 20 0 285m 102m 1368 S 0 5.1 0:02.44 apache2
  3048 apache 20 0 279m 96m 1192 D 0 4.8 0:01.58 apache2
  3037 apache 20 0 278m 95m 1076 S 0 4.8 0:02.23 apache2
  3014 apache 20 0 278m 94m 1204 D 0 4.8 0:01.81 apache2
  2859 apache 20 0 274m 91m 1368 S 0 4.6 0:00.63 apache2
  3016 apache 20 0 269m 86m 1368 S 0 4.3 0:01.49 apache2
  2887 apache 20 0 269m 86m 1192 D 0 4.3 0:01.06 apache2
  2753 apache 20 0 269m 86m 1368 S 0 4.3 0:01.09 apache2
  3036 apache 20 0 266m 83m 1372 S 1 4.2 0:01.10 apache2
  3006 apache 20 0 266m 83m 1368 S 0 4.2 0:01.98 apache2
  3007 apache 20 0 265m 82m 1372 S 0 4.1 0:02.00 apache2
  3064 apache 20 0 264m 81m 1368 S 0 4.1 0:00.57 apache2
  3045 apache 20 0 263m 80m 1368 S 0 4.1 0:00.60 apache2
  2888 apache 20 0 263m 79m 416 S 0 4.0 0:01.09 apache2
  2862 apache 20 0 260m 77m 1368 S 1 3.9 0:01.95 apache2
  2891 apache 20 0 259m 76m ​​1332 D 0 3.9 0:01.98 apache2
  3046 apache 20 0 258m 75m 1080 S 0 3.8 0:01.20 apache2
  2873 apache 20 0 255m 72m 1380 S 0 3.6 0:01.51 apache2
  2987 apache 20 0 252m 69m 1368 S 0 3.5 0:01.04 apache2
  2666 apache 20 0 250m 67m 1368 S 0 3.4 0:00.72 apache2
  2903 apache 20 0 248m 66m 1368 S 0 3.3 0:01.02 apache2
  3013 apache 20 0 247m 63m 416 S 0 3.2 0:01.02 apache2

请注意,PHP运行在CGI模式下,所以这只是没有任何PHP模块的Apache。

坦率地说,我不明白为什么除了运行内存之外,它还会很慢,但它声称它有400 MB的可用内存。 “84.8%wa”也表示系统正在等待I / O操作(分页?)。

我试过的东西:

  • 禁用交换,希望那些开始大量占用内存的东西只会崩溃,而不会使服务器陷入困境 – 这是行不通的,它可能只是开始分配内存映射文件(可执行文件和SO)
  • 将根进程的oom_adj设置为15
  • 调整MPM设置:

     StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 50 MaxRequestsPerChild 10 MaxMemFree 1024 

现在我已经把MaxClients减less到25了,但是现在页面请求需要花费几秒钟的时间来处理,而一些使用FlashGet的孩子理论上可以堵塞所有的Apache进程,并且使所有的网站都无法访问:

问题:

  1. 任何人都可以提出一些Apacheconfiguration调整,可以从根本上改善我的情况?

  2. 是否有可能告诉Linux不交换/页出sshd,bash和其他所有我需要ssh和杀死失控进程?

  3. 如果对上述问题的答案是“不”,那么请向我解释一下,在当今这个时代,现代操作系统是如何可怕的缺陷。 听起来像史诗般的操作系统devise失败给我:(

您的apache进程每个使用大约80 MB的内存(RES列)。 这是巨大的 – 在这里我有一个Web服务器与Apache 2.2用于运行CGIs和每个进程使用约5 MB。 现在,如果你有50个Apache进程,每个进程使用80MB,那么你就像地狱交换。 一旦我们发现你为什么要消耗这么多的记忆,我们可能会解决这个问题。

你可以发布你的Apacheconfiguration文件?