LAMP环境调优apache调优 preforkworker运行模式介绍

–>

实验的环境

LAMP环境:
操作系统: centos7.4
apache版本:httpd-2.4.10
PHP版本: php5.6.32
源码包存放位置:/usr/src
源码包编译安装位置:
apache: /usr/local/apache/
php:/server/php-5.4
mysql:/server/mysql-5.5/

apache运行模式-prefork-worker运行模式介绍

apache不同运行模式调优

Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。
Prefork:进程模式
worker:线程模式
Event : 事件模式(2.4版本后开始稳定)

prefork运行模式详解

一:Prefork MPM : Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
最重要的是将MaxRequestWorkers设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
注: Prefork 是基于多进程的模式。
优点:因为每个进程使用独立的内存空间,所以比较安全。一个进程坏了,不会影响其他进程。
缺点:占用的内存比较大。

二:Worker MPM : 和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。

注: Worker MPM
优点:可以处理海量请求,而系统资源的开销小。原因:一个进程中包括多个线程。多个线程之间可以共享内存,所以占用的内存资源比较少。如图:
缺点:不太安全。如果一个线程坏了。 整个进程都要坏了。另外存在keep-alive长连接占用资源时间过长
如何避免进程中某个线程坏了? 一个进程中所有线程完成一定数量的请求后,自动关闭,再重打开。就可以避免内存溢出等问题。 就像一个电脑开机时间长了,会卡,需要重启一下。
进程包括线程的。 一个进程可以有一个或多个线程。

总结: 不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
这就是:预先派生进程或线程

三:Event MPM:event模式是在2.4版本中才稳定发布的模式。这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
当某个连接没有请求时,会主动关闭连接,在work模式下,必须等keep-alive超时,才可以释放。

在configure配置编译参数的时候,可以使用 –with- mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:–enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM

Apache prefork调优

案例场景: 当用户访问网站时,在客户端浏览器输入网址后长时间无响应,而一旦连接上之后,页面很快就打开了(因为配置了持久连接)。
排查:
登录上linux服务器后,使用netstat观察最大连接数稳定在257,查看apache配置文件中,prefork模式中,MaxRequestWorkers为 257, 这因为apache连接数明显不够用。
先查看apache的运行模式

查看命令:
[[email protected] ~]# /usr/local/apache/bin/httpd -M | grep event
mpm_event_module (shared) #看到这个,说明是prefork多进程模式
注:查看模块:
httpd -l //查看MPM模块
httpd -M //查看DSO模块,由于mod_mpm_event.so,mod_mpm_prefork.so,mod_mpm_worker.so,此三个模块被做成DSO模块,所以使用httpd -M查看
或:
[[email protected] src]# /usr/local/apache/bin/httpd -V
Server MPM: event

注:如果使用rpm安装的httpd,直接执行:
[[email protected] ~]# httpd -M |grep prefork
mpm_prefork_module (shared)
[[email protected] ~]# rpm -qf which httpd #httpd命令是apache服务器软件包安装的
httpd-2.4.10-15.el7.x86_64
总结:
RHEL6/7系统自带的apache默认采用的是prefork进程模型;在编译apache源码时,如果不用–with-mpm显式指定某种MPM,prefork就是缺省的MPM
httpd2.4 新特性
1)MPM支持在运行时装载
指定启用:
–enable-mpms-shared=all –with-mpm=event //把所有支持的MPM都编译进来,但启用默认的是event
2) 支持event
3)异步读写
4) 在每模块及每目录上指定日志级别
5)每请求配置:
6) 增强版的表达式分析器
7) 毫秒级的keepalive timeout ,使用ms指定为毫秒
8)支持主机名的虚拟主机不在需要NameVirtualHost指令
9) 支持使用自定义变量
新增一些模块:mod_proxy_fcgi(基于fcgi方式调用执行环境)
mod_ratelimit(用于做速率限定)
mod_request(对请求方法做限定)
mod_remoteip(对远端IP做限定)
对于基于IP的访问做了修改,不在使用order,allow,deny这些机制;而是统一使用require进行
调整MPM模块则直接修改主配置文件中的LoadModule指定即可
#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

对prefork模式进行优化。 修改apache 的httpd-mpm.conf 配置

[[email protected] ~]# vim /etc/httpd/httpd.conf
改:449 #Include conf/extra/httpd-mpm.conf
为:Include conf/extra/httpd-mpm.conf
[[email protected] ~]# vim /etc/httpd/extra/httpd-mpm.conf #第一次打开的时候默认配置是这样的
改:
28
29 StartServers 5
30 MinSpareServers 5
31 MaxSpareServers 10
32 MaxRequestWorkers 250
33 MaxRequestsPerChild 0
34
注:spare[英][speə®] 备用
为:

ServerLimit 3000
StartServers 50
MinSpareServers 50
MaxSpareServers 100
MaxRequestWorkers 3000
MaxRequestsPerChild 1000

[[email protected] ~]#systemctl restart httpd #重启服务
刚才配置文件中参数详解:
ServerLimit 是最大的进程数
MaxRequestWorkers 是最大的请求并发。
注:所以他们的关系是MaxRequestWorkers=ServerLimit* 进程的线程数。因为,在prefork模式下一个进程只有一个线程,并且一个进程对应一个连接。所以这里配置成:MaxRequestWorkers=ServerLimit,MaxRequestWorkers不得大于ServerLimit参数。

如果做5000并发的web,需要多少内存? 5000* 2M/0.8/1024(转G)=12.2G 。 服务器大概需要14G -16G 内存。
ServerLimit的大小,取决于你系统的资源,每个apache进程默认大约占用2M内存,基本可以按照这个公式来计算:最大内存* 80% / 2M = ServerLimit。
注:一个apache进程实际使用内存大小和处理的请求数有关。即和MaxRequestsPerChild 这个值有关。(MaxRequestsPerChild,每个子进程在其生存期内允许处理的最大请求数量)。

StartServers 50 启动时默认启动的 进程数

这个参数默认是5,因为apache会通过自动启动新进程来增加响应服务的进程数,这个值不做调整的也是可以的,会由默认的5增加到满足服务的进程数,但是会出现开始启动后,突然后有大并发访问时,因为进程数太小,出现卡住的现象
例:查看进程数:
[[email protected] ~]# ps -axu | grep httpd | wc -l
Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.8/FAQ
52

MinSpareServers 55 最小空闲进程

Spare :[speə®] 备用
MinSpareServers指令设置空闲子进程的最小数量。
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。如此按指数级增加创建的进程数,最多达到每秒32个,直到满足
MinSpareServers设置的值为止;这就是预派生(prefork)的由来;这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能

MaxSpareServers 100 最大空闲进程

MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。

可以调整MinSpareServers 和MaxSpareServers这两个参数,但是这两个参数的值不能设得太大,否则apache进程太多,会导致内存占用太多。
设置了这个值的好处是不会有太多的空闲的进程在消耗资源,关闭空闲apache进程的同时,会释放内存,从而减少系统资源消耗。

MaxRequestsPerChild 1000

MaxRequestsPerChild指令设置每个子进程在其生存期内允许处理的最大请求数量。到MaxRequestsPerChild的限制后,子进程将会结束。如MaxRequestsPerChild为”0″,子进程将永远不会结束。
将MaxRequestsPerChild设置成非零值有两个好处:

  • 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
  • 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
    注:当KeepAlive 为On, 开启长链接时,发送的请求,在MaxRequestsPerChild里面只算一个,不管这个连接发送了多少个请求。
    注意:对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。
    也就是说实际上这个时候子进程最大连接数=MaxRequestsPerChild* MaxKeepAliveRequests
    例:
    MaxRequestsPerChild 1000
    MaxKeepAliveRequests 200 #一个长连接可以处理请求数为200
    每子进程最大连接数=1000* 200=20万次请求。 注:这个进程处理的数量太大了。
    改为:
    MaxRequestsPerChild 100
    MaxKeepAliveRequests 20 #一个长连接可以处理请求数为20
    每子进程最大连接数=100* 20=2千次请求。
    注:所以在开启KeepAlive后,需要同时设置MaxRequestsPerChild和MaxKeepAliveRequests,确保每个apache进程在服务一定请求数后会关闭,重新开启新的子进程,避免apache进程异常导致的内存泄露和资源占用。
如何跟据硬件来配置连接数?

连接数理论上是越大越好,但是得根据硬件,服务器的CPU,内存,带宽等因素,查看当前的apache连接数
[[email protected] ~]# ps -aux | grep httpd | wc -l
52 注:总进程数为52-2
[[email protected] ~]# ps -axu | grep http | awk ‘{print $6}’ #单位是K,现在一个使用1.6M左右

如何设置最大链接数:

计算后要减去服务器系统本身所需要的资源。比如内存2G,减去500M留给服务器,还有1.5G,那么可得到最大连接数:1500/1.6=930左右。
根据情况修改后的http-mpm.conf的prefork的配置后为:

StartServers 50
MinSpareServers 50
MaxSpareServers 100
ServerLimit 1000
MaxRequestWorkers 1000
MaxRequestsPerChild 100

注:这里重点介绍下ServerLimit,必须放到MaxRequestWorkers前,值要等于MaxRequestWorkers。
重启apache,再打开网站看看是否还会有慢的问题了。
[[email protected] ~]# systemctl restart httpd
测试:
动态观察apache的最大连接数:
[[email protected] ~]# watch -n 1 “pgrep httpd|wc -l”
Every 1.0s: pgrep httpd|wc -l Wed Sep 2 15:24:08 2015
51 #有51个进程

生产环境配置实例1:物理是内存4G

StartServers 20
MinSpareServers 20
MaxSpareServers 30
ServerLimit 2000
MaxRequestWorkers 2000
MaxRequestsPerChild 5000 #没有开keepalive是5000,如果开启keepalive就配置成500

apache worker模拟性能优化

Apache2.0的性能方面的改进最明显的变化就在于worker;
优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。
缺点:假如一个线程崩溃,整个进程就会连同其他任何线程一起“死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。
[[email protected] ~]# /usr/local/apache/bin/httpd -M |grep worker //查看是否使用worker模块,没有输出,则说明没有使用
[[email protected] ~]# ls /usr/local/apache/modules/* |grep worker //查模块目录,模块已存在
/usr/local/apache/modules/mod_mpm_worker.so
[[email protected] ~]# vim /etc/httpd/httpd.conf //修改apache配置文件
#LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so //只开启worker项,如此项没有,则手动添加即可

[[email protected] ~]# systemctl restart httpd //重启apache
[[email protected] ~]# vim /etc/httpd/extra/httpd-mpm.conf
改:

StartServers 2
MaxRequestWorkers 150000
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

[[email protected] ~]# systemctl restart httpd //重启apache
配置参数说明:

StartServers 2 #最初建立的子进程
MaxRequestWorkers 150000 # MaxRequestWorkers,apache同时最多能支持150000个并发访问,超过的要进入队列等待,其大小由ServerLimit和ThreadsPerChild的乘积决定。这个150000指的是所有子进程中的线程总数。一般要把这个值配置的大一些
MinSpareThreads 25 #基于整个服务器监视的最小空闲线程数,如果空闲的线程小于设定值,apache会自动建立线程,如果服务器负载大的话,可以考虑加大此参考值。
MaxSpareThreads 75 #基于整个服务器监视的最大空闲线程数,如果空闲的线程大于设定值,apache会自动kill掉多余的线程,如果服务器负载大的话,可以考虑加大此参考值。
ThreadsPerChild 25 #每个子进程包含固定的线程数,此参数在worker模式中,是影响最大的参数,ThreadsPerChild的最大缺省值是64,如果负载较大,64是不够的.
MaxRequestsPerChild 0 #每个子进程可以支持的请求数,这要设置为0,因为一个进程关闭,所有的线程也都关了。

常用配置参考:
生产环境配置实例:

StartServers 5
MaxRequestWorkers 9600
ServerLimit 64
MinSpareThreads 25
MaxSpareThreads 500
ThreadLimit 200
ThreadsPerChild 150
MaxRequestsPerChild 0

此服务器配置: 最多进程数:64个; 最多线程数(最大并发数) 64* 150=9600 ;不可能超过64 * 200=12800

event模式

 
StartServers 3 
MinSpareThreads 75 
MaxSpareThreads 250 
ThreadsPerChild 25 
MaxRequestWorkers 400 
MaxConnectionsPerChild 1000 

本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章