我在一台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
我们有一个防火墙,我们将我们知道允许访问我们网站的地址列入白名单.
任何关于问题可能出现的想法都是非常受欢迎的.
谢谢!
你可能犯了配置Apache的错误,使用的远远超过你所有的ram.这是一个容易犯的错误.
我假设您正在使用Prefork Apache和进程内应用程序服务器(例如PHP或mod_perl).在此模型中,最终将使用最大(每个进程的应用程序的MaxClients*最大内存使用量)内存.如果你没有那么多,那么是时候减少一个,另一个或两者.
在一般情况下,这意味着将MaxClients减少到服务器有足够的ram来应对的程度.
如果您使用Prefork模型(大多数应用程序服务器不支持或不鼓励使用),则通常用于MaxClients的默认值(典型值为150)不适合在适度机器上运行进程内重量级应用程序服务器线程模型).
但是,减少MaxClients最终会导致应用程序不可用,特别是如果您启用了Keepalive并且keepalive超时太长.只保持连接活动的进程(服务器状态中的状态K)仍然使用大量RAM,这可能是一个问题 - 尝试最小化keepalive超时,或者完全关闭它.
您需要密切关注服务器状态(由mod_status提供).
当然,如果您了解后果,您应该只进行任何这些更改.三思而后行,更改配置一次.如果您有能力在类似规格的非生产机器上使用模拟负载测试更改,请执行此操作.
使用ps -aux | grep apache以找出运行apache的进程数.请注意"RSS"列,它可以估算每个进程使用的内存.或者,您可以使用"top",在其中移位+ f,然后选择%MEM列以按内存使用情况对进程进行排序.
进程数由apache.conf文件中的"MaxClients"指令确定.你对这个数字的看法如本页所述 ;
以root身份SSH到您的服务器.
跑顶.
按shift + m.
注意httpd使用的最高RES内存.
点击Q退出顶部.
执行:service httpd stop(在debian中sudo service apache2 stop
)
一旦httpd停止,执行:free -m
请注意"used"下列出的内存.
找到VPS计划的保证内存.如果您找不到支持,支持可以告诉您有多少保证.
从计划保证的内存中减去内存USED.这将为您提供基础免费记忆池.
将FREE MEMORY POOL的值乘以0.8可找到您的平均可用APACHE POOL(这将允许您在突发期间有20%的内存储备).
将您的AVAILABLE APACHE POOL除以httpd使用的最高RES内存.这将为您提供应为系统设置的MaxClients值.(如果它有一个分数组件,则将其舍入到小于此值的最接近的整数.)
"MaxClients"的正确值将确保为您的apache服务器分配正确的内存.这就是我解决它的方式.
在Debian中,apache conf文件位于 /etc/apache2/apache2.conf
您最近更改了配置文件吗?如果是的话,我相信你保留旧版本的差异?
如果没有,请搜索"StartServers","MaxSpareServers"和"MinSpareServers"指令.一般情况下,您希望将这些保留为默认值,但有可能是因为配置编辑错误而故意设置为高(坏主意)或意外设置.
如果这没有帮助,那么现在是时候向Apache外部寻找一些可以快速打开连接的进程(可能是因为有一个测试过程无法运行).
第一步是访问日志.第二步是运行netstat,以查看连接的来源.如果它在同一个系统上运行,你可以查看/ proc/*/fd来找到连接的两端.
这个问题很古老,但我觉得有必要在这里添加一个答案,因为所有现有的答案都忽略了OP的一个关键信息:负载开始上升几分钟后,top
报告仍然有足够的CPU和内存资源可用.通常有一个罪魁祸首,那就是I/O.
检查是否有完整分区df -h
.如果没有,请查看您的应用程序是否正在使用磁盘vmstat 1 10
或iostat 1 10
(这些是由Debian/Ubuntu上的'sysstat'软件包提供).如果您仍然没有看到问题,可能是网络安装存储设备级I/O错误或网络故障.检查系统和守护程序日志文件.