深入Apache229Event模式续

   从2.2x开始,Apache使用了Event模式,在 Linux,使用Epoll+TCP 延迟触发事件的方式来提高服务器的高并发连接下的性能. Event模式是在原有的Worker模式基础上改进,因此Event模式的参数与Worker模式基本一致.

 

   每个进程启动一个单独的处理网络事件的线程,叫做listener_thread

他负责监控listen_fd和其他所有的已经建立连接的fd的事件,使用epoll监孔网络事件

当检测到listen_fd有读事件(client必须有数据发送)发生时,首先调用accept函数建立连接,然后触发工作线程去处理网络事件(一般情况下会执行HTTP请求)

工作线程平时是使用ap_queue队列处于等待状态的,由listen_thread线程触发(使用ap_queue_push触发),工作线程被激活后,调用process_socket处理socket事件,若是数据读事件,则读取请求数据,

apache 2.2.9 对连接做了特殊处理,只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)。可以使用Telnet进行测试验证:

       主机10.2.224.63为客户端机器;10.2.226.7apache服务器机器      

telnet 10.2.226.7 80

       然后在10.2.224.63客户端机器上使用netstat查看,发现连接已经建立,处于ESTABLISHED状态

       然后再到apache服务器上使用netstat查看,发现是处于SYN_RECV状态。

 

虽然该模式解决了KeepAlive问题,即连接数过多问题,但还是有点缺陷,就是若有人故意缓慢发送请求给Apache,还是会占用工作线程,因为当有连接上网络事件发送后,会交给一个单独的线程处理请求,若请求缓慢发送的话,工作线程就一直被占用了.

 

   另外Apache2.2.9版本引入了一条指定线程堆栈的指令 ThreadStackSize , 该指令可以指定工作线程的堆栈,避免线程过多而耗尽内存.

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值