Tomcat 性能优化__4大通道原理
一. NIO 通道工作原理
Acceptor(tomcat9版本独立出来了)>> PollerEvent >> Poller(相当于是reactor) >> Worker(exec即SocketProcessor)
1)、Acceptor线程将socketchannel取出, 传递给Poller线程(会产生线程阻塞,因此包装成PollEvent加入缓存队列)。
2)、Poller线程执行的就是NIO的selectkey,拿到通道中感兴趣的事件,轮询获取,然后将感兴趣的selectkey和keyattachment传递给工作线程池进行处理。 3)、工作线程池调用http11ConnectionHandler进行http协议的解析,然后将解析出来的内容包装成Request,Reponse对象,传递给分界点CoyoteAdapter,最终执行到业务中。
二. BIO 通道工作原理
BIO的流程基本上和NIO通道一样,BIO的结构因为缺少了selector和轮询,相比NIO少了一部分的内容,整体上就是使用的ServerSocket来进行通信的,一线程一请求的模式,代码看起来清晰易懂。但是,由于BIO的模型比较落后,在大多数的场景下,不如NIO,而现在Tomcat新版本也是NIO是默认的配置,8.5版本之后完全抛弃了BIO通道。
三. NIO2 通道工作原理
- bio,nio都是由用户态发起数据拷贝(read操作),而nio2(aio)则是由操作系统发起数据拷贝,所有的io操作都是由操作系统主动完成。所以io操作和用户业务逻辑的执行都是异步化的。
- NIO2通道相比NIO效率高,因为proactor模式本来就比reactor模式要好,另外还省去了Poller线程,但由于多路事件分离器是内核提供的,不同内核提供的多路事件分离器的事件处理效率不一,对NIO2的通道需要基于实际环境和场景压测才能得出最终的结论
四. APR 通道工作原理
APR通道只有很小的一部分是java,大部分的源码都是C的,而且和操作系统的环境有着密切的关系,不同操作系统定制的接口不同,性能特色也不同。