apache服务器httpd.exe进程占用cpu100%

web开发作者:dayu日期:4天前点击:2

apache中MaxRequestsPerChild参数配置经验分享

MaxRequestsPerChild在apache中是一个非常重要的参数对于网站流量过大机器配置不好的朋友可以通过MaxRequestsPerChild来合理的设置进程与子进程的数量以达到最优的配置,下面一起来看看关于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%

原文地址:http://www.cnblogs.com/serchyan/p/7215521.html


下一篇       上一篇