Netty线程模型和其他WebServer的比较
大家都知晓的是 Netty比其他Server相对性能好,可定制化高. 那具体区别在哪里。
详细探讨下,上一篇详细讲了Netty的线程模型.
一、Netty线程模型.
一个boss线程、32(核数2倍)个work线程.
下面看看其他WebSever的线程模型.
二、webmvc
常见的 spring-webmvc. (用于 后端API、graphqlServer)
1 | <dependency> |
1. tomcat线程
NioEndpoint组件. Tomcat的NioEndpoint实现了I/O多路复用模型。
- 创建一个Selector, 在其上注册 事件,等待感兴趣的事件发生.
- 发生后(比如可读),就创建一个新的线程从Channel读数据.
NioEndpoint包含LimitLatch、Acceptor、Poller、SocketProcessor和Executor共5个组件。
LimitLatch
连接控制器,控制最大连接数,NIO模式下默认8192.
Acceptor
Acceptor实现了Runnable接口,因此可以跑在单独线程里,在死循环里调用accept接受新连接,
一旦有新连接请求到达,accept方法返回一个Channel对象,接着把Channel对象交给Poller去处理.
Poller
本质上是一个Selector,跑在单独线程里。
Poller在内部维护一个Channel数组,它在一个死循环里不断检测Channel的数据就绪状态,一旦有Channel可读,就生成一个SocketProcessor任务对象扔给Executor去处理。
Tomcat的高并发设计
NioEndpoint完成的三件事: 接受连接、检测IO事件和处理请求,关键是把这三件事情分布定制线程数处理:
- 专门的线程组去跑Acceptor,并且Acceptor的个数可以配置
- 专门的线程组去跑Poller,Poller的个数也可以配置
- 具体任务的执行也由专门的线程池来处理,也可以配置线程池的大小
2. 实际线程情况
下面是实际的线程情况:
Catalina-utility(2个)[TIMED_WAITING][ at sun.misc.Unsafe.park(Native Method)]
container-0(1个)[TIMED_WAITING][at java.lang.Thread.sleep(Native Method)]
Live Reload Server(1)[RUNNABLE][at java.net.PlainSocketImpl.socketAccept(Native Method)]
http-nio-8869-BlockPoller(1)[RUNNABLE][at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)]
http-nio-8869-ClientPoller(1)[RUNNABLE][at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)]
http-nio-8869-Acceptor(1)[RUNNABLE][at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)]
http-nio-8869-exec-213(10)[WAITING][at sun.misc.Unsafe.park(Native Method)]
解释:
3. tomcat线程和netty线程对比【重点】
三、webflux
1 | <dependency> |