性能监控工具选择

1.接口返回信息

     使用jmeter插件的<聚合报告>统计接口的请求数、响应时间、平均响应时间、TPS、错误率等指标

2.服务器负载

    使用jmeter插件<PerfMon Metrics Collector>统计服务器cpu、内存、硬盘IO、网络IO的趋势图

3.jvm性能指标

   a.) jmap -heap  pid  查看堆内存使用信息,用于查看新生代、老年代内存使用情况

   b.) jmap -histo pid 查看java进程中class生成的对象占用的信息,压测中每隔2秒查看一次占用最大内存的class,可以用来定位内存溢出的原因

          ps:  jmap -histo 202190|grep "1:"|head -1

    c.) jstat -gcutil pid  频率(毫秒) 总打印次数  查看gc情况,fullgc次数不能太频繁,每次fullgc时间不能太长,性能指标之一

制作监控脚本,在目标服务器启用websocket服务,打印以上信息,在静态网页上显示ws请求返回的信息,可以用来生成图表(主要用来集成到网站中,生成性能报告,其实jvisualvm结合jconsole.exe、jstat命令更详细好用)。

简单实现演示:

 a.)启动websocket服务,连接之后会执行监控脚本

#!/bin/bash
#一定要加/bin/bash,否则会报错
freightpid=`ps -ef|grep osp-financial-freight|grep -v 'grep'|awk '{print $2}'`
#jmap -histo $freightpid|head -20
#echo $freightpid
for ((COUNT=1;COUNT<=10;COUNT++));do
  jmap -heap $freightpid|grep -E "used$"|awk '{print $1}'|tail -n 1
  sleep 5
done
View Code

 b.)js发起websocket请求,实时根据监控脚本的返回重新渲染图表。如图。

html代码如下:

 1 <!DOCTYPE HTML>
 2 <html>
 3     <head>
 4         <meta charset="utf-8"><link rel="icon" href="https://static.jianshukeji.com/highcharts/images/favicon.ico">
 5         <meta name="viewport" content="width=device-width, initial-scale=1">
 6         <style>
 7             /* css 代码  */
 8         </style>
 9         <script src="https://img.hcharts.cn/highcharts/highcharts.js"></script>
10         <script src="https://img.hcharts.cn/highcharts/modules/exporting.js"></script>
11         <script src="https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js"></script>
12     </head>
13     <body>
14         <div id="container" style="min-width:400px;height:400px"></div>
15         <script>
16             Highcharts.setOptions({
17     global: {
18         useUTC: false
19     }
20 });
21 function activeLastPointToolip(chart) {
22     var points = chart.series[0].points;
23     chart.tooltip.refresh(points[points.length -1]);
24 }
25 var chart = Highcharts.chart('container', {
26     chart: {
27         type: 'spline',
28         marginRight: 10,
29         events: {
30             load: function () {
31             var temp =0;
32             var ws =new WebSocket('ws://172.31.52.18:8187');
33             ws.onopen = function(event){console.log("CONNECT")};
34             ws.onmessage = function(event){console.log(event.data.split("%")[0]);temp=parseFloat(event.data.split("%")[0])};
35             ws.onerror = function(event){console.log(event)};
36                 var series = this.series[0],
37                     chart = this;
38                 activeLastPointToolip(chart);
39                 setInterval(function () {
40                     var x = (new Date()).getTime(), // 当前时间
41                         y = temp;          // 随机值
42                     series.addPoint([x, y], true, true);
43                     activeLastPointToolip(chart);
44                 }, 5000);
45             }
46         }
47     },
48     title: {
49         text: '新生代内存使用监控'
50     },
51     xAxis: {
52         type: 'datetime',
53         tickPixelInterval: 150
54     },
55     yAxis: {
56         title: {
57             text: null
58         }
59     },
60     tooltip: {
61         formatter: function () {
62             return '<b>' + this.series.name + '</b><br/>' +
63                 Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
64                 Highcharts.numberFormat(this.y, 6);
65         }
66     },
67     legend: {
68         enabled: true
69     },
70     series: [{
71         name: '新生代已用内存占比',
72         data: (function () {
73         var temp =0;
74         var ws =new WebSocket('ws://172.31.52.18:8187');
75         ws.onopen = function(event){console.log("CONNECT")};
76         ws.onmessage = function(event){temp=parseFloat(event.data.split("%")[0])};
77         ws.onerror = function(event){console.log(event)};
78             // 生成随机值
79             var data = [],
80                 time = (new Date()).getTime(),
81                 i;
82             for (i = -19; i <= 0; i += 1) {
83                 data.push({
84                     x: time + i * 5000,
85                     y: temp
86                 });
87             }
88             return data;
89         }())
90     }]
91 });
92         </script>
93     </body>
94 </html>
View Code

未完成之前,先使用jvisualvm.exe远程代替查看,或者直接命令行查看。

    附jvisualvm.exe的远程使用教程:

        在java程序的启动参数中增加:

           -Djava.rmi.server.hostname=172.xx.xx.xx   ////////本机地址

           -Dcom.sun.management.jmxremote

          -Dcom.sun.management.jmxremote.port=1099

          -Dcom.sun.management.jmxremote.authenticate=false

          -Dcom.sun.management.jmxremote.ssl=false

     启动之后如下图:

  查看1099端口是否可用:  lsof -i:1099,如下图即为可用,否则要在防火墙中添加

使用windows上的jvisualvm.exe,点击 远程-》右键-》rmi连接 

进入之后可看到配有启动参数的java程序,点击监视,可查看该程序占用的cpu、堆内存占比、线程运行情况

jconsole.exe可以跟踪堆栈信息,连接方式rmi,同上

4.数据库性能查看语句

show global status like 'Thread%'; //查看线程运行情况

innodb引擎查看死锁语句
select b.trx_mysql_thread_id AS '被阻塞线程',
b.trx_query AS '被阻塞SQL',
c.trx_mysql_thread_id AS '阻塞线程',
(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started)) AS '阻塞时间'
from information_schema.INNODB_LOCK_WAITS a
join information_schema.INNODB_TRX b on a.requesting_trx_id =b.trx_id
join information_schema.INNODB_TRX c on a.blocking_trx_id=c.trx_id
where (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started))>60;

猜你喜欢

转载自www.cnblogs.com/zipon/p/9456763.html