生产环境 SpringBoot Tomcat 线程卡住

2024-05-24 10:00:58 +08:00
 jmychou

生产环境使用 JDK8+SpringBoot2.x+SpringBoot 内嵌 tomcat9.x,

在 K8s Docker 环境部署,最近时有偶发的对方发起 HTTP 请求,这边隔了 2-10s 才会处理请求,网络抓包发现握手和响应请求报文 ACK 都很快,但是链路上看 Servlet 就是间隔了 2-10s 才进行处理

看了下当时的并发、资源情况和 GC 都很正常,由于是偶发的,本地也无法复现,所以想咨询各位大佬

2550 次点击
所在节点    程序员
22 条回复
defunct9
2024-05-24 10:04:49 +08:00
iptables 规则太多了?
javak
2024-05-24 10:13:10 +08:00
感觉是 k8s 的问题,我们相同版本的 jdk + springboot 。 但是没有用 k8s , 直接用的阿里云的 ecs, 没出现过这种问题。
Scarb
2024-05-24 10:17:31 +08:00
服务端负载很高吗?把抓包文件或者截图放上来看看
gzldc
2024-05-24 10:19:01 +08:00
@defunct9 哥们怎么哪都有你 老摸鱼怪呀
leeyuzhe
2024-05-24 11:01:38 +08:00
线程数满了?
cheng6563
2024-05-24 11:02:55 +08:00
看是不是 swap 了
justNoBody
2024-05-24 11:14:53 +08:00
> 最近时有偶发的对方发起 HTTP 请求,这边隔了 2-10s 才会处理请求

想问一下这里的隔了 2-10s 才会处理请求是通过什么方式确认的?是查看具体的 tomcat http 线程任务打印的日志么?

此外,能不能发一下 tomcat http 线程的配置以及实际的线程信息
cloud107202
2024-05-24 11:25:49 +08:00
极大概率是 DNS 解析导致的(遇到过走 ipv6 解析,5s timeout 后回落到 ipv4)。从请求发送端看看,尤其是用了 alpine 镜像的服务容器
2tongW
2024-05-24 11:35:16 +08:00
同意楼上的说法,之前我们也有个内网的服务器登录时耗时 10S+其他接口都没问题。最后排查原因是 InetAddress.getLocalHost().getHostName() 的问题。
参考:https://stackoverflow.com/questions/33289695/inetaddress-getlocalhost-slow-to-run-30-seconds
liuhailiang
2024-05-24 11:36:29 +08:00
加日志 逐步排查 提供个思路
增加请求 traceid 把请求日志串联起来,并返回给调用方
调用方给出耗时高的 traceid
你这边捞日志看耗时在哪里,当然最好是能接入 apm 系统,可以更直观看到耗时在哪
bthulu
2024-05-24 11:49:04 +08:00
看看是不是有人在接口里写了一句 thread.sleep
zed1018
2024-05-24 12:03:46 +08:00
想办法抓个火焰图看看
anyele
2024-05-24 13:29:50 +08:00
尽量别用 alpine 镜像
jmychou
2024-05-24 14:19:36 +08:00
@justNoBody #7 链路 trace 的 servet#service 方法以及过滤器打印的请求日志,这两个时间差不多, 并发不高,tomcat 线程没有满
jmychou
2024-05-24 14:20:45 +08:00
@cloud107202 #8 走的注册中心,直接拿 IP 访问的,不用 DNS 解析了吧
jmychou
2024-05-24 14:20:56 +08:00
@2tongW #9 走的注册中心,直接拿 IP 访问的,不用 DNS 解析了吧
jmychou
2024-05-24 14:21:59 +08:00
@liuhailiang #10 已经有 trace 了,但是只 trace 到 servet#service 这层,前面 tomcat nio 那一层暂时 trace 不到
jmychou
2024-05-24 14:22:30 +08:00
@anyele #13 用的麒麟
jmychou
2024-05-24 14:23:07 +08:00
@Scarb #3 负载并发不高
YCNQc647Cfngdp89
2024-05-24 15:29:23 +08:00
https://stackoverflow.com/questions/9882357/how-to-set-java-net-preferipv4stack-true-at-runtime
https://stackoverflow.com/questions/58991966/what-java-security-egd-option-is-for

我猜可能和这两个有关系,可以试一下;可以用 arthas trace 一下调用链路,看看耗时在哪儿

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1043470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX