Apache 和内存使用情况

Apache 和内存使用情况

我租用了一台 Gentoo 服务器,上面有常用的 LAMP 堆栈(prefork Apache MPM)+ suPHP。

有时,我的服务器会内存不足,速度慢得像爬行一样(响应 ping,但实际上不可能登录,通过 SSH 发送的击键可能需要几分钟才能回复,更不用说处理了)。系统日志中还有很多 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
内存:总计 2042128k,已用 1634392k,可用 407736k,缓冲区 1792k
交换:总计 0k,已使用 0k,可用 0k,缓存 27724k

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

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

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

我尝试过的事情:

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

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

现在我已经减少MaxClients到 25 个,但现在页面请求需要几秒钟才能处理,并且一些使用 FlashGet 的孩子理论上可以阻塞所有 Apache 进程并有效地使所有网站无法访问 :/

问题:

  1. 有人可以建议一些 Apache 配置调整来彻底改善我的情况吗?

  2. 是否可以告诉 Linux 不要交换/分页 sshd、bash 以及我 ssh 登录和终止失控进程所需的所有其他内容?

  3. 如果上述问题的答案是“否”,请有人向我解释为什么当今时代的现代操作系统存在如此严重的缺陷。在我看来,这听起来像是操作系统设计的巨大失败 :(

答案1

您的每个 Apache 进程大约使用 80 MB 内存(RES 列)。这个数字非常大 - 这里我有一个 Web 服务器,其中安装了 Apache 2.2,用于运行 CGI,每个进程大约使用 5 MB。现在,如果您有 50 个 Apache 进程,每个进程使用 80MB,那么您的交换量就非常大。一旦我们找到您消耗如此多内存的原因,我们很可能会解决这个问题。

您可以发布您的 apache 配置文件吗?

相关内容