解决部署在k8s上spring cloud gateway 无故假死的情况

解决部署在k8s上spring cloud gateway 无故假死的情况

线上发现gateway 会无故假死,测试环境使用jmeter 几分钟后,gateway 也会复现假死的情况

开始排查

获取容器列表

kubectl get pod -o wide 

进入gateway

kubectl exec -it gateway-7dbc5d8d6d-wtbs5 -- bash

将jdk拷贝进容器

kubectl cp /home/jdk8u402-b06 gateway-6896d59846-6r5sl:/home/

生成dump文件_dump文件生成和分析查看

查看进程id(容器没有ps 的情况)

ls -l /proc/*/exe

cat /proc/7/exe

制作dump
jstack
打印线程的栈信息,制作线程Dump。

jstack <进程ID> >> <输出文件>

jstack 2316 >> c:\thread.txt

Linux下使用Kill命令制作线程Dump,输出线程Dump到目标Java进程的标准输出

kill -quit <进程ID>

kill -3 <进程ID>

chmod +x jstack
./jstack 7 >> /home/thread.txt

jmap
使用jmap命令制作堆Dump

打印存活的对象大小和个数

jmap -histo:live

jmap -histo:live 64421 > live.log

chmod +x jmap

./jmap -dump:file=gateway.hprof,format=b 7
./jmap -histo:live 7 > /home/live.log

二进制方式存储堆文件

jmap -dump:format=b,file=文件名.hprof <进程ID>

以二进制方式生成文件/opt/wkt/wkt1.hprof,进程PID=64421

jmap -dump:format=b,file=/opt/wkt/wkt1.hprof 64421

./jmap -dump:file=gateway.hprof,format=b 7

将dump拷贝出来

kubectl cp gateway-6896d59846-6r5sl:/home/thread.txt ./thread.txt
kubectl cp gateway-6896d59846-6r5sl:/home/live.log ./live.log
kubectl cp gateway-6896d59846-6r5sl:/home/jdk8u402-b06/bin/gateway.hprof ./gateway.hprof

gzip gateway.hprof

将文件拷贝到本地电脑

问题分析



http-nio 线程有200个

打开 visualvm

点击 load 加载 gateway.hprof 文件

可能是发现问题, 搜索 java.lang.Thread.State: WAITING (parking)

https://www.jianshu.com/p/c4a75ca20abe

看本地代码

找下原因
https://www.alibabacloud.com/help/en/redis/use-cases/jedispool-optimization

默认是永不超时

结论

配置后,设置了超时时间,不至于所有线程都等待,而耗光app的资源

posted @ 2024-03-19 16:59  Pursue`  阅读(169)  评论(0编辑  收藏  举报