天天看點

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

一、概述

上一個專題專門舉例說明了使用VisualVM來對JVM的記憶體,CPU和線程進行監控,如果有興趣,可以檢視:

http://josh-persistence.iteye.com/blog/2233445,

這一專題繼續說明VirsualVM怎樣進行遠端監控,怎樣監控Tomcat。從前面的部落格中可以知道,VisualVM在啟動後,可以看到視窗左側的”應用程式“欄中有”本地“,”遠端“,”快照“三個項目。 “本地 ”下顯示的是在 localhost 運作的 Java 程式的資源占用情況,如果本地有 Java 程式在運作的話啟動 Java VisualVM 即可看到相應的程式名,點選程式名打開相應的資源監控菜單,以圖形的形式列出程式所占用的 CPU 、 Heap 、 PermGen 、類、線程的 統計資訊。

下一專題将講解怎樣監控GC,怎樣使用快照功能。

 “遠端” 項下列出的遠端主機上的 Java 程式的資源占用情況,但需要在遠端主機上運作 jstatd 守護程式

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

二、使用visualvm 遠端監控 JVM  

1、測試環境:

CentOS 6.4 64位

2、安裝JDK1.6 update7 或者JDK7,本次測試時安裝了JDK7

3、在伺服器上配置jstatd的securitypolicy檔案

   jstatd是一個監控 JVM 從建立到銷毀過程中資源占用情況并提供遠端監控接口的 RMI ( Remote Method Invocation ,遠端方法調用)伺服器程式,它是一個 Daemon 程式,要保證遠端監控軟體連接配接到本地的話需要 jstatd 始終保持運作。  jstatd運作需要通過 -J-Djava.security.policy=*** 指定安全政策,是以我們需要在伺服器上建立一個指定安全政策的檔案jstatd.all.policy ,檔案内容如下:

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

4. 修改伺服器 hosts 檔案中的 IP 位址

      要使Java VisualVM 成功連接配接到遠端伺服器上,伺服器端應該在 /etc/hosts 檔案中把本機位址設為本機的 IP 位址。使用 hostname -i 指令檢視,如果顯示的是 127.0.0.1 或者與本機實際 IP 不一緻的話,需要把 /etc/hosts 檔案中相應的位址改為本機實際 IP 。

5. 運作 jstatd 守護程式

 由于 jstatd 需要保持一直運作,是以建議使用 screen 指令執行 jstatd 程式,指令如下:

screen jstatd -J-Djava.security.policy=jstatd.all.policy      

如果需要RMI 日志功能的話,還可以在啟動參數中加入 -J-Djava.rmi.server.logCalls=true 。

screen jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true       

 jstatd開始運作後,使用 CTRL+A+D 斷開 screen 界面,回到 shell 界面。如果想切換回 jstatd 運作界面的話,使用 screen -r -d指令即可。

當然如果伺服器上沒有screen指令,你也可以使用 &,即使用指令:

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true &      
JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

6. 通過Java VisualVM 連接配接到伺服器監控 Java 程式

       在Java VisualVM 程式視窗左側 “ 遠端 ” 項目右鍵選擇 “ 添加遠端主機 ” ,在彈出的對話框中輸入遠端主機的 IP 位址,确認送出後即可看到相應的遠端主機和在上面運作的 Java 程式,連接配接成功後應該會顯示 Jstatd 及其 PID 。

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

 通過以上方式連接配接伺服器發現一個問題,不能監控CPU 。

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

提示我們建立 JMX ,建立 JMX 提示要求端口号。( JMX:Java Management Extensions ,即 Java 管理擴充 , 是一個為應用程式、裝置、系統等植入管理功能的架構。 JMX 可以跨越一系列異構作業系統平台、系統體系結構和 網絡傳輸協定,靈活的開發無縫內建的系統、網絡和服務管理應用 。而 Visual VM是通過 JMX 來和遠端 Java 應用聯系的 )。

可以有兩種方式來添加JMX的連接配接,一種是直接在VisualVM中添加:右擊遠端主機,選擇”添加JMX連接配接“并輸入端口,但此時可能會報錯誤說無法通過rmi jndi來連接配接該遠端主機

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

 更好的方法就是通過jps得到目前的jstatd的線程ID并kill掉,然後重新使用如下指令啟動JMX:

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true -J-Dcom.sun.management.jmxremote.port=8888 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false &      

 啟動後重新在JVM中打開新啟動的遠端連接配接的主機,你會發現CPU也被監控了:

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

 如果想判斷上面的指令有沒有啟動通過,可以使用如下輔助指令:

1、啟動通過:netstat -an|grep 8888可以檢視端口是否已經被監聽 

2、用JAVA_HOME/bin/jmap 檢視java程序:

3、JPS檢視程序

//檢視本機的情況
jps
//檢視遠端計算機192.168.244.88的情況(預設1099端口)
jps192.168.244.88
//檢視遠端計算機192.168.244.88 8888端口
jps rmi://192.168.244.88:8888
      

三、遠端監控Tomcat

 從上面的分析可知,Java管理擴充(JMX)已經自JDK 5.0起成為Java的有機組成部分。JMX使得開發者可擷取JVM的所有相關資訊。VisualVM使用JMX和為您提供有關JVM記憶體、CPU使用率、垃圾回收的詳細資訊

1、和上面一樣,使用 hostname -i 指令檢視,如果顯示的是 127.0.0.1 或者與本機實際 IP 不一緻的話,需要把 /etc/hosts 檔案中相應的位址改為本機實際 IP。

2、如果是linux下的tomcat,在catalina.sh第一行加入以下代碼:

JAVA_OPTS="$JAVA_OPTS  -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7777 -Dcom.sun.management.jmxremote"
           

 或者在配置中加入該主機的ip

JAVA_OPTS=’-Dcom.sun.management.jmxremote.port=7777 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.244.88  其他配置’        

注:

1. -Dcom.sun.management.jmxremote.port :這個是配置遠端 connection 的端口号的,要确定這個端口沒有被占用

2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否啟用 ssl

3. -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否啟用認證授權機制(需要使用者名,密碼進行認證授權)

4. -Djava.rmi.server.hostname :這個是配置 server 的 IP 的 

需要注意的是:

以上配置是需要關閉防火牆。如果想不關閉防火牆來通路。需要在iptable裡把7777端口給公布出去。在/etc/sysconfig/iptables中加入

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 7777 -j ACCEPT      

 或者加入

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7777 -j ACCEPT
           

測試配置是否成功:

方法1:

遠端啟動Tomcat後,再在本機啟動Visualvm,在“遠端”下添加遠端主機host,然後右擊該host,添加JMX連結,并制定端口号為:7777

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

點選确定成功後,可以看到VisualVM可以成功的對遠端的Tomcat進行監控了,同樣包括CPU,Thread,記憶體等的監控。

JVM性能調優監控工具專題二:VisualVM基本篇之遠端監控,監控Tomcat

然後可以配合使用Jmeter來對Tomcat進行壓力測試,然後實時的觀如上資源的變化,具體内容可以參照我的另一篇部落格:http://josh-persistence.iteye.com/blog/2164035

方法二:

遠端Server上啟動Tomcat成功後,寫一個程式測試JMX的設定是否已經成功:

package com.wsheng.aggregator.jmx;

import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

/**
 * @author Josh Wang(Sheng)
 * 
 * @email  [email protected]
 * 
 */
public class TestJMXClient {
	
	public static void main(String[] args) throws Exception {
		String jndiPath = "jmxrmi";
		String serverHost = "192.168.244.88";
		String serverPort = "7777";
		 // url=service:jmx:rmi:///jndi/rmi://192.168.8.7:8088/jmxrmi 
		
		String jmxurl = "service:jmx:rmi:///jndi/rmi://" + serverHost + ":"  
                 + serverPort + "/" + jndiPath;
		System.out.println("jmxurl:" + jmxurl); 
		Map<String, Object> enviMap = new HashMap<String, Object>(); 
		
		JMXServiceURL url = new JMXServiceURL(jmxurl);  
		
		JMXConnector connector = JMXConnectorFactory.connect(url, enviMap);
		MBeanServerConnection mbsc = connector.getMBeanServerConnection();  
        System.out.println("successful connected " + mbsc.getDefaultDomain());  
        connector.close();  
        System.out.println("close connect"); 
		 
	}

}
           

下一個專題将講解對visualVM對GC的監控以及virsualvm中快照的相關的知識。