还记得有一次,JAVA进程导致库伯内特节点CPU飙升并解决了它吗

还记得有一次,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