首页 > 代码库 > apache服务器httpd.exe进程占用cpu100%
apache服务器httpd.exe进程占用cpu100%
apache中MaxRequestsPerChild参数配置经验分享
MaxRequestsPerChild参数介绍
用 记事本打开apache2confhttpd.conf,
查找MaxRequestsPerChild,将MaxRequestsPerChild 0改成MaxRequestsPerChild 50即可。
通常在“Windows任务管理器-进程”中可以看到两个apache.exe进程,一个是父进程、一个是子进程,父进程接到访问请求 后,将请求交由子进程处理。
MaxRequestsPerChild这个指令设定一个独立的子进程将能处理的请求数量。在处理 “MaxRequestsPerChild 数字”个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理。
如果 MaxRequestsPerChild缺省设为0(无限)或较大的数字(例如10000以上)可以使每个子进程处理更多的请求,不会因为不断终止、启动 子进程降低访问效率,但MaxRequestsPerChild设置为0时,如果占用了200~300M内存,即使负载下来时占用的内存也不会减少。
内存 较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100,以防内存溢出
下面看一个例子
从网络上搜索到一篇文章,说加大 MaxRequestsPerChild 可以促使增加子进程的复用,从而提高效率。不记得那篇文章是否提到了其使用的 Apache 的 MPM ,版本是 2.0 的没错,反正不是 woker 就是 prefork 了。
我使用的 prefork ,参考那篇文章,将 MaxRequestsPerChild 由 300 调整到了 3000 。
结果,后两天的监控结果是,在网站访问期的高峰期,服务器负荷很重,数据库的并发连接频频超过最高限制。Apache 的并发连接也几乎一直保持在最高,网站访问速度很慢,频繁出现访问超时的问题。
最开始以为是网站访问量过大,达到服务器硬件极限导致的正常现象,不过,手动重启 Apache 后,数据库并发连接迅速降低,之后缓慢增加,一直达到最高并发连接限制,并且很长时间无法减小。
之后,认为是数据库并发连接过高,导致系统负荷过大,而 Apache 过多的 KeepAlice 连接导致数据库的并发连接无法及时释放从而消耗大量系统资源,导致系统负荷过重。
最后,怀疑到 MaxRequestsPerChild 的 300 设置是否合理。
阅 读 Apache 手册关于 MaxRequestsPerChild 的说明后,认为 prefork 下,KeepAlice 开启的情况下,每一个新连接都会导致一个 Apache 子进程开启, MaxRequestsPerChild 设置过大,导致新连接产生新的子进程后,长期 idle ,这样并不一定合理。
根据网站的访问情况,并不需要那么大的 MaxRequestsPerChild ,客户端和 Apache 采用 http 进行连接,网站都是一些大小不大的文件,客户端在和 Apache 服务器数次交互后,就应该完成一次访问了,用户点击网站的频率也不会那么高,所以 MaxRequestsPerChild 不应该设置那么高,而应该设置低一些,以尽快释放数据库连接,尽快回收系统资源,以尽可能快速的满足新的请求的连接需求。
将 MaxRequestsPerChild 重新调整回默认的 300 ,情况有所改观。
最后,就像那句古话所说的,尽信书不如无书,换到互联网上也一样。不能盲目的参考网上的资料,特别是非严格发表的个人经验文档。网上的资料始终都只能作为参考,必须要经过自己的理解,再结合实际情况,进行调整。不然,导致的结果可能是无法预计的。
MaxRequestsPerChild 与 keepalive的关系
MaxRequestsPerChild 表示一个httpd进程最多服务多少个请求,然后自动退出
keepalive 表示连接可以复用
这两个参数看似没有什么关系,可是最近一个偶然的事情却把这两个参数扯到了一起。
这里面的微妙关系就是:MaxRequestsPerChild 在统计服务了多少个请求的时候,把开一次链接作为一个请求。
这意味什么呢?是考虑,如果你的请求都频繁的、不间断的来自一个客户端,这样的话,连接将会被一直被复用,
然后处理过的请求个数将永远不会超过MaxRequestsPerChild,但是可能每次的请求都会带来一定的内存增长,时间长了内存也就永远不会被释放。
所以,如果想 MaxRequestsPerChild 起到回收资源的作用,那么请把keepalive设置成off。
例子
对於 Apache 架设的伺服器,在遇到连线数问题上,以下参数是会考虑微调的
这是预设
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
不过遇到多个 VirtualHost 与连线变多时,需要适时调整
可能是这样子
ServerLimit 300
MaxClients 300
MaxRequestsPerChild 3000
ServerLimit 与 MaxClients 是针对同时间最大连线数?槎嗌伲?驳褥妒 Apache 程序数量,ps 一下就会有多少个 /usr/sbin/httpd 等
而 MaxRequestsPerChild 则是一个 Apache 子程序可以接受多少个 Request 量,等达到上限了就会被中断砍掉,再重新?生一个新的子程序
Timeout 是不是也要调,预设 120 秒,调 60 好了
以上信息部分来自网络.同时也感谢网友的分享,如对文章有疑问。可联系本人删贴。
apache服务器httpd.exe进程占用cpu100%