解决部署在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的资源