使用Arthas監控Java程序
一、Arthas簡介
Arthas
是Alibaba開源的Java診斷工具,深受開發者喜愛。
當你遇到以下類似問題而束手無策時,Arthas
可以幫助你解決:
- 這個類從哪個 jar 包載入的?為什麼會報各種類相關的 Exception?
- 我改的程式碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎?
- 線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全域性視角來檢視系統的執行狀況?
- 有什麼辦法可以監控到JVM的實時執行狀態?
Arthas
採用命令列互動模式,同時提供豐富的 Tab
自動補全功能,進一步方便進行問題的定位和診斷。
二、安裝及使用
以下通過CentOS系統舉例來安裝Arthas
1.安裝Java環境
首先去Oracle下載JDK,可以通過wget
或者curl -O
來下載到Linux主機上。
最方便的就是下載一個tar.gz格式的壓縮包,然後通過tar -zxf
解壓,以下是筆者最終存放jdk的物理路徑
[[email protected]_0_17_centos jdk1.8.0_181]$ pwd
/usr/lib/java-1.8.0/jdk1.8.0_181
接下來配置環境變數,通過vim /etc/profile
進入編輯操作,並增加以下配置
export JAVA_HOME=/usr/lib/java-1.8.0/jdk1.8.0_181 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib/ export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
退出並儲存,通過執行source /etc/profile
立即生效
然後分別執行java
和javac
驗證環境是否生效
2.安裝Arthas
Arthas非常小巧,官方有一個可直接執行的sh指令碼供我們使用,可以通過以下指令下載
curl -L https://alibaba.github.io/arthas/install.sh | sh
啟動Arthas
./as.sh
3.安裝ElasticSearch
Arthas啟動需要存在至少一個及以上的Java程序,這裡我們為了方便測試,直接安裝ElasticSearch。
和安裝JDK的方式類似,我們去官方下載一個tar.gz
的壓縮包,然後解壓
[[email protected] _0_17_centos elasticsearch]$ ll
total 95612
drwxr-xr-x 9 nico root 4096 Sep 19 09:03 elasticsearch-6.4.0
-rw-r--r-- 1 nico root 97901357 Aug 23 23:21 elasticsearch-6.4.0.tar.gz
ElasticSearch的不允許root使用者啟動,所以筆者用的是nico賬號,建立賬號過程如下
adduser nico
passwd nico
#輸入密碼
#將as.sh和elasticsearch的目錄許可權賦予nico賬戶
chown nico as.sh
chown -R nico elasticsearch
su nico
以上指令請分開到對應的目錄執行,執行完畢之後我們進入elasticsearch目錄下的bin目錄中,啟動elasticsearch
./elasticsearch
4.使用Arthas監控ElasticSearch
進入as.sh
所在目錄,啟動Arthas
./as.sh
[[email protected]_0_17_centos arthas]$ ./as.sh
Arthas script version: 3.0.4
Found existing java process, please choose one and hit RETURN.
* [1]: 19670 org.elasticsearch.bootstrap.Elasticsearch
我們看到,當前只有ElasticSearch一個程序,輸入1監控ElasticSearch
[[email protected]_0_17_centos arthas]$ ./as.sh
Arthas script version: 3.0.4
Found existing java process, please choose one and hit RETURN.
* [1]: 19670 org.elasticsearch.bootstrap.Elasticsearch
1
Calculating attach execution time...
Attaching to 19670 using version 3.0.4...
real 0m0.227s
user 0m0.177s
sys 0m0.035s
Attach success.
Connecting to arthas server... current timestamp is 1537320967
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki: https://alibaba.github.io/arthas
version: 3.0.4
pid: 19670
timestamp: 1537320967728
$
啟動成功,Arthas提供一個shell的操作模式來供我們去監控Java程序,具體指令可以看下官方的Wiki
5.安裝過程可能遇到的問題
(1)遇到報錯java.security.AccessControlException: Access Denied
官方解決辦法
Add the permission in client.policy (for the application client), or in server.policy (for EJB/web modules) for the application that needs to set the property. By default, applications only have “read” permission for properties.
For example, to grant read/write permission for all the files in the codebase directory, add or append the following to client.policy or server.policy:
grant codeBase "file:/.../build/sparc_SunOS/sec/-" {
permission java.util.PropertyPermission "*", "read,write";
};
java.policy所在的目錄為JDK所在目錄下的相對目錄jre/lib/security
vim java.policy
尾部增加一行即可
permission java.security.AllPermission;