0
点赞
收藏
分享

微信扫一扫

眼见为实:被误导的Tomcat工作原理

Tomcat的主要工作是监听用户通过浏览器发送的网络请求然后把请求连接上你的应用程序做信息交换在这个过程中Tomcat里有acceptorpoller、 exec等等这些线程在做这个工作。​

不过网上很多朋友都认为poller是Tomcat里做socket请求数据读写的线程但是事实真的是这样吗

眼见为实:被误导的Tomcat工作原理_java


眼见为实:被误导的Tomcat工作原理_原理_02


眼见为实:被误导的Tomcat工作原理_tomcat_03


以往Tomcat的工作就像一个黑盒子一样被封装好在底层架构里,我们看不到本次我们借助了kindling摄像头工具做了个实验大家看到每个请求过来之后所有工作线程的执行实况以此来确认poller是不是做socket的读写的

首先我们简单回顾一下Tomcat的工作流程它有两大核心组件connector和container,​其中container装着你的应用程序代码打个比方如果这是剧本杀用户是玩家你的程序代码是通关宝藏那connector就是NPC


眼见为实:被误导的Tomcat工作原理_ebpf_04


但是实际上真正的网络请求要远比剧本杀复杂的多所以Tomcat也设计了线程池​来应对大量的并发情况现在我们再来明确文章一开始提出的疑问poller线程到底是不是Tomcat里执行socket的读写的线程下图是我用kindling的摄像头工具捕捉记录了一次请求的执行情况

眼见为实:被误导的Tomcat工作原理_原理_05


眼见为实:被误导的Tomcat工作原理_java_06

大家可以先快速通过上面两张图稍微理解一下这个工具怎么用交代一下设置的实验场景一共做了5个并发请求每次相隔100ms发出请求的实现代码是sleep(1000)ms配置的Tomcat最大的线程数是3。所以这也是一个资源饥饿的场景并发数有5可是线程只有3我们一会也可以看看Tomcat是怎么应对的我这里用工具捕捉的是第一个请求的执行记录

眼见为实:被误导的Tomcat工作原理_原理_07


眼见为实:被误导的Tomcat工作原理_原理_08


我们可以从上面两张图看到本次请求最开始是由acceptor先做cpu-on建立socket连接然后把连接事件交给poller管理大家注意看poller执行的时间戳是.319,而acceptor是318,所以poller 一定实在acceptor之后才开始执行的

之后请求事件被交由Tomcat的线程池分配线程exec-1来执行也就是图中黑线那段futex代表该线程夯住或者说在等待的确因为我的实现代码写的就是“sleep(1000)ms

眼见为实:被误导的Tomcat工作原理_tomcat_09


如上图所示我们可以看到请求流的读写是由执行线程exec-1来做的netRead即网路流的读写同理请求报文的会写也是由exec-1来做的如下图所示。(这里有两个netwrite是因为报文可能太大写了两次第三个netread是exec-1执行下一个请求的事件因为时间相差太小几乎重叠了

眼见为实:被误导的Tomcat工作原理_ebpf_10


至此我们可以明确开始提出的疑问了Tomcat里对于请求流的读写不是由poller线程而是由exec执行线程来做的

我们再继续看,5个并发请求Tomcat只有3个线程它会怎么应对


眼见为实:被误导的Tomcat工作原理_tomcat_11


如上图所示等了大概100ms左右我的第2个请求进来了Tomcat线程池分配给了exec-3来执行同理第三个请求分配给了exec-2来执行

不过第4、5个请求情况就不一样了如下图所示4、5个请求从客户端发出请求acceptor建立好连接poller做好请求事件管理之后等待了一段时间它们才被exec线程执行因为此时Tomcat没有多余的线程了它们需要等待有exec线程空下来才能被执行

眼见为实:被误导的Tomcat工作原理_ebpf_12


这里反映一种什么现象对于客户端来说我前3个请求很正常可是第4、5个请求是有一点慢的它在等待了一段时间之后才开始执行不过对于服务端来说的响应时间没有任何问题因为服务端的响应时间不是从建立连接开始而是从exec线程真正处理这个请求开始计算的

这也是我们生产环境上常见但是由十分难以排查的资源饥饿的问题因为从表面上你很难发现症结但是如果你懂一些Tomcat的原理再加上kindling摄像头工具的辅助定位起来是不是就容易很多了

眼见为实:被误导的Tomcat工作原理_ebpf_13

眼见为实:被误导的Tomcat工作原理_java_14


眼见为实:被误导的Tomcat工作原理_原理_15


本次分享暂时到这里了希望能给大家带来一些收获也许有些同学也有了更多疑问需要被解答那就请继续关注我们或者扫描二维码联系我们谢谢大家


举报

相关推荐

0 条评论