一、命令或函数监控方法

1.tomcat自带函数检测

可以使用memtest.war这个文件中的meminfo.jsp进行监控内存,里面已经调用tomcat自带的命令写好了一个脚本

2.jps命令[※]

JDK包自带的命令,主要用来输出jvm中运行的进程状态信息
1)语法格式:

    jps [options] [hostid]

如果不指定hostid就默认为当前主机或服务器。
参数说明:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全名
-v 输出传入JVM的参数

2)用法示例
快速获取Java进程的pid,不用ps和grep

1
2
[root@xxx ~]# jps -lvm
10779 sun.tools.jps.Jps -lvm -Denv.class.path=..:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m

3.show-busy-java-threads脚本[※]

此脚本是一个比较著名的脚本,执行后可以排序显示繁忙的java程序的信息,一般用来排查故障,如下

4.jstack监控[※]

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
上面的脚本知道繁忙的线程后,后jstack命令获取详细信息然后发给开发或自己研究

    jstack 73855 >/tmp/busy_java.log

5.jsconslse和jvisualvm

windows下jdk安装后附带的图形监控工具。c:\program files\java\jdk1.8.0_31\bin

二、zabbix监控tomcat

1.监控流程

数据获取流程:java poller《——》javagateway:10052《——》tomcat:12345

  1. zabbix_server开启java poller
  2. zabbix_java开启javagateway,端口为10052
  3. tomcat开启12345端口提供性能数据

2.安装依赖程序

1
2
3
4
#yum源-centos6
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
#yum源-centos7
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

yum安装的zabbix需要增加安装以下程序

1
yum install -y java java-devel zabbix-java-gateway

源码安装的时候需要加–enable-java,如果安装的时候没有此参数需要重新编译

3.开启tomcat远程监控功能

1)修改tomcat配置
需要tomcat开启远程监控功能,开启方法如下

1
2
3
4
5
6
7
[root@xxx ~]# vim /application/tomcat/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.3"

2)做hosts解析并重启tomcat
hosts解析–略

1
2
/app/tomcat/bin/shutdown.sh
/app/tomcat/bin/startup.sh

4.启动zabbix(server和javagateway)

1)修改server配置文件

1
2
sed -ri 's#\# (JavaGateway=)#\1 127.0.0.1#g' /etc/zabbix/zabbix_server.conf
sed -ri 's#\# (StartJavaPollers=)0#\1 5#g' /etc/zabbix/zabbix_server.conf

2)启动服务

1
2
/etc/init.d/zabbix_server restart
/etc/init.d/zabbix-java-gateway start

5.zabbix图形界面添加客户端

在zabbix图形界面上,添加JMX类型的客户端,并了解java模板即可,截图略

三、Tomcat性能优化

1.屏蔽dns查询

1
2
3
4
vim /app/tomcat/conf/server.xml +70
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800"
redirectPort="8443" />

2.jvm调优

Tomcat最吃内存,只要内存足够,这只猫就跑的很快。如果系统资源有限,那就需要进行调优,提高资源使用率。
优化catalina.sh配置文件。
在catalina.sh配置文件中添加以下代码:

1
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"

堆栈参数:

1
2
3
4
5
6
7
8
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:NewSize: 设定堆区域新生代内存的大小
-XX:MaxNewSize: 设定堆区域新生代内存的最大可分配大小

其他参数

1
2
3
4
5
6
7
8
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间