注册
登录

您现在的位置是:首页 > 学无止境

Apache性能优化之MPM选择和配置

木木彡82 2018-05-10 21:53:44 29人围观
转载自:https://blog.csdn.net/ccscu/article/details/70182476https://blog.csdn.net/MrCoders/article/details/54911202截止到目前最新的Apache2.4.25,Apache总共支持三种MPM(多...

转载自:https://blog.csdn.net/ccscu/article/details/70182476

https://blog.csdn.net/MrCoders/article/details/54911202

截止到目前最新的Apache2.4.25,Apache总共支持三种MPM(多进程处理模块)模式,分别是Prefork、worker及event。这三种模式代表了Apache的演变和发展。

Apache2.2中,默认启用prefork模式,同时引进了实验性质的event模式;

Apache2.4中,正式支持并且默认使用了event模式。并且可以在编译的时候增加了选项enable-mpms-shared来编译MPM并在编译后可以动态加载。

可以通过apachectl -V查看当前Apache的工作模式,比如在Apache2.2.31上查看:

[plain] view plain copy
  1. Server version: Apache/2.2.31 (Unix)  
  2. Server built:   Dec 25 2016 07:02:07  
  3. Server's Module Magic Number: 20051115:40  
  4. Server loaded:  APR 1.5.2, APR-Util 1.5.4  
  5. Compiled using: APR 1.5.2, APR-Util 1.5.4  
  6. Architecture:   64-bit  
  7. Server MPM:     Prefork  
  8.   threaded:     no  
  9.     forked:     yes (variable process count)  
在Apache2.4.25上查看:

[plain] view plain copy
  1. $ /usr/local/apache24/bin/httpd -V  
  2. Server version: Apache/2.4.18 (Unix)  
  3. Server built:   Feb 18 2016 02:28:26  
  4. Server's Module Magic Number: 20120211:52  
  5. Server loaded:  APR 1.5.2, APR-UTIL 1.5.4  
  6. Compiled using: APR 1.5.2, APR-UTIL 1.5.4  
  7. Architecture:   64-bit  
  8. Server MPM:     event  
  9.   threaded:     yes (fixed thread count)  
  10.     forked:     yes (variable process count)  

一、Prefork MPM

Prefork MPM实现了一个非线程、预派生的工作模式。它在Apache启动之初,就会预派生一些子进程,然后等待连接。可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程。它成熟稳定,可以兼容新老模块,也不需要担心线程安全问题。但是一个进程相对地占用更多的资源,消耗大量内存,不擅长处理高并发的场景。


[plain] view plain copy
  1. <IfModule mpm_prefork_module>  
  2.     StartServers          5  
  3.     MinSpareServers       5  
  4.     MaxSpareServers      10  
  5.     MaxClients          150  
  6.     MaxRequestsPerChild   0  
  7. </IfModule>  
MaxClients设定Apache可同时处理的请求数量,其对Apache性能的影响非常打。默认的150远远不能满足一般站点(ps -ef | grep httpd | wc -l),超过这个数量的请求需要排队,直到前面的请求处理完毕。如果我们发现系统资源还剩很多,但是HTTP访问却很缓慢,大多数时候增加这个值可以得到缓解。

这个值的计算公式可以参考:

apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2 ;

apache_max_process = apache_max_process_with_good_perfermance * 1.5 ;

其中httpd平均占用内存:

ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'

MaxRequestsPerChild这个值的含义是处理多少个请求后该进程自动销毁,默认值0意味着永不销毁。当负载较高时,为了使每个进程处理更多的请求,避免销毁、创建进程的开销,一般建议设置为0或较大的数字。但是也要注意可能会造成进程占用的内存不能得到释放,所以这个值不能设置得太大,也不能太小,大了会影响资源的释放,小了会导致Apache不断地fork进程。

建议值:1分钟pv(访问量)/MaxClients


二、worker MPM

与Prefork工作模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比进程更加轻量级,因为线程通常会共享父进程的内存地址的,因此内存占用会减少一些。

同时如果一个线程异常挂了,会导致父进程和它的其他正常子线程都挂了,这样也只会影响Apache的一部分,而不是整个服务。

缺点使必须考虑线程安全性,因为多个子进程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会被一直占据,也许中间没有任何请求,需要等到超时才会被释放。如果过多的线程被这样占据,也会导致在高并发下的无服务线程可用。


三、event MPM

和worker工作模式很像,最大的区别是解决了在keep-alive场景下,长期被占用的线程的资源浪费问题,在event MPM中,会有一个专门的线程来管理这些keep-alive线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放,这样增强了在高并发场景下的请求处理能力。

就使用PHP而言,fastCGI和php-fpm是更推荐的使用模式。

现在的最新浏览器,在单个域名下的连接数变得越来越多(通常都是使用keep-alive),主流浏览器是2-6个(还有继续增长趋势,为了加快页面的并发下载速度)。高并发场景,会越来越成为Web系统的一种常态。Apache很成熟,同时也背负了比较重的历史代码和模块,因此,在Web系统比较方面,Nginx在不少场景下,表现比起Apache更为出色。


文章评论

  • 登录后评论

点击排行