深入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事件,若是数据读事件,则读取请求数据,

apache2.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 , 该指令可以指定工作线程的堆栈,避免线程过多而耗尽内存.

 

 

 

 

你可能感兴趣的:(Linux)