04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20
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
用來得到有關進程、虛存、頁面交換空間及 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命令實戰詳解
細緻觀察進程
– 須要安裝
– 監控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架構外,主要列含義以下:
指定採樣週期和採樣次數
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 -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
– 列出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 ~]#
– 能夠用來查看正在運行的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 ~]#
– 生成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
[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 ~]#
– 打印線程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
jdk自帶的 JConsole,jvisualvm
其餘工具 MemoryAnalyzer,jprofiler(推薦,功能強大)