59

我在一台 debian 机器上有一个流量很大的应用程序,而 apache 开始表现得很奇怪。

每次我启动 apache 时,都会产生大量 apache 进程,应用程序根本无法加载,而且很快整个机器就会死机,必须重新启动才能重新启动。

这是我在启动 apache 后立即得到的结果:

top - 20:14:44 up 1:16, 2 个用户,平均负载:0.48, 0.10, 0.03
任务:共 330 个,运行 5 个,睡眠 325 个,停止 0 个,僵尸 0 个
CPU:12.0%us、21.4%sy、0.0%ni、65.7%id、0.2%wa、0.1%hi、0.7%si、0.0%st
内存:总计 8179920k,已使用 404984k,空闲 7774936k,60716k 缓冲区
交换:总计 2097136k,使用 0k,免费 2097136k,缓存 43424k


10251 www-数据 15 0 467m 8100 4016 S 6 0.1 0:00.04 apache2
10262 www 数据 15 0 467m 8092 4012 S 6 0.1 0:00.05 apache2
10360 www-数据 15 0 468m 8296 4016 S 6 0.1 0:00.05 apache2
10428 www-数据 15 0 468m 8272 3992 S 6 0.1 0:00.05 apache2
10241 www-数据 15 0 467m 8256 4012 S 4 0.1 0:00.03 apache2
10259 www-数据 15 0 467m 8092 4012 S 4 0.1 0:00.04 apache2
10274 www-数据 15 0 467m 8056 4012 S 4 0.1 0:00.03 apache2
10291 www-数据 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2
10293 www-数据 15 0 468m 8292 4012 S 4 0.1 0:00.03 apache2
10308 www-数据 15 0 468m 8296 4016 S 4 0.1 0:00.02 apache2
10317 www-数据 15 0 468m 8292 4012 S 4 0.1 0:00.02 apache2
10320 www-数据 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2
10325 www-数据 15 0 468m 8292 4012 S 4 0.1 0:00.04 apache2

等等.. 有更多的 apache2 进程。

不到一分钟后,您可以在下方看到负载从 0.48 变为 2.17。如果此时我不停止 apache,负载会在几分钟或更短的时间内继续上升,直到机器死机。

顶部 - 20:15:34 上升 1:17,2 个用户,平均负载:2.17、0.62、0.21
任务:共 1850 个,运行 5 个,睡眠 1845 个,停止 0 个,僵尸 0 个
中央处理器:0.3%us、2.1%sy、0.0%ni、96.4%id、0.0%wa、0.1%hi、1.0%si、0.0%st
内存:总共 8179920k,已使用 1938524k,空闲 6241396k,60860k 缓冲区
交换:总共 2097136k,使用 0k,免费 2097136k,缓存 44196k

我们有一个防火墙,我们将已知允许访问我们网站的地址列入白名单。

任何关于问题可能是什么的想法都非常受欢迎。

谢谢!

4

6 回答 6

42

您可能犯了将 Apache 配置为使用远远超过您所有内存的错误。这是一个容易犯的错误。

我假设您使用的是 Prefork Apache 和进程内应用程序服务器(例如 PHP 或 mod_perl)。在此模型中,您最终将使用最大 (MaxClients * 每个进程的应用程序的最大内存使用量) 内存。如果你没有那么多,是时候减少一个,另一个或两者。

在一般情况下,这意味着将 MaxClients 减少到您的服务器有足够的内存来应对的程度。

如果您使用 Prefork 模型(大多数应用程序服务器不支持或不鼓励使用螺纹模型)。

但是,减少 MaxClients 最终会导致应用程序变得不可用,特别是如果您启用了 keepalives 并且 keepalive 超时时间过长。仅保持连接处于活动状态的进程(服务器状态中的状态 K)仍然使用大量 RAM,这可能是一个问题 - 尝试最小化保持连接超时,或完全关闭它。

您需要密切关注服务器状态(由 mod_status 提供)。

当然,只有在您了解后果的情况下,您才应该进行任何这些更改。三思而后行,更改配置一次。如果您有能力在类似规格的非生产机器上使用模拟负载测试更改,请这样做。

于 2009-02-01T19:23:17.003 回答
17

使用 ps -aux | grep apache 找出运行 apache 的进程数。寻找“RSS”列,它给出了每个进程使用的内存的估计值。或者,您可以使用“top”,在其中 shift + f 然后选择 %MEM 列以按内存使用情况对进程进行排序。

进程数由 apache.conf 文件中的“MaxClients”指令决定。你得到这个数字的方式是这个页面所描述的;

  1. 以 root 身份通过 SSH 连接到您的服务器。
  2. 跑上去。
  3. 按 shift + m。
  4. 请注意 httpd 使用的最高 RES 内存。
  5. 按 Q 退出顶部。
  6. 执行:service httpd stop(在 debian 中,sudo service apache2 stop
  7. 一旦 httpd 停止,执行:free -m
  8. 请注意“已使用”下列出的内存。
  9. 为您的 VPS 计划找到保证的内存。如果找不到,支持人员可以告诉您保证了多少。
  10. 从您的计划保证的内存中减去使用的内存。这将为您提供基本的免费内存池。
  11. 将您的 FREE MEMORY POOL 的值乘以 0.8 以找到您的平均 AVAILABLE APACHE POOL(这将允许您为突发周期保留 20% 的内存)。
  12. 将 AVAILABLE APACHE POOL 除以 httpd 使用的最高 RES 内存。这将为您提供应该为您的系统设置的 MaxClients 值。(如果它有小数部分,则将其四舍五入到小于该值的最接近的整数。)

“MaxClients”的正确值将确保为您的 apache 服务器分配正确的内存。我就是这样解决的。

在 Debian 中,apache conf 文件位于/etc/apache2/apache2.conf

于 2014-07-29T17:43:40.767 回答
11

您最近是否更改了配置文件?如果是,我相信您保留旧版本进行差异化?

如果没有,请搜索“StartServers”、“MaxSpareServers”和“MinSpareServers”指令。通常,您希望将它们保留为默认值,但它们可能被故意设置为高(坏主意)或由于错误的配置编辑而意外设置为这种方式。

如果这没有帮助,是时候在 Apache 之外寻找一些快速打开连接的进程(可能是有一个运行异常的测试进程)。

第一步是访问日志。第二步是运行 netstat,查看连接可能来自哪里。如果它在同一个系统上运行,您可以查看 /proc/*/fd 以找到连接的两端。

于 2009-02-01T18:01:37.683 回答
5

这个问题很古老,但我觉得有必要在这里添加一个答案,因为所有现有答案都忽略了来自 OP 的一条关键信息:负载开始上升几分钟后,top报告仍然有充足的 CPU & 可用的内存资源。通常只剩下一个罪魁祸首,那就是 I/O。

检查是否有完整的分区df -h。如果没有,请查看您的应用程序是否使用vmstat 1 10or iostat 1 10(这些由 Debian/Ubuntu 上的 'sysstat' 软件包提供)来破坏磁盘。如果您仍然没有在此处看到问题,则可能存在设备级 I/O 错误或网络安装存储的网络故障。检查系统和守护程序日志文件。

于 2015-12-24T16:53:57.987 回答
3

正如已经说过的(假设 Prefork Apache) - MaxClients = max processes at once。

如果您发现自己受到真实流量的影响(而不是配置错误的 StartServers/Min/MaxSpareServers),您还可以做一些其他事情:

  1. 为您的静态内容设置一个单独的轻量级 apache 进程(或 lighttpd)。这样,所有小的、静态的东西都不会“污染”你的重量级应用程序进程。这可以在同一台服务器上,也可以在不同的服务器上。没关系。
  2. 在你的 Apache 进程前面放置一个像 Squid 这样的反向代理。反向代理将快速从 Apache 中吸取内容并将其存储在内存中,然后将其打包回客户端。这样,使用 14.4kb 调制解调器的 AOL 用户就不会占用您宝贵的 Apache 插槽之一。作为奖励,可以将此类设置配置为缓存您的一些内容,以减少 Apache 进程的负载。
于 2009-02-25T22:40:48.607 回答
2

您的“顶部”输出显示您有足够的可用内存,所以我认为 MaxClients 不是问题(除非 Apache 分配超过 2GB 的内存有问题?)如果是,您的错误日志应该显示错误在创造更多孩子时遇到问题。

最有可能的是,您的 Apache 进程确实在使用大量资源。如果您正在运行 PHP 应用程序,请尝试安装 eAccelerator,它可以很好地优化和缓存 PHP 代码。其他事情可能包括繁重的 MySQL 查询、缓慢的 DNS 解析器等。除此之外,它还可以更多地了解哪些程序受到攻击以及它们在做什么。

于 2009-06-11T19:03:30.400 回答