Windows系统下Apache性能优化,提高并发 mod_mpm

Apache针对不同的操作系统提供了多个不同的MPM模块,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。 如果条件允许,我们可以根据实际需求将指定的MPM模块编译进我们自己的Apache中(Apache的源码是开放的,允许用户自行编译)。


修改MPM模块配置
在对Apache的MPM模块具备一定了解后,我们就可以针对不同的MPM模块来修改Apache的最大并发连接数配置了。

1.启用MPM模块配置文件

在Apace安装目录/conf/extra目录中有一个名为httpd-mpm.conf的配置文件。该文件主要用于进行MPM模块的相关配置。不过,在默认情况下,Apache的MPM模块配置文件并没有启用。因此,我们需要在httpd.conf文件中启用该配置文件,如下所示:

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf (去掉该行前面的注释符号"#")

在Windows系统中,起作用的是Winnt mpm段,

<IfModule mpm_winnt_module>
ThreadsPerChild      150
MaxRequestsPerChild    0
</IfModule>

 

以上是缺省的配置,一般情况下够用了,但负荷较大的网站就需要修改了,否则访问网站会变慢或没有响应。实际设置中可以根据apache-status查看apache实时连接状态,查看其中线程占用数目情况来进行相应的调整,我的服务器最后设置如下:

<IfModule mpm_winnt_module>
#ThreadLimit     350
ThreadsPerChild    350
MaxRequestsPerChild    10000
Win32DisableAcceptEx
</IfModule>

 

其中ThreadLimit是占用系统线程数限制,修改后会在apache-status中直接看到效果,就是对应的最大的可用线程数(如下所示):1 requests currently being processed, 349 idle workers

对于mpm_winnt,ThreadLimit的默认值是1920;对于其他mpM这个值是64。

注意:Apache在编译时内部有一个硬性的限制"ThreadLimit 20000"(对于mpm_winnt是"ThreadLimit 15000"),你不能超越这个限制。ThreadsPerChlid是Apache进程的子线程数,这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。如果使用一个类似于mpm_winnt只有一个子进程的mpM,这个数值要足够大,以便可以处理可能的请求高峰。如果使用一个类似于worker有多个子进程的mpM,每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。

该参数需要根据 apache-status实时的监控情况来调节,太大会导致内存增长过快,直到服务器当机,太小会导致服务器连接队列在高峰期时占满,从而导致网站连接 慢。同时我们应该修改另一个配置文件httpd-default.php中的超时设置来配合这个参数。

对于mpm_winnt,ThreadsPerChild的默认值是64;对于其他mpM是25。MaxRequestsPerChild是进程的最大的请求数目,既指网站收到请求的缓存数。设置太小了会影响服务器性能,因为会占用较多cpu时间,太大了则会占用内存资源。一般大型的网站文件个数都是成千上万,所以管理员应该根据网站情况自己设定。

MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。

在mpm_netware和mpm_winnt上的默认值是"0"。

将MaxRequestsPerChild设置成非零值有两个好处:

a)可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。

b)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

注意:对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。Win32DisableAcceptEx加入该语句是为了解决一些警告:

[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed。

2、httpd-default.conf设置在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效。我们需要调节以下参数:Timeout 20

该参数为连接超时,缺省的300秒显然太大,缩小该参数就会减少同时连接数,即用户实际占用的线程数,这样就可以起到配合上面ThreadsPerChlid参数的作用。KeepAlive On

该参数为是否保持活连接,目前网站中一个页面一般会包含多个文件,所以相应用户访问时会有多个请求,因此开启可以提高服务器性能。MaxKeepAliveRequests 50

该参数为最大的活连接请求数,可以根据网页实际包含的文件数目自行调节。KeepAliveTimeout 5

该参数为活连接的超时时间,一般只要设置成小于Timeout即可。这样设置后,Apache在响应请求和防止恶意攻击方面就取得较为平衡的效果,当然由于内存回收机制和进程管理不同,Windows下长期运行 Apache还是不如Unix稳定,因此我们可以让Apache在每天凌晨访问人数少时自动重启一次,以回收资源。用Windows自带的计划任务就可以 简单的实现。这样,我们就使Apache在Windows平台下像Unix一样长期稳定的提供服务了。【windows下apache及mysql定时自动重启&服务器定时自动重启】有时候觉得,服务器运行时间过长,造成服务器内存等压力过大。因此,不用重新启动服务器的情况下,完成apache和mysql的内存释放,是非常有益处的(把重启时间设置在访问量最低的)。

修改时间 2018-04-25

真诚赞赏,手留余香
赞赏
随机推荐
Mac配置环境变量的地方
近几年前端技术盘点以及 2016 年技术发展方向
macOS 安装 nginx
JavaScript 链表
Mac OS原来自带了apache,基本用法总结
Koa.js 限流中间件 koa-ratelimit
Vue.js 源码学习笔记
MySQL从一个表往另一个表中导出数据,并处理时间格式
PDO 使用预处理 LIMIT
EJS 中文文档