当我启动apache并继续杀死我的机器时,如何防止大量的apache进程产生?

时间:2009-02-01 17:27:26

标签: linux apache apache2 debian apache-config

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

每次启动apache时,都会产生大量的apache进程,应用程序根本不会加载,很快整个机器都冻结,必须重新启动才能重新启动。

这是我在启动apache后立即获得的顶部:

top -   20:14:44    up         1:16,      2 users,    load average: 0.48, 0.10, 0.03
Tasks:  330 total,  5 running, 325 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.0%us,    21.4%sy,   0.0%ni,        65.7%id,   0.2%wa,  0.1%hi,  0.7%si,  0.0%st
Mem:    8179920k    total,     404984k used,  7774936k free,    60716k buffers
Swap:   2097136k    total,     0k used,       2097136k free,    43424k cached


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

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

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

top -    20:15:34 up 1:17,       2 users,  load average: 2.17, 0.62, 0.21
Tasks:   1850 total,  5 running, 1845 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,      2.1%sy,    0.0%ni, 96.4%id,  0.0%wa,  0.1%hi,  1.0%si,  0.0%st
Mem:     8179920k     total,     1938524k used,  6241396k free,    60860k buffers
Swap:    2097136k     total,     0k used,  2097136k free,    44196k cached

我们有一个防火墙,我们将我们知道的地址列入白名单。

非常欢迎任何关于问题可能出现的想法。

谢谢!

6 个答案:

答案 0 :(得分:42)

你可能犯了配置Apache的错误,使用的远远超过你所有的ram。这是一个容易犯的错误。

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

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

如果您使用Prefork模型(大多数应用程序服务器不支持或不鼓励),通常用于MaxClients的默认值(典型值为150)不适合在适度机器上运行进程内重量级应用程序服务器,使用线程模型)。

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

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

当然,如果你了解后果,你应该只做出这些改变。三思而后行,更改配置一次。如果您有能力在类似规范的非生产机器上使用模拟负载测试更改,请执行此操作。

答案 1 :(得分:16)

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

进程数由" MaxClients" apache.conf文件中的指令。你来到这个数字的方式如this page所述;

  1. 以root身份SSH到您的服务器。
  2. 跑顶。
  3. 按shift + m。
  4. 请注意httpd。
  5. 使用的最高RES内存
  6. 点击Q退出顶部。
  7. 执行:service httpd stop(在debian中,sudo service apache2 stop
  8. httpd停止后,执行:free -m
  9. 请注意""。
  10. 下列出的内存
  11. 查找VPS计划的保证内存。如果找不到,支持可以告诉您有多少保证。
  12. 从计划保证的内存中减去内存USED。这将为您提供基础免费记忆池。
  13. 将FREE MEMORY POOL的值乘以0.8,以找到您的平均可用APACHE POOL(这将允许您为突发期间提供20%的内存储备)。
  14. 将您的AVAILABLE APACHE POOL除以httpd使用的最高RES内存。这将为您提供应为系统设置的MaxClients值。 (如果它有一个分数组件,则将其舍入到小于此值的最接近的整数。)
  15. " MaxClients"的正确价值将确保为您的Apache服务器正确分配内存。这就是我如何解决它。

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

答案 2 :(得分:10)

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

如果没有,请搜索“StartServers”,“MaxSpareServers”和“MinSpareServers”指令。一般情况下,您希望将这些保留为默认值,但可能是由于配置编辑错误而故意设置为高(不好主意)或意外设置。

如果这没有帮助,那么现在是时候向Apache外部寻找一些可以快速打开连接的进程(可能是因为测试过程无法进行)。

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

如前所述(假设Prefork Apache) - MaxClients =一次性最大进程。

如果您发现自己受到实际流量的攻击(而不是错误配置的StartServers / Min / MaxSpareServers),您还可以执行其他一些操作:

  1. 设置一个单独的轻量级 apache进程(或lighttpd) 你的静态内容。这样一切 小而静态的东西没有 “污染”你的重量级应用程序 处理。这可以是相同的 服务器,或不同的服务器。不 物质
  2. 像Squid一样放置一个反向代理     Apache进程的前端。该     反向代理将迅速贬值     来自Apache的内容并存储它     在记忆中,然后包裹它     给客户。这样AOL     14.4kb调制解调器上的用户不会吃一个     您宝贵的Apache插槽。作为一个     奖金,这样的设置可以     配置为缓存你的一些     内容减少你的负担     Apache进程。

答案 5 :(得分:2)

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

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