您的位置:首页 > 运维架构 > Apache

Apache(Web)服务器性能调整

2013-12-08 23:29 281 查看
Apache多路处理模块---MPM

apache通过不同的MPM运行在多进程和多线程混合模式下,增强配置扩充性能。MPM无法模块化,只能在编译配置时选择,被静态编译到服务器中。目前apache版本中一个服务器只能选择一个MPM,在UNIX/Linux平台中可以选择使用prefork(默认)与worker多路处理模块,而windows平台上只能使用mpm_winnt模块。

配置编译参数,如:


# ./configure --with-mpm=perfork
# make
# make install


查看当前系统使用的是哪一个MPM: # ./httpd -l

1)perfork模块

perfork模块是一个非线程型与预派生的模块,通过预先派生一定数量的子进程来等待客户请求。





参数说明:

ServerLimit 2000
//默认的MaxClient最大是256个线程,假如想配置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。假如需要更大,则必须编译apache,此前都是无需重新编译Apache。生效前提:必须放在其他指令的前面

StartServers 5
//指定服务器启动时建立的子进程数量,prefork默认为5。

MinSpareServers 5
//指定空闲子进程的最小数量,默认为5。假如当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

MaxSpareServers 10
//配置空闲子进程的最大数量,默认为10。假如当前有超过MaxSpareServers数量 的空闲子进程,那么父进程将杀死多余的子进程。此参数不要 设的太大。假如您将该指令的值配置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。

MaxClients 256
//限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,您必须同时增大ServerLimit 。

MaxRequestsPerChild 10000
//每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。假如MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild配置成非零值的两个好处:1、防止内存泄露无限进行,从而耗尽内存;2、给进程一个有限寿命,从而有助于当服务器负载减轻时减少活动进程的数量。


一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或是空闲的子进程用于迎接即将到来的请求。这样客户端就无需在得到服务前等候子进程的产生。prefork MPM使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,在大多数平台上,prefork MPM在效率上要比worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它能够使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,他也更容易调试一些。

2)worker模块

worker模块是apache2.0以后新增加的而一个多路处理模块,与可以使用混合的多线程多进程,处理能力比传统的prefork更强大,对系统资源的需求更小,它使用多个进程,并在每个进程下面派生线程来服务请求,稳定性比纯粹使用线程的服务器更稳定。



参数说明:

ServerLimit 50
//服务器允许配置的进程数上限。值必须大于等于MaxClients/ThreadsPerChild。这个指令和ThreadLimit结合使用配置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

ThreadLimit 200
//每个子进程可配置的线程数上限。这个指令配置了每个子进程可配置的线程数ThreadsPerChild上限。该值应该跟ThreadsPerChild可能达到的最大值保持一致,ThreadLimit >= ThreadsPerChild。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。

StartServers 5
//服务器启动时建立的子进程数。

MinSpareThreads 25
//最小空闲线程数(单个子进程), 这个MPM将基于整个服务器监控空闲线程数。假如服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

MaxSpareThreads 500
//配置最大空闲线程数(单个子进程)。默认值是"250"。这个MPM将基于整个服务器监控空闲线程数。假如服 务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正您配置

MaxClients 5000
//允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候 队列。因此要增加MaxClients的时候,您必须同时增加 ServerLimit的值。计算公式:MaxClients<=ServerLimit *ThreadsPerChild,将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000

ThreadsPerChild 100
//每个子进程建立的常驻的执行线程数,子进程在启动时建立这些线程后就不再建立新的线程了。

MaxRequestsPerChild 0
//配置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。假如MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild配置成非零值有两个好处:1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。



公式:
ThreadLimit >= ThreadsPerChild
MaxClients = MinSpareThreads+ThreadsPerChild

硬限制:
ServerLimi和ThreadLimit这两个指令决定了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的)。Apache在编译ServerLimit时内部有一个硬性的限制,您不能超越这个限制。prefork MPM最大为"ServerLimit 200000",其他MPM(包括work MPM)最大为"ServerLimit 20000。Apache在编译ThreadLimit时内部有一个硬性的限制,您不能超越这个限制。mpm_winnt是"ThreadLimit 15000";其他MPM(包括work prefork)为"ThreadLimit 20000

注意:
使用ServerLimit和ThreadLimit时要特别当心。假如将ServerLimit和ThreadLimit配置成一个高出实际需要许多的值,将会有过多的共享内存被分配。当配置成超过系统的处理能力,Apache可能无法启动,或系统将变得不稳定。



3)模式切换(从profrok工作模式切换到worker工作模式)


1> 进入/usr/sbin目录:cd /usr/sbin
2> 将当前的prefork模式启动文件改名:mv httpd httpd.prefork
3> 将worker模式的启动文件改名:mv httpd.worker httpd
4> 修改配置文件:vi /etc/httpd/conf/httpd.conf
5>找到或添加里边的如下一段,可适当修改负载等参数:

StartServers 5
ThreadLimit 200
ServerLimit 50
MaxClients 2000
MinSpareThreads 25
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 50


6> 重新启动服务:/etc/init.d/httpd restart 即可换成worker方式启动apache



4)apache所提供的性能调整常见指令

KeepAlive:通过on和off开关设置是否使用http持久连接。

MaxKeepAliveRequests:一个持久连接中允许的最大请求数量,默认是100.

KeepAliveTimeout:设置持久连接中服务器在两次请求之间等待的秒数,默认是5s。该值越大与空闲客户端保持连接的进程就越多。

5)Event MPM模块

最新的,还在试验阶段
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: