VisualVM 經過JMX、Jstatd 對tomcat 監控

VisualVM 經過JMX、Jstatd 對tomcat 監控 有更新!

 2018-03-19   |    3 評論   |    300 瀏覽html

前言:java

年後找工做,第一次面試就被一個面試官批評個人系統沒有監控是不行的(其餘的都沒怎麼聊),雖然這個面試好像只是在走個過場(浪費我時間,我請假是要扣工資的!),於我有點不尊重,可是我仍是在此次面試者知道一個經常使用的監控jvm的東西叫JMX(Java Management Extensions,即Java管理擴展)。(後面也有了解到一個叫zabbix的系統,也能夠經過JMX實現對jvm監控,這個系統功能比較多,還能作到微信公衆號異常通知,讀者能夠自行去了解,這裏很少描述)。在搭建這個JMX環境的時候遇到了一些問題,在這裏總結一下,但願有興趣搭建的同窗避免一些沒必要要的坑。git

效果預覽:
6d7600e86b57479a8c097b9bf1ed0582-9D40E3A710774FBC93F0D5D090E4EB85.pnggithub

2a3f5f633ea644949ae788dcb7a0cde2-AA220701E4EA4E9BB9906F7845F87E2D.png

開始面試

一:經過jmx監控jvmcentos

(ps:全部環境在虛擬機下運行,操做系統爲:centos 7 64)tomcat

安裝虛擬機,用寶塔快速構建一個java(1.8),tomcat8環境。自行下載VisualVm客戶端服務器

開啓tomcat的jmx支持微信

在tomcat的安裝目錄下/www/server/tomcat/bin 修改catalina.sh文件,加入如下一段代碼:jvm

CATALINAOPTS=「$CATALINAOPTS -Dcom.sun.management.jmxremote #開啓遠程
-Dcom.sun.management.jmxremote.port=12345 #開啓jmx監控的端口
-Dcom.sun.management.jmxremote.ssl=false #是否開啓ssl
-Dcom.sun.management.jmxremote.authenticate=false #是否須要權限認證(帳戶密碼)
-Djava.rmi.server.hostname=192.168.181.137」 #本機IP地址

(ps:這是無密碼訪問模式)
18a080015c5d4e2dacfa211931c7bc3b-6C14BD912D404602801052B3706F5C1F.png

**關閉tomcat,必定要確認tomcat是完整關閉的。能夠直接殺死tomcat進程來關閉tomcat
**
kill -9 ps -ef|grep tomcat|awk '{print $2}'

1072edd42b1444ec8cba7c3deb3ba4ec-6F865A687FE348D8A7FE33212E9763B6.png

啓動tomcat,觀察啓動日誌

/www/server/tomcat/bin/startup.sh

d0b0a82eefae4c209243109246250329-070449B8640A4963963A26C2816F0EF5.png

VisuaIVM 鏈接服務

  • 新建一個host*

6f3a599e3f7e469bbd469b99cbea7e88-07BD2A936A8A437380F2ED03D7A95B67.png

d44db7c1972f44f5954dcb965267c427-092D3D7F1AD849339C2BA2C9C9FF8797.png

建立jmx連接

c7236e7079274d318d0ec450705db45c-image.png

01b5c292de534ca588ce2ef4cb7bb269-image.png

確定會出現這個提示

7b6afa92391b4cfda945af70b554e993-image.png

爲何了?

這是我從網上找到的:這是由於JMX在遠程鏈接時,會隨機開啓一個RMI端口做爲鏈接的數據端口,頗有可能這個端口會被防火牆給阻止,以致於鏈接超時失敗。好在在Java7u25版本後可-Dcom.sun.management.jmxremote.rmi.port=端口號來定死這個端口,好消息是,你能夠將這個端口和jmx.port的端口設置成一個端口,這樣防火牆策略就只須要同行一個端口就能夠了。

因此只須要在第2步哪裏添加多一條屬性,指定這個RMI端口,而且與jmx.port一致,而後重啓tomcat就行了。

69b70245df0c4846828526b9eb90f145-image.png

固然這只是一個簡單的監控,這裏還有一個好用的工具visual GC(能夠看到每個代的jvm內存狀況),可是jmx沒法顯示他。如何可讓這個插件運行起來了?下面繼續。

二:經過jstatd 監控 GC

在Visualvm客戶端上安裝Visual gc 插件,可是因爲oracla已經關閉了這個下載頁面因此在工具上不能自動下載成功

6e0f201129794531b8472d3ca4ada884-image.png

查資料發現,visualvm 已經遷移到了github上了,地址,當即前往

8206f499096c482caaaa0d9125c0d1a3-image.png

找到適合本身JDK的版本

b1369fe743ff4b1facee185795c6a0a3-image.png

**把對應的更新地址複製一下,回到Visualvm->工具->插件->設置

d6913b69f2d54e049800ca49bd902bc6-image.png

把這個地址改爲你剛纔複製的連接,我這裏已經改好了。

修改以後從新更新可用插件,安裝就能夠了。而後重啓Visualvm 就會發現多了一個插件

bd67702ee3a24eee8b2a8e3286f7adbe-image.png

到如今爲止,咱們仍是不能直接經過jstatd鏈接到服務器上監聽jvm!,首先在服務器上建立一個文件命名爲jstatd.all.policy內容爲:

grant codebase 「file:${java.home}/../lib/tools.jar」 {
permission java.security.AllPermission;
};

命令爲:

vi jstatd.all.policy ,而後把內容複製進去。保存退出!

而後複製到jdk安裝目錄的bin裏面,我這裏的安裝目錄是:/usr/java/jdk1.8.0_121/bin

cp jstatd.all.policy /usr/java/jdk1.8.0_121/bin

進入jdk安裝目錄下:cd /usr/java/jdk1.8.0_121/bin/

b52d7c0700f646bfbb02d0608e6a0130-image.png

運行jstatd

f1de7b15d43845f093eaade180b8143a-image.png

指定端口運行:(切記:必定要把端口放開,不要被防火牆攔截了)

jstatd -J-Djava.security.policy=jstatd.all.policy -p 1099

後面加多一個「&」 能夠後臺運行。

cdd3f9f143c046c58e468f523d656e32-image.png

嘗試鏈接,jstatd

094dd206e7a24745b15d4b87c5c82bbc-image.png

默認就是1099端口

你會發現如今仍是連不上的!連不上!連不上!

網上說是由於這個緣由:

d97616621f9748b294b62714bbf51f8d-image.png

須要把這個127.0.0.1 修改爲本機ip地址。(主要不是這個緣由),能夠不修改這個,經過參數的方式指定IP

jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.181.138 -p 1099

其實這個並非主要緣由!!!

通過個人反覆測試發現,jstatd 打開的同時還會註冊一個rmi的通訊端口,因爲防火牆的緣由,這個端口被隔離

開了,致使ViualVM 鏈接不上jstatd。

解決方法:

一、關閉防火牆(正式環境中,防火牆是確定開啓的)

二、開啓一個端口對應的通訊端口。(我通常會把39000以上的端口放開,寶塔自動回放開39000-40000的端口)
只要修改下啓動的語句就好

最終版運行語句:

rmiregistry 39000 & jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.181.138 -p 1099

這句話的意思:指定註冊的端口爲 39000以上的端口 ,鏈接端口爲 1099(這麼作的好處就是,我不須要再去找出這個註冊的端口是哪個,而後再手動去放開,這樣指定了39000以上端口,會出如今個人開放端口範圍以內。)

手動打開的方法

5251fb6f8eb2435aa2b732f58cb3a128-image.png

而後經過pid 查看到相關的端口

896e6a9eb1c04096baf3d5c1eb13bd50-image.png

而後把它從防火牆放開就好!!!

最終!!!

從新jstatd鏈接以後,GC 獲得了監控!

f3d02f2c869640929d4182317feb5e7c-image.png

* ps:這篇博客是整理網上的教程,而後經過本身的屢次試驗得出的方法(避免了網上重複複製的一堆錯誤的教程),若是有不當的地方,還請大佬們提出,共同窗習進步。

相關文章
相關標籤/搜索