apache的工作模式--prefork和event模式

虽然项目中在使用apache服务器,但是都是配了能用或简单调整下参数以便能够接受高并发,并没有认真深入了解;再加上最近apache使用mpm_event模式,发现占用cpu很高,刚开始还以为是apache,php配置的问题,后来修改了下event参数才恢复正常。

下面我们就先来介绍下常用的prefork和event模式吧

1.prefork

一个非线程的,预派生的模块,这意味着prefork会使用多个子进程,每个子进程只有一个线程来接受请求;每个进程只能处理一个http链接,直到这个链接被释放。

 

?
1
2
3
4
5
6
7
8
<IfModule mpm_prefork_module>
ServerLimit   20000
StartServers   5
MinSpareServers   5
MaxSpareServers   10
MaxClients   1000
MaxRequestsPerChild 0
</IfModule>
StartServers 5

 

apache在启动后建立的子进程数,prefork默认为5

MinSpareServers 5

最小空闲进程数,默认为5。当空闲子进程数小于5时,那么apache将会立刻生成新的子进程。

MaxSpareServers 10

最大空闲进程数,默认为10。当空闲子进程数超过10时,那么父进程会杀死多余的子进程,当我们的网站负载过大,可以适当加大MinSpareServers和MaxSpareServers

MaxClients 1000

apache所能接受的http请求数。当请求超过1000时,多余的请求会进入请求队列,直到前面的请求处理完。当我们的服务器剩余资源很多但访问很慢时,我们就要看看这个参数是不是设置太低。当然Maxclients默认值为256,当要增大此值时,也要增加serverlimit,但是serverlimit最大为20000。

apache2.3.1以后的版本MaxClients称为MaxRequestWorkers

MaxRequestPerChild 1000

每个子进程所能接受的最大请求数,当超过1000时会自动销毁,0表示子进程永不销毁,虽然能够接受更多的请求,但可能会造成内存泄漏。

2.event

prefork和mpm方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,

这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击

率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻

服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。

event和work有相同之处,都是通过线程来处理请求;一个父进程建立多个子进程,而子进程又会建立多个线程。

 

?
1
2
3
4
5
6
7
8
9
<IfModule mpm_event_module>
     ServerLimit         1000
     StartServers         20
     MinSpareThreads        25
     MaxSpareThreads      1200
     ThreadsPerChild      50
     MaxRequestWorkers    2000
     MaxConnectionsPerChild  1000
</IfModule>
StartServers 20

 

apache启动后建立20个子进程,由于默认的Serverlimit 为16,当我们StartServers大于16时,会报错“changing ServerLimit to 1000 from original value of 16 not allowed

during restart”,但是我们可以通过Serverlimit来重新设置,不过需要先停止apache服务再启动,直接restart无效。

MinSpareThreads 25

最小空闲线程数

 

MaxSpareThreads 1200

最大空闲线程数,这里要注意这个值必须要大于StartServers*ThreadsPerChild=20*50=1000,如若我们MaxSpareThreads 800,小于1000,则

StartServers-MaxSpareThreads/50=4,则有4个进程会被杀掉,我们可以通过top查看,restart后会生成多个进程,当过一会多余的进程会被kill掉

ThreadsPerChild 50

每个进程可以生成50个线程,这里要注意的是默认的ThreadLimit为64,当我们ThreadsPerChild大于64时,会报错“ThreadsPerChild of 500 exceeds ThreadLimit of 64,

decreasing to match”,但是我们可以通过ThreadLimit来重新设置,不过需要先停止apache服务再启动,直接restart无效。

MaxRequestWorkers 2000

最大数量的工作线程,等于ServerLimit*ThreadPerChild,如果按照默认的ServerLimit=16的话,2000>16*50,日志中会报错“MaxRequestWorkers of 1000 would require 20

servers and exceed ServerLimit of 16, decreasing to 800”,这时我们需要通过修改ServerLimit,需要先停止apache服务再启动,直接restart无效。

MaxConnectionsPerChild 1000

每个进程所能建立的最大连接数


ps:由于prefork和event是我们常用到的,我就按照自己平时遇到过的问题把参数重新了解了,看来还是基本功不扎实啊。

对了,我们可以通过以上命令来查看httpd到底用了什么模式:

 

?
1
2
3
4
5
6
[root @usvr157 apache]$ /usr/local/apache/bin/httpd -l
Compiled in modules:
   core.c
   mod_so.c
   http_core.c
   event.c

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值