最近笔者使用的Linux主机的数据库经常停止运行,几乎每天都需要重启,服务器上的网站访问量也不大。然后,我查看了日志,发现:致命错误:无法为缓冲池分配内存
原因是服务器内存不足。可能的原因是网站apache消耗内存太多。网上找解决方案,如何优化Apache内存使用?
查找MaxRequestsPerChild并将其更改为MaxRequestsPerChild 50。
影响apache性能的几个重要参数(在conf/httpd.conf中设置)
keepalive是否允许持久连接
Max keepalive requests允许最大数量的持久连接
keepalive time out在没有请求后保持连接断开多少秒
start server最初启动时启动了多少个服务器进程
minspareverse servers/[/k 同时处理的请求数
MaxClients(最重要的参数小于server limit)
MaxRequestSperchild的每个子进程处理的最大请求数
他们以前的关系:
prefork控制流程最初建立“StartServers”子流程后,为了满足MinSpareServers设置的需求,创建一个流程,等待一秒,继续创建两个,再等待一秒,继续创建四个...因此,创建的进程数量呈指数级增长,最高可达每秒32个,直到达到MinSpareServers设置的值。这种模式消除了在请求到达时生成新进程的需要,从而减少了系统开销并提高了性能。MaxSpareServers设置空空闲进程的最大数量。如果空空闲进程的数量大于这个值,Apache会自动杀死一些冗余的进程。不要把这个值设置的太高,但是如果它小于MinSpareServers,Apache会自动调整为MinSpareServers+1。
如果站点负载很重,请考虑同时增加MinSpareServers和MaxSpareServers。MaxRequestsPerChild设置每个子进程可以处理的请求数。每个子进程将在处理完“MaxRequestsPerChild”请求后自动销毁。0表示无限,即子进程永远不会被销毁。虽然默认设置0可以让每个子进程处理更多的请求,但是如果设置为非零值,有两个重要的好处:
1。它可以防止意外的内存泄漏。
2。当服务器负载下降时,子进程的数量会自动减少。
server limit 2000
StartServers 10
MinSpareServers 10
MaxSpareServers 15
max clients 1000
MaxRequestsPerChild 2048
调试过程中使用的指令:
# PS-ef | grep http | WC-l//查看请求总数
# cat /proc/loadavg //查看平均负载(loadavg),大于1。如果超过2,会明显感觉到性能下降
# netstat-ant | grep:80 | WC-L//检查TCP连接数
# top//检查系统运行
= =
Apache的内存使用情况
apache进程在使用内存时是“增长”的。也就是说,直到这个进程消亡,内存的使用量一直保持增加而不减少。在这种情况下,apache进程使用的内存量取决于应用程序使用的最大内存量。
Keepalive参数
参数keepalive timeout确定http进程在不执行任何操作之前可以等待多长时间。想象一下,如果keepalive设置为on,keepalivetimeout设置为一个很大的数,那么apache占用的内存会迅速增加。这是因为,当一个apache进程完成一个任务(并且达到一定的内存占用,想想“渐进”模式),它不会立即退出,而是等待一个keepalivetimeout时间。假设用户的链接请求不断到来,那么就会有相当多无用的apache进程积累,这些进程直到超时才会被杀死。
不过keepalive对于静态文件的传输真的很有效,比如图像文件。因此,keepalive应该设置为on,(off)但keepalvietimeout应该设置得小一些,比如5s 15
MaxRequestsPerChild
这个参数意味着在apache进程处理了多少个请求之后,它必须退出并重新启动,以避免进程中出现内存问题。
对于php脚本来说,将这个参数设置得小一些是有好处的,可以避免程序使用的内存不断增长给apache带来的压力:让这个参数定时释放内存,因为脚本执行后php会自动释放仅有的资源(内存)。
比如设置为50?如果太小,会消耗资源重新生成一个apache进程,这是一个平衡问题。
关键问题出现在MaxRequestsPerChild参数中。MaxRequestsPerChild此指令设置独立子进程能够处理的请求数量。
处理完“MaxRequestsPerChild number”请求后,子进程将被父进程终止。这时候子进程占用的内存就会被释放。如果有更多的访问请求,父进程将重新生成子进程进行处理。
如果MaxRequestsPerChild默认设置为0(无穷大),则每个子进程可以处理更多的请求,访问效率不会因为启动子进程的不断终止而降低。
但如果占用200~300M内存,即使负荷下来也不会减少。具有大内存的服务器可以设置为0或更大的数字。内存较小的服务器最好设置为30、50和100,以防止内存溢出。