記一次JAVA程序導緻Kubernetes節點CPU飙高的排查與解決
一、發現問題
在一次系統上線後,我們發現某幾個節點在長時間運作後會出現CPU持續飙升的問題,導緻的結果就是Kubernetes叢集的這個節點會把所在的Pod進行驅逐(排程);如果排程到同樣問題的節點上,也會出現Pod一直起不來的問題。我們嘗試了殺死Pod後手動排程的辦法(label),當然也可以排除排程節點。但是在一段時間後還會複現,我們通過監控系統也排查了這段時間的流量情況,但應該和CPU持續占用沒有關聯,這時我們意識到這可能是程式的問題。
二、排查問題
定位Pod
這裡使用kubectl top pods 指令确定CPU占用最高的pods都是哪些。
kubectl -n app top pods
因為問題已解決,以上圖檔隻是舉個例子。
排查工具
Arthas
我們這邊使用了阿裡的Arthas ,它是Alibaba開源的Java診斷工具。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?
我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法線上上 debug,難道隻能通過加日志再重新釋出嗎?
線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重制!
是否有一個全局視角來檢視系統的運作狀況?
有什麼辦法可以監控到JVM的實時運作狀态?
怎麼快速定位應用的熱點,生成火焰圖?
排查問題
定位到有問題的Pod後,使用kubectl exec進入Pod容器内部:
kubectl -n app exec -it 49a89b2f-73c6-40ac-b6de-c6d0e47ace64-5d489d9c48qwc7t -- /bin/bash
在容器中下載下傳Arthas
wget
https://arthas.gitee.io/arthas-boot.jar由于我們打包鏡像中隻有一個服務,是以一個Pod中也隻有一個程序; 這裡 1 是指PID。
java -jar arthas-boot.jar 1
執行程序看闆 dashboard:
[arthas@1]$ dashboard
這裡上半區顯示了線程内容,我們可以看到哪個線程ID的對應情況:
比如從上面得到了線程ID,使用如下指令進入線程,如ID 12262:
[arthas@1]$ thread -n 12262
列印出線程日志:
"com.alibaba.nacos.client.Worker.addr-bj-internal.edas.aliyun.com-7362814c-538b-4c26-aa07-1fd47765a145" Id=20190 cpuUsage=7% TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@d30d0a4e (in native)
at sun.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@d30d0a4e
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(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)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:813)
三、解決問題
經過了排查定位到了問題,最後經過社群和阿裡雲夥伴的協助,發現了這個是Nacos 2.0.0.RELEASE的一個BUG。我們對Nacos用戶端版本進行了更新,經過測試後,問題解決了。也加深了對Kubernetes叢集調試的能力 [加油]。
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.0.1.RELEASE</version>
四、最後
通過社群和阿裡雲的幫助,問題成功解決。在工具方面,阿裡提供的Arthas,真的是線上環境調試神器!
原文位址
https://www.cnblogs.com/maxzhang1985/p/12673160.html