java性能监控

释放双眼,带上耳机,听听看~!

为什么80%的码农都做不了架构师?>>>  java性能监控

1.监控cpu的使用率

1)vmstat命令

vmstat [arg1] [arg2]

  • arg1:间隔时间(秒),
  • arg2:采集次数

示例:


1
2
3
4
5
6
1$ vmstat 2 1       #2表示每个两秒采集一次服务器状态,1表示只采集一次。
2procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
3r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
40  0      0 2881900 304252 1496312    0    0   241    35  162  412  4  1 95  0  0
5
6

1
2
3
4
5
6
7
8
9
10
1$ vmstat 2     #表示vmstat每2秒采集数据,一直采集,直到我结束程序
2procs  ---------------memory----------- -swap-- ----io----  --system-- ------cpu------
3 r  b   swpd   free       buff      cache     si   so    bi    bo      in     cs   us  sy id wa st
4 0  0      0 2779416 304792 1522608    0    0   212    34  166   426   4  1   95  0  0
5 0  0      0 2778656 304800 1522808    0    0     0    230  717  1654  3  1   95  0  0
6 0  0      0 2778904 304800 1522808    0    0     0       0   665  1684  3  1   96  0  0
7 0  0      0 2778656 304800 1522808    0    0     0       0   673  1634  4  1   95  0  0
8 0  0      0 2779092 304800 1522676    0    0     0       0   646  1643  3  1   97  0  0
9
10

结果说明:

r
表示运行队列(就是说多少个进程真的分配到CPU。
b
表示阻塞的进程。
swpd
虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了。
free
空闲的物理内存的大小。
buff
Linux/Unix系统是用来存储目录里面有什么内容,权限等的缓存。
cache
cache直接用来记忆我们打开的文件,给文件做缓冲。
si
每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了。
so
每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi
块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备。
bo
块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in
每秒CPU的中断次数,包括时间中断
cs
每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。
us
用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy
系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id
空闲 CPU时间,一般来说,id + us + sy = 100可认为id是空闲CPU使用率。
a
表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
st
一般不关注,虚拟机占用的时间百分比。

2)top命令


1
2
3
4
5
6
7
8
9
10
11
12
13
14
1$ top
2top - 11:17:14 up  1:01,  2 users,  load average: 0.30, 0.36, 0.33
3Tasks: 253 total,   3 running, 250 sleeping,   0 stopped,   0 zombie
4%Cpu(s):  7.8 us,  1.4 sy,  0.0 ni, 90.7 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
5KiB Mem :  5918912 total,  2249532 free,  1582844 used,  2086536 buff/cache
6KiB Swap:  6097916 total,  6097916 free,        0 used.  3762164 avail Mem
7
8  PID USER      PR  NI    VIRT    RES      SHR   S  %CPU %MEM  TIME+ COMMAND                                                                            
9 5821 fangche+  20   0  977624  202448   84076 R   11.9        3.4      3:34.69  chrome                                                                            
10 5289 fangche+  20   0 1350824 375624 115240  S     7.6       6.3      3:37.34  firefox                                                                            
11 3958 fangche+  20   0 1131336 112608  68884   S     6.3       1.9       2:21.88  compiz                                                                            
12 2896 root           20   0  376900   60204   46216   S     4.6       1.0      1:33.95  Xorg
13
14

内容说明:

  1. 统计信息区前五行是系统整体的统计信息。
  • 第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:


1
2
3
4
5
6
111:17:14       当前时间
2up 1:01            系统运行时间,格式为时:分
32 user         当前登录用户数
4load average: 0.30, 0.36, 0.33    系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
5
6
  • 第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:


1
2
3
4
5
6
7
1total      进程总数
2running    正在运行的进程数
3sleeping   睡眠的进程数
4stopped    停止的进程数
5zombie         僵尸进程数
6
7
  • Cpu(s): 7.8 us, 1.4 sy, 0.0 ni, 90.7 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st


1
2
3
4
5
6
7
8
9
10
17.8% us    用户空间占用CPU百分比
21.4% sy    内核空间占用CPU百分比
30.0 ni         用户进程空间内改变过优先级的进程占用CPU百分比
490.7%id        空闲CPU百分比
50.0wa      等待输入输出的CPU时间百分比
60.0hi      硬件CPU中断占用百分比,比如,像磁盘,网卡,键盘,时钟等
70.1 si     软中断占用百分比,由当前正在运行的进程所产生的中断
80.0 st     虚拟机占用百分比
9
10
  • 最后两行为内存信息。内容如下:


1
2
3
4
5
6
7
8
9
10
11
12
1KiB Mem :  
25918912 total,     物理内存总量
32249532 free,      使用的物理内存总量
41582844 used,      空闲内存总量
52086536 buff/cache用作内核缓存的内存量
6KiB Swap:  
76097916 total,     交换区总量
86097916 free,          空闲交换区总量
90 used.            使用的交换区总量
103762164 avail Mem 可使用的内存
11
12
  • 进程信息区统计信息区域的下方显示了各个进程的详细信息。

a
PID
进程id
b
PPID
父进程id
c
RUSER
Real user name
d
UID
进程所有者的用户id
e
USER
进程所有者的用户名
f
GROUP
进程所有者的组名
g
TTY
启动进程的终端名。不是从终端启动的进程则显示为 ?
h
PR
优先级
i
NI
nice值。负值表示高优先级,正值表示低优先级
j
P
最后使用的CPU,仅在多CPU环境下有意义
k
%CPU
上次更新到现在的CPU时间占用百分比
l
TIME
进程使用的CPU时间总计,单位秒
m
TIME+
进程使用的CPU时间总计,单位1/100秒
n
%MEM
进程使用的物理内存百分比
o
VIRT
进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p
SWAP
进程使用的虚拟内存中,被换出的大小,单位kb。
q
RES
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r
CODE
可执行代码占用的物理内存大小,单位kb
s
DATA
可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t
SHR
共享内存大小,单位kb
u
nFLT
页面错误次数
v
nDRT
最后一次写入到现在,被修改过的页面数。
w
S
进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x
COMMAND
命令名/命令行
y
WCHAN
若该进程在睡眠,则显示睡眠中的系统函数名
z
Flags
任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。 更改显示内容通过 f 键可以选择显示的内容。 大写的 R 键可以将当前的排序倒转。

命令使用


1
2
3
1top使用格式    top [-] [d] [p] [q] [c] [C] [S] [s]  [n]
2
3

d
指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p
通过指定监控进程ID来仅仅监控某个进程的状态。
q
该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S
指定累计模式
s
使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i
使top不显示任何闲置或者僵死进程。
c
显示整个命令行而不只是显示命令名

实用命令 (直接在top运行的界面输入)

h
或者? 显示帮助画面,给出一些简短的命令总结说明。
k
终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。
i
忽略闲置和僵死进程。这是一个开关式命令。
q
退出程序。
r
重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S
切换到累计模式。
s
改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。
f
或者F 从当前显示中添加或者删除项目。
l
切换显示平均负载和启动时间信息。
m
切换显示内存信息。
t
切换显示进程和CPU状态信息。
c
切换显示命令名称和完整命令行。
M
根据驻留内存大小进行排序。
P
根据CPU使用百分比大小进行排序。
T
根据时间/累计时间进行排序。
W
将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

常用操作:

  • top :每隔5秒显式所有进程的资源占用情况
  • top -d 2 :每隔2秒显式所有进程的资源占用情况
  • top -c :每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
  • top -p 12345 -p 6789 :每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
  • top -d 2 -c -p 123456 :每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
  • top -H -p 6372 :查看进程6372的所有线程

2.网络io

命令:nicstat [-hnsz] [-i interface[,]] | [interval [count]]

  • -h 显示帮助信息
  • -n 仅显示非本地接口
  • -s 显示概要信息
  • -z 跳过0值
  • -i interface是网络接口设备名
  • interval 报告输出频率(秒级)
  • count 报告的采样数

示例:


1
2
3
4
5
6
7
1$ nicstat -i wlan0 1 #查看网络设备为wlan0的网络io,间隔为1秒
2    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
312:49:17    wlan0    2.25    0.77   14.54    2.53   158.8   310.8    0.00   0.00
412:49:18    wlan0    0.00    0.00    0.00     0.00    0.00      0.00    0.00   0.00
512:49:19    wlan0    0.00    0.00    0.00     0.00    0.00      0.00    0.00   0.00
6
7

列名说明:

  • Int 网络接口设备名
  • rKB/s 每秒读取的KB数
  • wKB/s 每秒写入的KB数
  • rPk/s 每秒读取的包数
  • wPk/s 每秒写入的包数
  • rAvs 每次读取的平均字节
  • wAvs 每次写入的平均字节
  • %Util 网络接口使用率
  • Sat 饱和度

3.磁盘io使用率

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device […] | ALL ] [ -p [ device [,…] | ALL ] ] [ interval [ count ] ]

示例:


1
2
3
4
5
6
7
1$ iostat -d -k 2  
2Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
3sda               10.08       112.41        75.18    1592458    1065093
4sdb                0.09         2.87            0.00      40721          8
5scd0              0.00         0.01            0.00         98             0
6
7

命令说明:

  • 参数 -d 表示,显示设备(磁盘)使用状态;
  • -k某些使用block为单位的列强制使用Kilobytes为单位;
  • 2表示,数据显示每隔2秒刷新一次。

列名说明:

  • tps: 该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。
  • kB_read/s: 每秒从设备(drive expressed)读取的数据量;
  • kB_wrtn/s: 每秒向设备(drive expressed)写入的数据量;
  • kB_read: 读取的总数据量;
  • kB_wrtn: 写入的总数量数据量;这些单位都为Kilobytes。

示例:指定监控的设备名称为sda,该命令的输出结果和上面命令完全相同。


1
2
3
4
5
1$ iostat -d sda 2
2Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
3sda                 9.94       110.20        74.59         1592458    1077897
4
5

常见用法:

  • iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)
  • iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)
  • iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
  • iostat -c 1 10 #查看cpu状态

示例:查看设备使用率(%util)、响应时间(await)


1
2
3
4
5
6
7
1$ iostat -d -x -k 1 4
2Device:         rrqm/s   wrqm/s     r/s     w/s     rkB/s    wkB/s avgrq-sz avgqu-sz  await r_await w_await  svctm  %util
3sda                0.28        2.85       6.69    3.14   110.22    73.80    37.42     0.01       0.77     0.47      1.42      0.24    0.23
4sdb                0.00        0.00       0.08    0.00     2.76      0.00      66.82     0.00     20.51   20.54      0.00      5.70    0.05
5scd0              0.00        0.00       0.00    0.00     0.01      0.00        7.00     0.00       1.00     1.00      0.00      1.00    0.00
6
7

列名说明

  • rrqm/s: 每秒这个设备相关的读取请求有多少被合并了;
  • wrqm/s:每秒这个设备相关的写入请求有多少被合并了。
  • rsec/s: 每秒读取的扇区数;
  • wsec/: 每秒写入的扇区数。
  • rKB/s: 每秒的读取速度.
  • wKB/s: 每秒的写入速度.
  • avgrq-sz 平均请求扇区的大小
  • avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
  • await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。一般地系统IO响应时间应该低于5ms。这个时间包括了队列时间和服务时间,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短。
  • svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与- await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
  • %util: 在统计时间内所有处理IO时间,除以总共统计时间。该参数暗示了设备的繁忙程度。

示例:查看cpu状态


1
2
3
4
5
1$ iostat -c 1 10
2avg-cpu:  %user   %nice %system %iowait  %steal   %idle
3                  7.32       0.01     1.64        0.07       0.00     90.96
4
5

示例:iostat配合grep命令使用


1
2
3
4
5
1$ iostat -d 2 | grep sda
2sda               9.56       105.52        74.57    1628178    1150613
3sda               0.50         0.00        50.00          0        100
4
5

4.多功能监测利器-pidstat

主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

1)用法:

pidstat [ -C comm ] [ -d ] [ -h ] [ -I ] [ -l ] [ -p { pid [,…] | SELF | ALL } ] [ -r ] [ -s ] [ -t ] [ -T { TASK | CHILD | ALL } ] [ -u ] [ -V ] [ -w ] [ interval [ count ] ]

2)选项:

  • -C comm #只显示那些包含字符串(可是正则表达式)comm的命令的名字
  • -d #显示I/O统计信息(须内核2.6.20及以后)
  • PID #进程号
  • kB_rd/s #每秒此进程从磁盘读取的千字节数
  • kB_wr/s #此进程已经或者将要写入磁盘的每秒千字节数
  • kB_ccwr/s #由任务取消的写入磁盘的千字节数
  • Command #命令的名字
  • -h #显示所有的活动的任务
  • -I #在SMP环境,指出任务的CPU使用(等同于选项-u)应该被除于cpu的总数
  • -l #显示进程的命令名和它的参数
  • -p { pid [,…] | SELF | ALL } #指定线程显示其报告
  • -r #显示分页错误的内存利用率

3)输出内容:

  • minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物 理内存地址产生的page fault次数
  • majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
  • VSZ: 该进程使用的虚拟内存(以kB为单位)
  • RSS: 该进程使用的物理内存(以kB为单位)
  • %MEM: 该进程使用内存的百分比
  • Command: 拉起进程对应的命令

示例1. cpu监控


1
2
3
1pidstat -p 1187 1 3 -u -t
2
3

参数说明:

  • -p用于指定进程 id,
  • -u表示对cpu使用率的监控,
  • 参数1 3表示每秒钟采样一次,一共采样三次,
  • -t参数将监控对象细化到线程级别。

示例2 i/o监控


1
2
3
1pidstat -p 1123 -d -t 1 3
2
3

参数说明:

  • -d表示监控对象为磁盘io,1 3表示每秒采样一次,一共采样三次

示例3 内存监控


1
2
3
1pidstat -r -p 2234 1 4
2
3

参数说明:

  • -r表示对内存进行监控,1 4表示每秒钟采样一次,一共采样四次

5.jvm监测

开启jmx远程连接:

在tomcat中,配置以下参数


1
2
3
4
5
6
7
1-Djava.rmi.server.hostname=192.168.199.178 \
2-Dcom.sun.management.jmxremote \
3          -Dcom.sun.management.jmxremote.port=12245 \
4-Dcom.sun.management.jmxremote.ssl=false \
5-Dcom.sun.management.jmxremote.authenticate=false
6
7

运行后,可以使用jvisualvm进行远程连接,使用界面观察jvm运行情况: java性能监控

输出gc日志:


1
2
3
4
5
6
7
8
9
10
11
1-verbose:gc \
2-XX:+PrintGCDetails \              -- 垃圾收集器相关的统计数据
3-XX:+PrintGCDateStamps \           -- 打印垃圾收集所用时间
4-XX:+PrintHeapAtGC \               -- 垃圾收集前后堆内存信息
5-Xloggc:<filename> \             -- gc日志位置及文件名
6-XX:+PrintGCApplicationStoppedTime \ -- 应用程序的阻塞时间
7-XX:+PrintGCApplicationConcurrentTime \ --应用程序是否在运行,运行了多少时间
8-XX:+PrintCommandLineFlags     -- 输出堆的初始值及最大值,输出格式:-XX:InitalHeapSize=<n>,
9-XX:MaxHeapSize=<m>,以字节为单位.
10
11

转载于:https://my.oschina.net/funcy/blog/1929286

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索