您的位置:首页 > 运维架构 > Linux

linux系统负载命令,以及jdk内存分析常用命令,jvm性能监控内存泄漏分析工具

2016-08-25 00:00 941 查看
摘要: Java中的简单浮点数类型float和double不能够进行运算

  uptime

04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20


当前时间 04:03:58

系统已运行的时间 10 days, 13:19

当前在线用户 1 user

平均负载:0.54, 0.40, 0.20,最近1分钟、5分钟、15分钟系统的负载

top

top - 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60, 0.48
Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    191272k total,   173656k used,    17616k free,    22052k buffers
Swap:   192772k total,        0k used,   192772k free,   123988k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03 sshd
root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top
root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init
root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0

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

01:06:48    当前时间
up 1:22    系统运行时间,格式为时:分
1 user    当前登录用户数
load average: 0.06, 0.60, 0.48    系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

total 进程总数
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
Cpu(s):
0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0%hi:硬件CPU中断占用百分比
0.0%si:软中断占用百分比
0.0%st:虚拟机占用百分比

最后两行为内存信息。内容如下:

Mem:
191272k total    物理内存总量
173656k used    使用的物理内存总量
17616k free    空闲内存总量
22052k buffers    用作内核缓存的内存量
Swap:
192772k total    交换区总量
0k used    使用的交换区总量
192772k free    空闲交换区总量
123988k cached    缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号  列名    含义
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


vmstat

用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况

root@ubuntu:~# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
1  0      0 3498472 315836 3819540    0    0     0     1    2    0  0  0 100  0

2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:

root@ubuntu:~# vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
1  0      0 3499840 315836 3819660    0    0     0     1    2    0  0  0 100  0
0  0      0 3499584 315836 3819660    0    0     0     0   88  158  0  0 100  0
0  0      0 3499708 315836 3819660    0    0     0     2   86  162  0  0 100  0
0  0      0 3499708 315836 3819660    0    0     0    10   81  151  0  0 100  0
1  0      0 3499732 315836 3819660    0    0     0     2   83  154  0  0 100  0

对输出解释如下:

1)procs

a.r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;

b.b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。

2)memory

a.swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;

b.free列表示当前空闲的物理内存数量(以KB为单位);

c.buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲;

d.cache列表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。

3)swap

a.si列表示由磁盘调入内存,也就是内存进入内存交换区的数量;

b.so列表示由内存调入磁盘,也就是内存交换区进入内存的数量

c.一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存。

4)IO

a.bi列表示从块设备读入的数据总量(即读磁盘,单位KB/秒)

b.bo列表示写入到块设备的数据总量(即写磁盘,单位KB/秒)

这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。

5)system

a.in列表示在某一时间间隔中观察到的每秒设备中断数;

b.cs列表示每秒产生的上下文切换次数。上面这两个值越大,会看到内核消耗的CPU时间就越多。

6)CPU

a.us列显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。

b.sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,就说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。

c.id列显示了CPU处在空闲状态的时间百分比;

d.wa列表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。

e.st列一般不关注,虚拟机占用的时间百分比。 (Linux 2.6.11)

参考博文:Linux vmstat命令实战详解

pidstat

细致观察进程
需要安装
– 监控CPU
– 监控IO
– 监控内存

[root@ebus-provider-01 ~]# yum  install sysstat

执行pidstat,将输出系统启动后所有活动进程的cpu统计信息:

[root@ebus-provider-01 ~]# pidstat
Linux 2.6.32-573.el6.x86_64 (ebus-provider-01)  05/05/2017      _x86_64_        (4 CPU)

11:33:30 AM       PID    %usr %system  %guest    %CPU   CPU  Command
11:33:30 AM         1    0.00    0.00    0.00    0.00     1  init
11:33:30 AM         3    0.00    0.00    0.00    0.00     0  migration/0
11:33:30 AM         4    0.00    0.00    0.00    0.00     0  ksoftirqd/0

以上输出,除最开头一行显示内核版本、主机名、日期和cpu架构外,主要列含义如下:

11:37:19: pidstat获取信息时间点

PID: 进程pid

%usr: 进程在用户态运行所占cpu时间比率

%system: 进程在内核态运行所占cpu时间比率

%CPU: 进程运行所占cpu时间比率

CPU: 指示进程在哪个核运行

Command: 拉起进程对应的命令

指定采样周期和采样次数

pidstat命令指定采样周期和采样次数,命令形式为”pidstat [option] interval [count]”,以下pidstat输出以2秒为采样周期,输出10次cpu使用统计信息:

pidstat 2 10

cpu使用情况统计(-u)

使用-u选项,pidstat将显示各活动进程的cpu使用统计,执行”pidstat -u”与单独执行”pidstat”的效果一样。

内存使用情况统计(-r)

使用-r选项,pidstat将显示各活动进程的内存使用统计:

linux:~ # pidstat -r -p 13084 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

15:08:18          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
15:08:19        13084 133835.00      0.00 15720284 15716896  96.26  mmmm
15:08:20        13084  35807.00      0.00 15863504 15849756  97.07  mmmm
15:08:21        13084  19273.87      0.00 15949040 15792944  96.72  mmmm

以上各列输出的含义如下:

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:  拉起进程对应的命令

IO情况统计(-d)
使用-d选项,我们可以查看进程IO的统计信息:

linux:~ # pidstat -d 1 2
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_
17:11:36          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:37        14579 124988.24      0.00      0.00  dd
17:11:37          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:38        14579 105441.58      0.00      0.00  dd

输出信息含义

kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)

kB_ccwr/s: 该进程每秒取消磁盘写入的数量(以kB为单位)
Command: 拉起进程对应的命令

针对特定进程统计(-p)

使用-p选项,我们可以查看特定进程的系统资源使用情况:

linux:~ # pidstat -r -p 1 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

18:26:17          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
18:26:18            1      0.00      0.00   10380    640   0.00  init
18:26:19            1      0.00      0.00   10380    640   0.00  init
……


pidstat常用命令

使用pidstat进行问题定位时,以下命令常被用到:

pidstat -u 1
pidstat -r 1
pidstat -d 1

以上命令以1秒为信息采集周期,分别获取cpu、内存和磁盘IO的统计信息。

-t 列出线程统计信息 -p 指定进程 –u 监控CPU 每秒采样 一共3次

[root@ebus-provider-01 ~]# pidstat -p 3403 -u 1 1 -t
Linux 2.6.32-573.el6.x86_64 (ebus-provider-01)  05/05/2017      _x86_64_        (4 CPU)

11:43:01 AM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
11:43:02 AM      3403         -    0.00    0.00    0.00    0.00     3  java
11:43:02 AM         -      3403    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3404    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3405    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3406    0.00    0.00    0.00    0.00     0  |__java
11:43:02 AM         -      3407    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3408    0.00    0.00    0.00    0.00     2  |__java
11:43:02 AM         -      3409    0.00    0.00    0.00    0.00     2  |__java
11:43:02 AM         -      3410    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3411    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3412    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3413    0.00    0.00    0.00    0.00     2  |__java
11:43:02 AM         -      3414    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3415    0.00    0.00    0.00    0.00     0  |__java
11:43:02 AM         -      3416    0.00    0.00    0.00    0.00     2  |__java
11:43:02 AM         -      3417    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3418    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3419    0.00    0.00    0.00    0.00     2  |__java
11:43:02 AM         -      3420    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3421    0.00    0.00    0.00    0.00     0  |__java
11:43:02 AM         -      3424    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3425    0.00    0.00    0.00    0.00     0  |__java
11:43:02 AM         -      3426    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3427    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3428    0.00    0.00    0.00    0.00     3  |__java
11:43:02 AM         -      3429    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      3430    0.00    0.00    0.00    0.00     1  |__java
11:43:02 AM         -      4402    0.00    0.00    0.00    0.00     2  |__jav

上面的TID 表示是线程id

jps

– 列出java进程,类似于ps命令
– 参数-q可以指定jps只输出进程ID ,不输出类的短名称
– 参数-m可以用于输出传递给Java进程(主函数)的参数
– 参数-l可以用于输出主函数的完整路径
– 参数-v可以显示传递给JVM的参数

[root@ebus-provider-01 ~]#
[root@ebus-provider-01 ~]# jps
26018 Jps
1859 QuorumPeerMain
3403 Bootstrap

[root@ebus-provider-01 ~]# jps -v
26609 Jps -Denv.class.path=.:/usr/local/jdk1.8.0_111/lib/dt.jar:/usr/local/jdk1.8.0_111/lib/tools.jar:/usr/local/jdk1.8.0_111/jre/lib -Dapplication.home=/usr/local/jdk1.8.0_111 -Xms8m
1859 QuorumPeerMain -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false
3403 Bootstrap -Djava.util.logging.config.file=/root/apache-tomcat-8.0.30/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms12m -Xmx25m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/usr/local/tomcat/logs/gc.log -Djava.endorsed.dirs=/root/apache-tomcat-8.0.30/endorsed -Dcatalina.base=/root/apache-tomcat-8.0.30 -Dcatalina.home=/root/apache-tomcat-8.0.30 -Djava.io.tmpdir=/root/apache-tomcat-8.0.30/temp
[root@ebus-provider-01 ~]#


jinfo

– 可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数
– -flag <name>:打印指定JVM的参数值
– -flag [+|-]<name>:设置指定JVM参数的布尔值
– -flag <name>=<value>:设置指定JVM参数的值
显示了新生代对象晋升到老年代对象的最大年龄:

[root@ebus-provider-01 ~]#  jinfo -flag MaxTenuringThreshold 3403
-XX:MaxTenuringThreshold=15
[root@ebus-provider-01 ~]#

显示是否打印GC详细信息:

[root@ebus-provider-01 ~]# jinfo -flag PrintGCDetails 3403
-XX:+PrintGCDetails
[root@ebus-provider-01 ~]#

运行时修改参数,控制是否输出GC日志

[root@ebus-provider-01 ~]#  jinfo -flag PrintGCDetails 3403
-XX:-PrintGCDetails
[root@ebus-provider-01 ~]# jinfo -flag +PrintGCDetails 3403
[root@ebus-provider-01 ~]#  jinfo -flag PrintGCDetails 3403
-XX:+PrintGCDetails
[root@ebus-provider-01 ~]#


jmap

– 生成Java应用程序的堆快照和对象的统计信息

[root@ebus-provider-01 ~]# jmap -histo 3403 > ./histo.txt
[roott@ebus-provider-01 ~]# vim histo.txt

num     #instances         #bytes  class name
----------------------------------------------
1:          2642        4994448  [B
2:         31694        4057992  [C
3:         31067         745608  java.lang.String
4:         18884         604288  java.util.HashMap$Node
5:          2623         550224  [I
6:          4968         437184  java.lang.reflect.Method
7:          5778         339672  [Ljava.lang.Object;
8:          2779         315464  java.lang.Class
9:          1337         232424  [Ljava.util.HashMap$Node;
10:          4459         142688  java.util.concurrent.ConcurrentHashMap$Node
11:          2123         101904  java.util.HashMap
12:          4714         101672  [Ljava.lang.Class;
13:          1952          78080  java.util.LinkedHashMap$Entry
14:          3198          76752  java.util.ArrayList
15:          1506          72288  org.apache.tomcat.util.digester.CallMethodRule
16:          1130          57496  [Ljava.lang.String;
17:          3545          56720  java.lang.Object
18:            83          48912  [Ljava.util.concurrent.ConcurrentHashMap$Node;
19:          1446          46272  java.util.Hashtable$Entry
20:          1104          44160  java.lang.ref.Finalizer
21:           357          42608  [Ljava.lang.reflect.Method;
22:           826          39648  org.apache.tomcat.util.modeler.AttributeInfo
23:          1210          38720  com.sun.org.apache.xerces.internal.xni.QName
24:           390          31200  java.lang.reflect.Constructor
25:           386          27792  java.lang.reflect.Field
26:           546          26208  java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
27:          1004          24096  java.util.LinkedList$Node
28:           250          24000  java.util.jar.JarFile$JarFileEntry
29:           415          23240  java.util.zip.ZipFile$ZipFileInflaterInputStream
30:           415          23240  java.util.zip.ZipFile$ZipFileInputStream
31:           698          22336  java.util.concurrent.locks.ReentrantLock$NonfairSync
32:           305          21960  java.util.logging.Logger
33:           368          20608  java.lang.Class$ReflectionData
34:           157          20384  [Ljava.util.Hashtable$Entry;
35:           599          19168  javax.management.MBeanAttributeInfo
36:           476          19040  java.lang.ref.SoftReference
37:           236          16992  org.apache.tomcat.util.net.jsse.openssl.Cipher
38:           415          16600  java.math.BigInteger
39:           385          15400  org.apache.tomcat.util.digester.CallParamRule
40:           311          14928  java.util.logging.LogManager$LoggerWeakRef
41:           358          14320  javax.servlet.jsp.tagext.TagAttributeInfo
42:           569          13656  java.util.concurrent.Co


Dump堆

jmap pid #打印内存使用的摘要信息

jmap –heap pid #java heap信息

jmap -histo:live pid #统计对象count ,live表示在使用

jmap -histo pid >mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件

jmap -dump:format=b,file=mem.dat pid #将内存使用的详细情况输出到mem.dat 文件

[root@ebus-provider-01 ~]# jmap -dump:format=b,file=./heap.hprof 3403
Dumping heap to /root/heap.hprof ...
Heap dump file created
[root@ebus-provider-01 ~]# ll
total 96044
-rw-------.  1 root root     1123 Apr 15 14:47 anaconda-ks.cfg
drwxr-xr-x.  9 root root     4096 May  4 16:02 apache-tomcat-8.0.30
-rw-r--r--.  1 root root  9150593 Jan  7  2016 apache-tomcat-8.0.30.tar.gz
-rw-------.  1 root root 20562581 May  5 12:23 heap.hprof
-rw-r--r--.  1 root root    91099 May  5 12:22 histo.txt
-rw-r--r--.  1 root root    25552 Apr 15 14:47 install.log
-rw-r--r--.  1 root root     5890 Apr 15 14:44 install.log.syslog
-rw-r--r--.  1 root root  5631764 Apr 25 16:54 logs
-rw-r--r--.  1 root root 45044970 Apr 25 15:34 ROOT.war
-rw-r--r--.  1 root root    91164 May  4 20:10 tet2.txt
-rw-r--r--.  1 root root        0 May  4 20:09 tet.txt
drwxr-xr-x. 10 1000 1000     4096 Feb 20  2014 zookeeper-3.4.6
-rw-r--r--.  1 root root 17699306 Oct 31  2014 zookeeper-3.4.6.tar.gz
[root@ebus-provider-01 ~]#


jstack

– 打印线程dump
– -l 打印锁信息
– -m 打印java和native的帧信息
– -F 强制dump,当jstack没有响应时使用

[root@ebus-provider-01 ~]# jstack 3403 >>./a.txt
[root@ebus-provider-01 ~]# ll
total 96056
-rw-------.  1 root root     1123 Apr 15 14:47 anaconda-ks.cfg
drwxr-xr-x.  9 root root     4096 May  4 16:02 apache-tomcat-8.0.30
-rw-r--r--.  1 root root  9150593 Jan  7  2016 apache-tomcat-8.0.30.tar.gz
-rw-r--r--.  1 root root    10969 May  5 12:25 a.txt


jvm 常用监控工具有:

jdk自带的 JConsole,jvisualvm

其他工具 MemoryAnalyzer,jprofiler(推荐,功能强大

参考博文

JProfiler使用详细教程学习笔记

jprofiler 查看程序内存泄露

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: