欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Arthas排查Kubernetes中應用頻繁掛掉重啟異常

 更新時間:2022年02月28日 15:02:52   作者:kl  
這篇文章主要為大家介紹了Arthas排查Kubernetes中應用頻繁掛掉重啟的異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步

前言

其實最終定位到的問題還是蠻好解決的,但是因為應用在Kubernetes容器中的特殊性,導致在使用Arthas過程中出現了各種問題,所以單獨成文和大家分享下。照例先講下問題發(fā)生的背景,一個很老的web系統(tǒng)部署在tomcat容器里。近期打成了鏡像丟到了Kubernetes環(huán)境中運行,總是各種掛,在Kubernetes層面定位了很久沒找到具體問題,但是初步定位到是因為系統(tǒng)中的報表導出接口導致的問題,最后使用Arthas找到問題并解決。

Kubernetes容器的特殊性

首先說下,我們的Kubernetes容器中運行的應用都是基于自己構建的基礎鏡像打包的,如JDK,和tomcat基礎鏡像,為了減小打包后應用的體積,我們對JDK進行了大量的刪減,只保留了最小的jre運行時環(huán)境。這樣導致的后果是在應用出現問題需要使用jdk工具時,如jinfo、jmap、jstack等都沒了,沒了這些工具就相當于一個戰(zhàn)士沒了武器,束手無策了,但是最后忽然想到了Arthas,java線上排錯利器。

使用到的工具Arthas

Arthas是阿里巴巴開源的一款在線診斷java應用程序的工具,是greys工具的升級版本,深受開發(fā)者喜愛。當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

  • 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
  • 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  • 是否有一個全局視角來查看系統(tǒng)的運行狀況?
  • 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
  • Arthas采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

項目地址:https://github.com/alibaba/arthas

Arthas的使用

第一步:下載arthas-boot.jar

wget https://alibaba.github.io/arthas/arthas-boot.jar

第二步:運行

java -jar arthas-boot.jar

運行后,并沒有出現熟悉的java進程選擇界面,而是一閃而過,如下:

/opt/kl # java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.0
[INFO] Can not find java process. Try to pass <pid> in command line.
Please select an available pid.

按官方的說明文檔描述,假如出現了找不到pid的情況,在當前目錄下應該會輸出相關的log,但是我看了并沒有日志,那只能嘗試是否可以手動指定pid來使用Arthas了。在官網沒找到類似說明,只能試試java -jar arthas-boot.jar -help看下,輸出如下

/opt/kl # java -jar arthas-boot.jar -help
[INFO] arthas-boot version: 3.1.0
Usage: arthas-boot [-h] [--target-ip <value>] [--telnet-port <value>]
       [--http-port <value>] [--session-timeout <value>] [--arthas-home <value>]
       [--use-version <value>] [--repo-mirror <value>] [--versions] [--use-http]
       [--attach-only] [-c <value>] [-f <value>] [--height <value>] [--width
       <value>] [-v] [pid]

Bootstrap Arthas

EXAMPLES:
  java -jar arthas-boot.jar <pid>
  java -jar arthas-boot.jar --target-ip 0.0.0.0
  java -jar arthas-boot.jar --telnet-port 9999 --http-port -1
  java -jar arthas-boot.jar -c 'sysprop; thread' <pid>
  java -jar arthas-boot.jar -f batch.as <pid>
  java -jar arthas-boot.jar --use-version 3.0.5
  java -jar arthas-boot.jar --versions
  java -jar arthas-boot.jar --session-timeout 3600
  java -jar arthas-boot.jar --attach-only
  java -jar arthas-boot.jar --repo-mirror aliyun --use-http

EXAMPLES的第一條顯示出來了,直接在jar后面加上pid即可,執(zhí)行后,還是不行,輸出如下:

/opt/kl # java -jar arthas-boot.jar 1
[INFO] arthas-boot version: 3.1.0
[INFO] Start download arthas from remote server: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.0/arthas-packaging-3.1.0-bin.zip
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/3.1.0/arthas
[INFO] Try to attach process 1
Exception in thread "main" java.lang.IllegalArgumentException: Can not find tools.jar under java home: /usr/java/jdk/jre1.8.0_191, please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar
        at com.taobao.arthas.boot.ProcessUtils.findJavaHome(ProcessUtils.java:195)
        at com.taobao.arthas.boot.ProcessUtils.startArthasCore(ProcessUtils.java:206)
        at com.taobao.arthas.boot.Bootstrap.main(Bootstrap.java:441)

異常解析:

根據異??梢悦黠@看到說找不到tools.jar這個工具包了,還是回歸到Kubernetes容器環(huán)境中因為精簡了jre運行時環(huán)境導致jdk很多功能受限了。后面我做了一個非常規(guī)的事情,就是在完整的jdk中找到了這個tools.jar,丟到了jre里的lib目錄中,繼續(xù)嘗試,但是還有問題,如下:

/opt/kl # java -jar arthas-boot.jar 1
[INFO] arthas-boot version: 3.1.0
[INFO] arthas home: /root/.arthas/lib/3.1.0/arthas
[INFO] Try to attach process 1
[ERROR] Start arthas failed, exception stack trace:
java.lang.UnsatisfiedLinkError: no attach in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at sun.tools.attach.LinuxVirtualMachine.<clinit>(LinuxVirtualMachine.java:342)
        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
        at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:73)
        at com.taobao.arthas.core.Arthas.<init>(Arthas.java:26)
        at com.taobao.arthas.core.Arthas.main(Arthas.java:100)
[ERROR] attach fail, targetPid: 1

異常解析:

可以看到在補全了tools.jar之后,出現了新的異常信息java.lang.UnsatisfiedLinkError: no attach in java.library.path,表明可能我們缺的東西不是一點半點,我們知道attach功能是Arthas實現原理的兩大原理之一。

attach:jdk1.6新增功能,通過attach機制,可以在jvm運行中,通過pid關聯(lián)應用

instrument:jdk1.5新增功能,通過instrument俗稱javaagent技術,可以修改jvm加載的字節(jié)碼

然后Arthas和其他診斷工具一樣,都是先通過attach鏈接上目標應用,通過instrument動態(tài)修改應用程序的字節(jié)碼達到不重啟應用而監(jiān)控應用的目的

最后的救命稻草

使用完整的JDK中的java命令。

以上方式都試過不行之后,最后我把完整的JDK給下載到本地了,然后通過jdk的bin目錄下的java命令啟動arthas-boot.jar終于ok了,出現了熟悉的java進程選擇界面:

/opt/kl/jdk1.8.0_191/bin # ./java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.0
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 1 org.apache.catalina.startup.Bootstrap

最后定位到的問題其實很簡單,我記錄了Arthas大盤中關于內存部分的圖,如下:

上圖從標題欄開始往下,分別是heap(堆內存)、eden_space(伊甸園區(qū)內存),survivor_space(幸存者區(qū)內存)、tenured_gen(老年代內存)。這張圖是觸發(fā)導出操作后的內存分布,堆內存從一開始的200M左右占用、到400M、到600M、一瞬間就飚升到900多兆了。最后從堆內存指標我們看到,總共989M,使用的內存已經飚升到988M了,這個時候其實應用已經掛了,Kubernetes容器已經在重啟這個實例了。到這里基本已經到位到應用在容器中頻繁掛掉重啟問題的本質了。

但是為什么堆內存會這么小呢?

最終查明,有方面的原因:

1、因為我們這邊都是spring boot應用,只有一個遺留的tomcat部署的應用,所以在鏡像優(yōu)化方面更偏向jdk基礎基礎鏡像,而tomcat鏡像沒怎么關注,一開始對堆內存這塊并沒調優(yōu)設置。

2、后面出現問題后,也確實想到過因為是導出報表導致應用掛掉,很可能是內存問題,設置過tomcat鏡像內的堆內存大小,但是因為我們重新打包的鏡像沒有使用新的版本號,而是直接覆蓋之前的版本,又使用Jenkins構建的,Jenkins所在主機拉過之前的鏡像,導致鏡像更新后,Jenkins打包時并沒有去拉最新的調優(yōu)過基礎鏡像。

解決問題

1、調優(yōu)過的鏡像加上新的版本號,讓應用基于新的版本號構建鏡像?;蛘咔謇硐翵enkins所在主機的鏡像,這個會導致第一次構建時速度變慢

2、優(yōu)化導出報表的實現,我給的方案是,在導出大數據報表時,可以通過id分區(qū),分別作業(yè)寫入同一個服務器本地的文件中,然后讓web容器映射下這個文件所在的目錄,等所有分區(qū)的任務都結束后,直接組裝一個文件下載鏈接返回給前端,讓前端觸發(fā)一次讀文件操作即可。

最后嘗試下jmap

除了使用Arthas外,最后還嘗試了使用jmap工具,但是因為重新下載的JDK版本和主機jre版本不兼容,所有沒用上。最后通過JDK發(fā)行的歸檔頁面找到了對應的版本,還是成功的使用jmap -heap pid看到了內存情況,。內存分布也蠻清晰的,如:

/opt/kl/jdk1.8.0_191/bin # ./jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 3221225472 (3072.0MB)
   NewSize                  = 1073741824 (1024.0MB)
   MaxNewSize               = 1073741824 (1024.0MB)
   OldSize                  = 2147483648 (2048.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 966393856 (921.625MB)
   used     = 856023096 (816.3672409057617MB)
   free     = 110370760 (105.25775909423828MB)
   88.57911199302988% used
Eden Space:
   capacity = 859045888 (819.25MB)
   used     = 787314712 (750.8418197631836MB)
   free     = 71731176 (68.4081802368164MB)
   91.6499017104893% used
From Space:
   capacity = 107347968 (102.375MB)
   used     = 68708384 (65.52542114257812MB)
   free     = 38639584 (36.849578857421875MB)
   64.00529537736568% used
To Space:
   capacity = 107347968 (102.375MB)
   used     = 0 (0.0MB)
   free     = 107347968 (102.375MB)
   0.0% used
tenured generation:
   capacity = 2147483648 (2048.0MB)
   used     = 1521987528 (1451.4804153442383MB)
   free     = 625496120 (596.5195846557617MB)
   70.87306715548038% used

jdk歸檔下載頁:https://www.oracle.com/technetwork/java/javase/downloads

結語

Arthas是一個非常不錯的工具,我們線上多次使用Arthas定位過問題。不過像今天的這種Kubernetes容器環(huán)境的話,因為本身運行時環(huán)境的缺失,可能使用的時候會存在各種問題,這里主要還是分享個思路。希望能給類似場景的同學提供一個有用的參考。

以上就是Arthas排查Kubernetes中應用頻繁掛掉重啟異常的詳細內容,更多關于Arthas異常排查Kubernetes頻繁重啟的資料請關注腳本之家其它相關文章!

相關文章

  • 使用JavaMail發(fā)送郵件保證成功的方法

    使用JavaMail發(fā)送郵件保證成功的方法

    JavaMail是利用現有的郵件賬戶發(fā)送郵件的工具,使用過JavaMail的api發(fā)送郵件的人可能會有這樣一個疑惑:我如何知道我調用該api發(fā)送的郵件是否成功呢?那么通過下面這篇文章大家一起來看看使用JavaMail保證郵件發(fā)送成功的方法,有需要的朋友們可以參考借鑒。
    2016-11-11
  • 詳解Java拋出和聲明異常的代碼實現

    詳解Java拋出和聲明異常的代碼實現

    我們在編寫代碼時,有時候因為某些原因,并不想在這個方法中立即處理產生的異常,也就是說并不想進行異常的捕獲,接下來小編就來教會大家該如何進行異常的拋出,需要的朋友可以參考下
    2023-08-08
  • Java中怎樣使用JSON進行文件解析

    Java中怎樣使用JSON進行文件解析

    這篇文章主要介紹了Java中怎樣使用JSON進行文件解析問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java實現掃雷游戲詳細代碼講解

    Java實現掃雷游戲詳細代碼講解

    windows自帶的游戲《掃雷》是陪伴了無數人的經典游戲,本文將利用Java語言實現這一經典的游戲,文中的示例代碼講解詳細,感興趣的可以學習一下
    2022-05-05
  • Java多線程局域網聊天室的實現

    Java多線程局域網聊天室的實現

    在學習了一個學期的java以后,搞了一個多線程的聊天室,熟悉了一下服務器和客戶機的操作。感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java Idea高效率配置技巧實例解析

    Java Idea高效率配置技巧實例解析

    這篇文章主要介紹了Java Idea高效率配置技巧實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • springboot使用@Slf4j進行日志的記錄步驟詳解

    springboot使用@Slf4j進行日志的記錄步驟詳解

    這篇文章主要介紹了springboot使用@Slf4j進行日志的記錄,使用@Slf4j的注解進行日志記錄非常方便,本文給大家分享操作步驟,需要的朋友可以參考下
    2023-08-08
  • springboot啟動后卡住無日志的幾種情況小結

    springboot啟動后卡住無日志的幾種情況小結

    這篇文章主要介紹了springboot啟動后卡住無日志的幾種情況小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot如何讀取配置文件到靜態(tài)工具類

    springboot如何讀取配置文件到靜態(tài)工具類

    這篇文章主要介紹了springboot實現讀取配置文件到靜態(tài)工具類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Security實現驗證碼登錄功能

    Spring Security實現驗證碼登錄功能

    這篇文章主要介紹了Spring Security實現驗證碼登錄功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01

最新評論