还记得有一次,JAVA进程导致库伯内特节点CPU飙升并解决了它吗
I .发现问题
系统上线一次后,我们发现有些节点在长时间运行后会出现CPU持续飙升的问题。因此,库本内特斯集群的这个节点将驱逐(调度)它所在的吊舱。如果它被分派到有相同问题的节点,还会有一个Pod无法一直启动的问题。我们在杀死Pod后尝试了手动调度方法(标签),当然,我们也可以排除调度节点。然而,它会在一段时间后再次出现。我们还通过监控系统检查了这段时间内的流量情况,但这不应该与持续的CPU占用有关。这时,我们意识到这可能是一个程序问题。
二、问题的调查
定位吊舱
这里使用kubectl top pods命令来确定哪个单元的CPU使用率最高。
kubectl -n应用程序顶部豆荚
既然问题已经解决,上面的图片只是一个例子。
筛选工具
阿尔塞斯
我们使用了来自阿里,的阿尔萨斯,这是阿里巴巴的开源Java诊断工具。当你无助时,阿尔萨斯可以帮助你解决以下类似的问题:
这个类是从哪个jar包加载的?你为什么要报告各种与班级相关的异常?
为什么我不执行我更改的代码?我没有承诺吗?错误的分支?
遇到问题时不能在线调试,只能通过添加日志重新发布吗?
在线用户的数据处理有问题,但是在线调试也是不可能的,并且不能离线复制!
系统健康有全局观吗?
有什么方法可以监控JVM的实时运行状态吗?
如何快速定位应用热点并生成火焰图?
解决问题
找到有问题的Pod后,使用kubectl exec进入Pod容器:
ku bectl-n app exec-it 49 a 89 b2f-73 c 6-40ac-B6 de-c6d 0e 47 ace 64-5d 489 d9 c 48 qwc7t-/bin/bash
下载容器中的阿尔萨斯
wget https://arthas.gitee.io/arthas-boot.jar
因为在我们打包的映像中只有一个服务,所以在一个Pod中只有一个进程。这里1指的是工艺管道仪表流程图。
java -jar arthas-boot.jar 1
执行流程仪表板:
[阿尔萨斯@1]$仪表板
这里的上半部分显示了线程的内容,我们可以看到哪个线程的对应情况标识:
例如,如果您从上面获得线程标识,请使用以下命令输入线程,如标识12262:
[阿尔塞斯@1]$ thread -n 12262
打印线路日志:
[阿尔塞斯@1]$ thread -n 12262
' com . Alibaba . nacos . client . worker . addr-bj-internal . edas . aliyun.com-7362814 c-538 b-4c 26-aa07-1fd 47765 a 145 ' Id=20190 CPUUSage=7% TIMED _ WAITING on Java . util . concurrent . locks . AbstractQueuedSynchronizer $ ConditionObject @ d30d 0a 4e(in native)
在阳光杂项不安全公园(本地方法)
-正在等待Java . util . concurrent . lock . AbstractQueuedSynchronizer $ ConditionObject @ d30d 0a 4e
在Java . util . concurrent . lock . LockSupport . ParkNano(LockSupport . Java :215)
at Java . util . concurrent . lock . AbstractQueuedSynchronizer $ ConditionObject . awaitNano(AbstractQueuedSynchronizer . Java :2078)
at Java . util . concurrent . scheduledthreadpoolexecutor $ delayedworkqueue . take(scheduledthreadpoolexecutor . Java :1093)
at Java . util . concurrent . scheduledthreadpoolexecutor $ delayedworkqueue . take(scheduledthreadpoolexecutor . Java :809)
at Java . util . concurrent . ThreadPoolExecutor . GetTask(ThreadPoolExecutor . Java :1074)
at Java . util . concurrent . ThreadPoolExecutor . RunWorker(ThreadPoolExecutor . Java :1134)
在Java . util . concurrent . ThreadPoolExecutor $ Worker . run(ThreadPoolExecutor . Java :624)
在java.lang.Thread.run(线程. java:813)
三。解决问题
经过调查,找到了问题所在,最后在社区和阿里云合作伙伴的帮助下,发现这是Nacos 2.0.0.RELEASE的一个BUG。我们升级了Nacos客户端版本,经过测试,问题解决了。这也加深了库伯内特集群的调试能力。
groupIdcom.alibaba.cloud/groupId
artifactidSpring-cloud-starter-Alibaba-nacos-discovery/artifactId
version2.0.1.RELEASE/version
最后
在社区和阿里云的帮助下,问题得以成功解决。就工具而言,阿里提供的阿尔萨斯实际上是一个在线环境调试工件!
吴秀玲www.com。cnblogs。http ://www . analog.com/maxzhang 1985/p/12673160。html
发表评论