linux系統負載命令,以及jdk內存分析經常使用命令,jvm性能監控內存泄漏分析工具

  •   uptime
04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20
  1. 當前時間 04:03:58
  2. 系統已運行的時間 10 days, 13:19
  3. 當前在線用戶 1 user
  4. 平均負載: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 命令的執行結果。其內容以下:html

01:06:48    當前時間
up 1:22    系統運行時間,格式爲時:分
1 user    當前登陸用戶數
load average: 0.06, 0.60, 0.48    系統負載,即任務隊列的平均長度。三個數值分別爲 1分鐘、5分鐘、15分鐘前到如今的平均值。

第2、三行爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容以下:java

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:虛擬機佔用百分比

最後兩行爲內存信息。內容以下:linux

Mem:
191272k total    物理內存總量
173656k used    使用的物理內存總量
17616k free    空閒內存總量
22052k buffers    用做內核緩存的內存量
Swap: 
192772k total    交換區總量
0k used    使用的交換區總量
192772k free    空閒交換區總量
123988k cached    緩衝的交換區總量,內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋,該數值即爲這些內容已存在於內存中的交換區的大小,相應的內存再次被換出時可沒必要再對交換區寫入。

進程信息區統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。apache

序號  列名    含義
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活動的信息。這些信息反映了系統的負載狀況ubuntu

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表示只採集一次。vim

實際上,在應用過程當中,咱們會在一段時間內一直監控,不想監控直接結束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

對輸出解釋以下:tomcat

1)procs服務器

a.r列表示運行和等待CPU時間片的進程數,這個值若是長期大於系統CPU個數,就說明CPU資源不足,能夠考慮增長CPU;markdown

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 查看程序內存泄露

相關文章
相關標籤/搜索