Apache所运行的硬件环境都是对性能影响最大的因素
apache
各个硬件指标中,对性能影响最大的是内存,其次是硬盘的速度服务器
●Apache的工做模式多线程
一、prefork模式(一个 非线程型的)并发
⑴、主要工做方式:当Apache服务器启动后,mpm_prefork模块会预先建立多个子进程(默认为5个),每一个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,而且每一个子进程同时只能用于处理单个请求。若是当前的请求数将超过预先建立的子进程数时,mpm_prefork模块就会建立新的子进程来处理额外的请求。Apache老是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求,这样客户端的请求就不须要在接收后等候子进程的产生。ide
⑵prefork在效率上要比worker要高,可是内存使用大多不擅长处理高并发的场景高并发
⑶Apache在prefork工做模式下影响性能的重要参数说明:性能
#prefork MPMspa
<ifModule mpm_prefork_module>线程
StartServers 5 #Apache启动时默认开始的子进程数
队列
MinSpareServers 5 #最小的闲置子进程数
MaxSpareServers 10 #最大的闲置子进程数,
MaxRequestWorkers 250 #MaxRequestWorkers设置了容许同时最大接入的请求数量,任何超过MaxRequestWorkers限制的请求将进入等候队列
MaxConnectionsPerChild 500 #设置的是每一个子进程可处理的请求数。每一个进程在处理了“MaxConnectionsPerChild”请求后将自动销毁。0意味着无限,即子进程永不销毁。设置为1时可防止意外的内存泄漏。设置为2时表示在服务器负载降低的时候会自动减小子进程数。可根据服务器的负载来调整此值
★注:
①MaxRequestWorkers是这些指令中最为重要的一个,设定的是Apache能够同时处理的请求,是对Apache性能影响最大的参数。若是请求总数已经达到这个值(经过ps -ef | grep http | wc -l来确认)那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下不少而http访问却很慢的主要缘由。虽然理论上这个值越大,能够处理的请求就越多,建议将初始值设为以MB为单位的最大物理内存/2,而后根据负载状况进行动态调整。
②prefork控制进程在最初创建“StartServers”子进程后,为了知足MinSpareServers设置的须要建立一个进程,等待一秒钟,继续建立两个,再等待一秒钟,继续建立四个......如此按指数级增长建立的进程数,最多达到每秒32个,直到知足MinSpareServers设置的值为止,这种模式能够没必要再请求到来时再产生新的进程,从而减少了系统开销以增长性能。MaxSpareServers设置了最大的空闲进程数,若是空闲进程数大于这个值,Apache会kill掉一些多余的进程,这个值不要设的过大,但若是设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。若是站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
③ServerLimit和MaxClients(MaxRequestWorkers)的区别:在Apache时代,控制最大进程数只有MaxClients这个参数,而且这个参数最大值为256,而且是写死了的,试图设置为超过256是无效的,这是因为Apache1时代的服务器硬件是限制的。可是Apache2时代因为服务器硬件的升级,硬件已经再也不是限制,因此ServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients以前,值不要小于Maxclients。
④查看Apache加载的模块:apachectl -t -D DUMP_MODULES 或 apachectl -M 或 apachectl -l
查看Apache的工做模式:httpd -v 或 httpd -l
⑤修改prefork参数和启动prefork模式
vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
vi /usr/local/http-2.4.23/conf/httpd.conf 添加两行:LoadModule mpm_prefork_module/mod_mpm_prefork.so 和 Include conf/extra/httpd-mpm.conf
重启httpd服务
二、Worker模式(多线程多进程)
⑴与prefork的比较:prefork速度要稍高于worker,然而它须要的CPU和memory资源也稍多于worker
⑵Apache在worker工做模式下影响性能的重要参数说明
#worker MPM
<ifModule mpm_worker_module>
StartServers 3 #Apache启动时默认开始的子进程数
MinSpareThreads 75 #最小空闲数量的工做进程
MaxSpareThreads 250 #最大空闲数量的工做线程
ThreadPerChild 25 #每一个子进程产生的线程数量
MaxRequestWorkers 400 #MaxRequestWorkers设置了容许同时最大接入的请求数量,任何超过MaxRequestWorkers限制的请求将进入等候队列
MaxConnectionsPerChild 0 #设置的是每一个子进程可处理的请求数。每一个进程在处理了“MaxConnectionsPerChild”请求后将自动销毁。0意味着无限,即子进程永不销毁。
★注:
①Worker由主控制进程生成“StartServers”子进程,每一个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。一样,为了避免在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数。而MaxRequestWorkers设置了同时连入的clients最大总数,若是现有子进程中的线程总数不能知足负载,控制进程将派生新的子进程。MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250.这两个参数对Apache的性能影响并不大,能够按照实际状况相应调节
② ThreadsPerChild是worker MPM 中与性能相关最密切的指令,ThreadsPerChild的最大缺省值是64,若是负载较大,64位也是不够的,这时要使用ThreadLimit指令,他的最大缺省值是20000
③Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。若是负载很大,现有的子进程数不能知足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也须要显示声明ServerLimit。须要注意的是,若是显示声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxRequestWorkers,并且MaxRequestWorkers必须是ThreadsPerChild的整数倍,不然Apache将会自动调节到一个相应值。
④进程与线程的区别(线程是指进程内的一个执行单元,也是进程内的可调度实体)
a、地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有本身独立的地址空间
b、资源拥有:进程是资源分配和拥有的单位,同一进程内的线程共享进程的资源
c、线程是处理器调度的基本单位,但进程不是
d、两者都可并发执行:进程和线程都是由操做 系统所体会的程序运行的基本单元, 系统利用该基本单元实现系统对应用的并发性
e、简单来讲,就是一个程序至少有一个进程,一个进程至少有一个线程
线程的划分尺度小于进程,使得多线程程序的并发性高
进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率
三、Event模式
这是Apache最新的工做模式,是worker模式的变种,它把服务进程从链接中分离出来,worker模式不一样的是在于它解决了,keep-alive长链接的时候占用线程资源被浪费的问题,在event工做模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又容许它释放。这加强了在高并发场景下的请求处理。event模式不能很好的支持https的访问