虽然现在springboot微服务纵横都是用的jar包,但是还有很多使用的tomcat。tomcat是servlet的容器,也是springboot默认集成的容器,有必要对他的网络线程模型做一下了解。
![7b8971a9490da6a3b3a3eff5f92656a4.png](https://i-blog.csdnimg.cn/blog_migrate/a2df2ef0195531df0998304231266e56.jpeg)
(一) tomcat网络处理线程模型
- ① BIO同步Servlet
一个请求,一个工作线程,CPU利用率低,tomcat7以下才使用这种,新版本不再使用,tomcat8默认NIO
![47cc3a296933cf4a55d266c0e916ac6f.png](https://i-blog.csdnimg.cn/blog_migrate/958912f3986111159c7302d573dcdb20.jpeg)
- ② APR 异步Servlet
apr(Apache Portable Runtime/Apache可以执行运行库),Apache Http服务器的支持库。JINI的行还是调用Apache Http服务器的核心动态链接库来处理文件读取或者网络传输操作,tomcat 默认监听指定路径,如果有apr安全,则自动启用。
![68c20fe7f514982aa38de314104ad898.png](https://i-blog.csdnimg.cn/blog_migrate/fd09f4ac7d48c4d5bdbe9c17025672cd.jpeg)
- ③ NIO异步Servlet
tomcat8开始,默认NIO方式,非阻塞读取请求信息,非堵塞处理下一个请求,完全异步。
![80bacb910093e1b960e04122c9689fc8.png](https://i-blog.csdnimg.cn/blog_migrate/2a532af8d799a05c8fd38856cf7f7758.jpeg)
- ④ NIO处理流程
- Acceptor接收器接受套接字。
- 接收器从缓存中检索nioChannel对象。
- Pollerthread将nioChannel注册到它的选择器IO事件中。
- 轮询器将nioChannel分配给一个work线程来处理请求。
- SocketProcessor完成对请求的处理和返回客户端。
![9c9703c229c668a1c5943133878445c5.png](https://i-blog.csdnimg.cn/blog_migrate/71b40cf01052f39a473313b291148af5.jpeg)
- ⑤ 参数调优
不能靠经验猜测,需要不断调试,找出适应应用程序的合理配置。
- ConnectionTime ,默认 20s,适当调整减少时间。
- maxThreads处理连接的最大线程数,默认200,建议增大,但是不是越大越好的。
- acceptCount(backlog)等待接收accept的请求数量限制,默认100,建议增大,socket参数 min(accept,、proc/sys/net/core/omaxconn),如果acceptCount设置是100.操作系统设置的10,就按照10来,请求限制就是10。
- maxConnections最大连接处理器,默认 nio 1w,apr 8192, 建议不要调整。 </