1. 程式人生 > >Tomcat筆記之監控

Tomcat筆記之監控

實現監控方法

1.利用tomcat自帶的預設檢視狀態資訊頁面

在conf目錄下的tomcat-user.xml中新增登陸使用者名稱和密碼
 <role rolename="manager-gui"/>
     <role rolename="admin-gui"/>
     <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
 	
 	加入以上程式碼
 	
 	http://10.0.0.81:8080/manager
 	輸入賬號密碼登陸
 	都為tomcat

2.在tomcat伺服器上部署相應監控頁面程式碼

 <%
 Runtime rtm = Runtime.getRuntime();
 long mm = rtm.maxMemory()/1024/1024;
 long tm = rtm.totalMemory()/1024/1024;
 long fm = rtm.freeMemory()/1024/1024;
 
 out.println("JVM memory detail info :<br>");
 out.println("Max memory:"+mm+"MB"+"<br>");
 out.println("Total memory:"+tm+"MB"+"<br>");
 out.println("Free memory:"+fm+"MB"+"<br>");
 out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
 %>

3.第三方監控軟體(jdk)

tomcat服務端配置

 #在tomcat配置檔案中開啟監控功能
 vim /application/tomcat-01/bin/catalina.sh +97
 CATALINA_OPTS="$CATALINA_OPTS
 -Dcom.sun.management.jmxremote 
 -Dcom.sun.management.jmxremote.port=12345  --監控埠
 -Dcom.sun.management.jmxremote.authenticate=false 
 -Dcom.sun.management.jmxremote.ssl=false 
 -Djava.rmi.server.hostname=10.0.0.81"
修改完重啟並檢視相應埠
 [[email protected] conf]# shutdown.sh
 Using CATALINA_BASE:   /application/tomcat
 Using CATALINA_HOME:   /application/tomcat
 Using CATALINA_TMPDIR: /application/tomcat/temp
 Using JRE_HOME:        /application/jdk
 Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
 [[email protected] conf]# startup.sh 
 Using CATALINA_BASE:   /application/tomcat
 Using CATALINA_HOME:   /application/tomcat
 Using CATALINA_TMPDIR: /application/tomcat/temp
 Using JRE_HOME:        /application/jdk
 Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
 Tomcat started.
 [[email protected] conf]# ss -lntup|grep 12345
 tcp    LISTEN     0      50       :::12345                :::*                   users:(("java",pid=4841,fd=20))

windows安裝第三方監控軟體jdk

 一直下一步就好
在位址列輸入:C:\Program Files\Java\jdk1.8.0_31\bin\jconsole.exe

在彈出頁面點選遠端程序
輸入相應ip+埠即可

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

在位址列輸入:C:\Program Files\Java\jdk1.8.0_31\bin\jvisualvm.exe

在這裡插入圖片描述

在彈出頁面:遠端->右鍵->新增遠端主機->輸入tomcat伺服器ip->選擇主機右鍵->新增JMX連線->輸入相應埠->再開啟即可
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

4.利用命令進行檢視操作或者利用監控指令碼

命令:jps -lvm
指令碼程式碼
 #!/bin/bash
 # @Function
 # Find out the highest cpu consumed threads of java, and print the stack of these threads.
 #
 # @Usage
 #   $ ./show-busy-java-threads.sh
 #
 # @author Jerry Lee
 
 readonly PROG=`basename $0`
 readonly -a COMMAND_LINE=("$0" "[email protected]")
 
 usage() {
     cat <<EOF
 Usage: ${PROG} [OPTION]...
 Find out the highest cpu consumed threads of java, and print the stack of these threads.
 Example: ${PROG} -c 10
 
 Options:
     -p, --pid       find out the highest cpu consumed threads from the specifed java process,
                     default from all java process.
     -c, --count     set the thread count to show, default is 5
     -h, --help      display this help and exit
 EOF
     exit $1
 }
 
 readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "[email protected]"`
 [ $? -ne 0 ] && usage 1
 eval set -- "${ARGS}"
 
 while true; do
     case "$1" in
     -c|--count)
         count="$2"
         shift 2
         ;;
     -p|--pid)
         pid="$2"
         shift 2
         ;;
     -h|--help)
         usage
         ;;
     --)
         shift
         break
         ;;
     esac
 done
 count=${count:-5}
 
 redEcho() {
     [ -c /dev/stdout ] && {
         # if stdout is console, turn on color output.
         echo -ne "\033[1;31m"
         echo -n "[email protected]"
         echo -e "\033[0m"
     } || echo "[email protected]"
 }
 
 yellowEcho() {
     [ -c /dev/stdout ] && {
         # if stdout is console, turn on color output.
         echo -ne "\033[1;33m"
         echo -n "[email protected]"
         echo -e "\033[0m"
     } || echo "[email protected]"
 }
 
 blueEcho() {
     [ -c /dev/stdout ] && {
         # if stdout is console, turn on color output.
         echo -ne "\033[1;36m"
         echo -n "[email protected]"
         echo -e "\033[0m"
     } || echo "[email protected]"
 }
 
 # Check the existence of jstack command!
 if ! which jstack &> /dev/null; then
     [ -z "$JAVA_HOME" ] && {
         redEcho "Error: jstack not found on PATH!"
         exit 1
     }
     ! [ -f "$JAVA_HOME/bin/jstack" ] && {
         redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"
         exit 1
     }
     ! [ -x "$JAVA_HOME/bin/jstack" ] && {
         redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"
         exit 1
     }
     export PATH="$JAVA_HOME/bin:$PATH"
 fi
 
 readonly uuid=`date +%s`_${RANDOM}_$$
 
 cleanupWhenExit() {
     rm /tmp/${uuid}_* &> /dev/null
 }
 trap "cleanupWhenExit" EXIT
 
 printStackOfThread() {
     local line
     local count=1
     while IFS=" " read -a line ; do
         local pid=${line[0]}
         local threadId=${line[1]}
         local threadId0x=`printf %x ${threadId}`
         local user=${line[2]}
         local pcpu=${line[4]}
 
         local jstackFile=/tmp/${uuid}_${pid}
 
         [ ! -f "${jstackFile}" ] && {
             {
                 if [ "${user}" == "${USER}" ]; then
                     jstack ${pid} > ${jstackFile}
                 else
                     if [ $UID == 0 ]; then
                         sudo -u ${user} jstack ${pid} > ${jstackFile}
                     else
                         redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
                         redEcho "User of java process($user) is not current user($USER), need sudo to run again:"
                         yellowEcho "    sudo ${COMMAND_LINE[@]}"
                         echo
                         continue
                     fi
                 fi
             } || {
                 redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."
                 echo
                 rm ${jstackFile}
                 continue
             }
         }
         blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"
         sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}
     done
 }
 
 
 ps -Leo pid,lwp,user,comm,pcpu --no-headers | {
     [ -z "${pid}" ] &&
     awk '$4=="java"{print $0}' ||
     awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'
 } | sort -k5 -r -n | head --lines "${count}" | printStackOfThread

5.利用zabbix監控軟體(重點)

安裝

yum install -y zabbix-java-gateway-4.0.0-2.el7.x86_64
或者
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-java-gateway-4.0.0-2.el7.x86_64.rpm

PS:這裡有一個坑
 若是直接使用rpm安裝會報錯,切記!
啟動
 [[email protected]_ser ~]# systemctl start zabbix-java-gateway.service 
 [[email protected]_ser ~]# ss -lntup|grep java
 tcp    LISTEN     0      50       :::10052                :::*                   users:   (("java",pid=126186,fd=13))
修改zabbix配置檔案中與Java有關的
 [[email protected]_ser ~]# grep java -i /etc/zabbix/zabbix_server.conf 
 #	Number of pre-forked instances of pollers for unreachable hosts (including IPMI and Java).
 #	At least one poller for unreachable hosts must be running if regular, IPMI or Java pollers
 ### Option: JavaGateway
 #	IP address (or hostname) of Zabbix Java gateway.
 #	Only required if Java pollers are started.
 # JavaGateway=127.0.0.1
 ### Option: JavaGatewayPort
 #	Port that Zabbix Java gateway listens on.
 # JavaGatewayPort=10052
 ### Option: StartJavaPollers
 #	Number of pre-forked instances of Java pollers.
 # StartJavaPollers=5
修改的地方:
  JavaGateway=127.0.0.1
  StartJavaPollers=5
重啟

在tomcat端安裝zabbix—agent

[[email protected] conf]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm

修改配置檔案

 不多說=-=

 在http://10.0.0.77/zabbix  web介面新增一臺主機,勾選JMX輸入tomcat的地址即可

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述