Docker容器使用Arthas監(jiān)控Java應(yīng)用的完整指南
為什么要這么做
- Arthas 支持 JDK 11 及以上版本,本身并不存在“無法直接跟蹤 JDK 11”的問題;問題的根因常出現(xiàn)在容器基礎(chǔ)鏡像過于精簡(jiǎn)。
- 從 JDK 9 起工具布局與模塊化發(fā)生變化,而許多瘦身鏡像(如 openjdk:*?slim、alpine 變體)常不包含 jcmd 等診斷工具,也沒有隨鏡像提供 jattach,導(dǎo)致無法直接對(duì) JVM 執(zhí)行動(dòng)態(tài) attach;安裝完整 JDK 或額外安裝 jattach 后即可恢復(fù)能力。
- 另一個(gè)高頻問題是“運(yùn)行 Arthas 的 Java 與目標(biāo) JVM 版本不一致”會(huì)導(dǎo)致 attach 失敗或不穩(wěn)定,建議使用與目標(biāo)進(jìn)程一致或相近版本的 JDK 來運(yùn)行 arthas?boot。
本文演示如何在運(yùn)行中的 Docker 容器里,為目標(biāo) Java 進(jìn)程快速注入 Arthas 并進(jìn)行線上診斷。
步驟 1:進(jìn)入容器并安裝必要工具
# 進(jìn)入正在運(yùn)行的容器 docker exec -it xxx /bin/sh # 安裝 jattach (用于將 Arthas Agent 注入到目標(biāo) JVM) apk add --no-cache jattach # 安裝 JDK (解決 tools.jar 缺失問題,非常重要!) apk add --no-cache openjdk11-jdk # 安裝網(wǎng)絡(luò)工具 (用于后續(xù)排查和驗(yàn)證) apk add --no-cache net-tools iproute2
步驟 2:下載 Arthas
# 下載 arthas-boot.jar wget https://arthas.aliyun.com/arthas-boot.jar
步驟 3:確認(rèn)目標(biāo) Java 進(jìn)程 PID
# 查看 Java 進(jìn)程,確認(rèn) PID(通常為 1) ps -ef | grep java
會(huì)看到類似輸出:
1 root 9:33 java -Xms512m ... -jar tiji-risk-prevention.jar
記下 PID,這里是 1。
步驟 4:將 Arthas Agent 注入到目標(biāo) JVM
# 使用 jattach 將 Arthas Agent 加載到 PID 為 1 的 Java 進(jìn)程中 jattach 1 load instrument false /root/.arthas/lib/4.0.5/arthas/arthas-agent.jar
注意:如果 /root/.arthas/ 目錄不存在,先運(yùn)行一次 java -jar arthas-boot.jar 1 來觸發(fā) Arthas 的自動(dòng)下載和解壓。
步驟 5:手動(dòng)啟動(dòng) Arthas 核心服務(wù)(關(guān)鍵步驟)
這一步是解決會(huì)遇到的 Connection refused 問題的關(guān)鍵:
# 手動(dòng)啟動(dòng) Arthas Core 服務(wù),監(jiān)聽 telnet 和 HTTP 端口
java -cp /root/.arthas/lib/4.0.5/arthas/arthas-core.jar \
com.taobao.arthas.core.Arthas \
--telnet-port 3658 \
--http-port 3659 \
--ip 127.0.0.1 \ # 或者使用 --ip 0.0.0.0 以允許外部訪問
--pid 1 &
注意:使用 & 讓它在后臺(tái)運(yùn)行。
步驟 6:驗(yàn)證 Arthas 是否成功啟動(dòng)
# 檢查 3658 端口是否在監(jiān)聽 netstat -tlnp | grep 3658
你應(yīng)該看到類似輸出:
tcp6 0 0 127.0.0.1:3658 :::* LISTEN 1/java
步驟 7:連接到 Arthas
現(xiàn)在你可以通過以下任一方式連接:
方式一:使用 arthas-boot.jar (推薦)
# 再次運(yùn)行 arthas-boot.jar,它會(huì)檢測(cè)到端口已監(jiān)聽并直接連接 java -jar arthas-boot.jar 1
步驟 8:開始使用 Arthas 進(jìn)行診斷
連接成功后,你會(huì)看到 Arthas 的歡迎界面:
,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doc tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html version 4.0.5 ... [arthas@1]$
現(xiàn)在你就可以使用 Arthas 命令來監(jiān)控你的方法了,例如:
# 查找方法 sm *getPatrolTaskTrack* # 跟蹤方法執(zhí)行耗時(shí) trace com.yourcompany.service.YourClass getPatrolTaskTrack # 監(jiān)控方法調(diào)用統(tǒng)計(jì) monitor com.yourcompany.service.YourClass getPatrolTaskTrack # 查看方法調(diào)用堆棧 stack com.yourcompany.service.YourClass getPatrolTaskTrack
清理
# 可按需刪除臨時(shí)文件與解壓目錄(路徑因?qū)嶋H解壓位置而異) rm -f /tmp/arthas-boot.jar # Arthas 解壓目錄一般位于 ~/.arthas 或 /root/.arthas rm -rf ~/.arthas || true
參考
Arthas 官方站點(diǎn)與使用指南:arthas.aliyun.com
到此這篇關(guān)于Docker容器使用Arthas監(jiān)控Java應(yīng)用的完整指南的文章就介紹到這了,更多相關(guān)Docker Arthas監(jiān)控Java應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker?redmine項(xiàng)目管理工具的使用
Redmine?是一個(gè)開源的,基于Web的項(xiàng)目管理和缺陷跟蹤工具,本文主要介紹了Docker?redmine項(xiàng)目管理工具的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01
利用Dockerfile制作java運(yùn)行環(huán)境的鏡像的方法步驟
這篇文章主要介紹了利用Dockerfile制作java運(yùn)行環(huán)境的鏡像的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法
這篇文章主要介紹了Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法,需要的朋友可以參考下2017-06-06
skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用
這篇文章主要為大家介紹了skywalking容器化部署docker鏡像構(gòu)建k8s從測(cè)試到可用的構(gòu)建部署過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Docker Compose一鍵ELK部署的方法實(shí)現(xiàn)
這篇文章主要介紹了Docker Compose一鍵ELK部署的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
解決Docker network Create加--subnet后遇到問題
這篇文章主要介紹了解決Docker network Create加--subnet后遇到問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

