- 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(推荐,功能强大)