這篇文章主要介紹一些常用的linux服務器性能監控命令,包括命令的常用參數、指標的含義以及一些交互操作。
幾個問題
命令本身並不復雜,關鍵是你對操作系統基礎知識的掌握和理解,先來看看下面幾個問題:
- CPU、內存以及硬盤的關系是怎樣的?
- 進程和線程是什么?有什么區別?有什么優缺點?
- 什么是物理內存?什么是虛擬內存?什么時候要用到虛擬內存?
- 什么是CPU中斷?CPU上下文切換?CPU缺頁計算?
- 怎么理解系統負載?如何通過load average的值來判斷系統負載是否過高?
- ...
相信基礎好的司機心里已經有個大致的答案,那如果你一知半解,請仔細閱讀全文,部分答案會在相關的命令講解中揭曉。對於理解錯誤或者不到位的地方希望老司機不吝賜教。
free
free 命令是監控linux 內存使用最常用的命令,參數[-m]表示以M 為單位查看內存使用情況(默認為kb)。
[root@localhost ~]# free -m
total used free shared buffers cached Mem: 482 130 352 0 9 36
-/+ buffers/cache: 83 399 Swap: 991 0 991
- Mem:物理內存大小。
- total:總計物理內存的大小。
- used:已使用多大。
- free:可用有多少。
- shared:多個進程共享的內存總額。
- buffers:緩沖區內存總量。
- cached:交換區緩沖區內存總量。
- 第三行(-/+ buffers/cached):系統的物理內存真實使用量,可通過used-buffers-cached計算得到,因為buffers和cached也是占用物理內存得來,可以通過釋放它們來獲得這部分內存。
- Swap:交換區總量,也叫虛擬內存。
那么,什么是虛擬內存?

現在明白什么是虛擬內存,什么時候要用到虛擬內存了吧。所以,當你在監控linux操作系統的時候,如果發現系統使用了交換內存,那么說明系統的 ** 物理內存已經用完了**,需要排查是哪些程序占用了物理內存,對內存進行進一步的深入分析。還有一點要說的就是,交換內存的速度是非常慢的。
uptime
uptime 命令是監控系統性能最常用的一個命令,主要是來統計系統當前的運行狀態,即負載情況。
[root@localhost~]# uptime
05:41:01 up 3 min, 1 user, load average: 0.23, 0.33, 0.15
輸出信息依次是:系統現在的時間,系統從上次開機到現在運行了多長時間,系統當前有多少個登錄用戶,系統在1分鍾內、5 分鍾內、15 分鍾內的平均負載。
如果load average值長期大於系統CPU的個數則說明CPU很繁忙,負載很高,可能會影響系統性能,導致系統卡頓響應時間長等等。
load average值與系統CPU的個數對比怎么理解?load average的值表示在單位時間內運行的進程數,而CPU一個內核同一時間只能處理一個進程,一台16核CPU的服務器如果load average大於16,那說明系統正處於超負荷運行狀態。
vmstat
vmstat 可以對操作系統的內存信息、進程狀態、CPU 活動、磁盤等信息進行監控,不足之處是無法對某個進程進行深入分析。
[root@localhost~]# vmstat 2 3 -S M
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 235 11 88 0 0 32 2 21 23 0 1 98 1 0 0 0 0 235 11 88 0 0 0 0 16 19 0 0 100 0 0 0 0 0 235 11 88 0 0 0 0 13 19 0 0 100 0 0
2表示每2秒取樣一次,3表示取數3次,-S表示單位,可選有 k 、K 、m 、M。
-
procs
R 列表示運行和等待 CPU 時間片的進程數,這個值如果長期大於系統 CPU 個數,說明CPU 不足,需要增加 CPU。
B 列表示在等待資源的進程數,比如正在等待 I/O 或者內存交換等。 -
memory
swpd 列表示切換到內存交換區的內存大小(單位 KB),通俗講就是虛擬內存的大小。如果 swap 值不為 0 或者比較大, 只要 si、so 的值長期為 0,這種情況一般屬於正常情況
free 列表示當前空閑的物理內存(單位 KB) 。
buff 列表示 buffers cached 內存大小,也就是緩沖區大小,一般對塊設備的讀寫才需要緩沖。
cache 列表示 page cached 的內存大小,也就是緩存大小,一般作為文件系統進行緩沖,頻繁訪問的文件都會被緩存,如果 cache 值非常大說明緩存文件比較多,如果此時 io中的 bi 比較小,說明文件系統效率比較好。 -
swap
si 列表示由磁盤調入內存,也就是內存進入內存交換區的內存大小。
so 列表示由內存進入磁盤,也就是有內存交換區進入內存的內存大小。
一般情況下,si、so 的值都為 0,如果 si、so 的值長期不為 0,則說明系統內存不足,需要增加系統內存。 -
io
bi 列表示由塊設備讀入數據的總量,即讀磁盤,單位 kb/s。
bo 列表示寫到塊設備數據的總量,即寫磁盤,單位 kb/s。
如果 bi+bo 值過大,且 wa 值較大,則表示系統磁盤 IO 瓶頸。 -
system
in 列表示某一時間間隔內觀測到的每秒設備中斷數。
cs 列表示每秒產生的上下文切換次數。
這 2 個值越大,則由內核消耗的 CPU 就越多。 -
cpu
us 列表示用戶進程消耗的 CPU 時間百分比,us 值越高,說明用戶進程消耗 cpu 時間越多,如果長期大於 50%,則需要考慮優化程序或者算法。
sy 列表示系統內核進程消耗的 CPU 時間百分比,一般來說 us+sy 應該小於 80%,如果大於 80%,說明可能處於 CPU 瓶頸。
id 列表示 CPU 處在空閑狀態的時間百分比。
wa 列表示 IP 等待所占的 CPU 時間百分比,wa 值越高,說明 I/O 等待越嚴重,根據經驗 wa 的參考值為 20%,如果超過 20%,說明 I/O 等待嚴重,引起 I/O 等待的原因可能是磁盤大量隨機讀寫造成的, 也可能是磁盤或者此哦按監控器的貸款瓶頸 (主要是塊操作)造成的。
vmstat命令的結果顯示比較全面,可以看到操作系統的內存信息、進程狀態、CPU 活動、磁盤等信息,不足之處是無法對某個進程進行深入分析。但是以上每一列的含義都是要重點掌握!具體的參數和用法在這里就不列舉了,需要的可自行百度了解。
sar
好吧,我只是為了引起大家的注意。
sar 是非常強大性能分析命令,通過 sar 命令可以全面的獲取系統的 CPU、運行隊列、磁盤 I/O、交換區、內存、cpu 中斷、網絡等性能數據。老司機必備!
sar安裝直接yum install -y sysstat,這里有個坑就是安裝完成后直接使用的話會報錯,提示文件不存在,解決辦法是先執行sar -o 2 3,來生成所需文件,之后使用就正常啦。
sar監控CPU
[root@localhost~]# sar -u 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 06時58分50秒 CPU %user %nice %system %iowait %steal %idle 06時58分52秒 all 0.00 0.00 0.50 0.00 0.00 99.50 06時58分54秒 all 0.00 0.00 0.50 0.00 0.00 99.50 06時58分56秒 all 0.00 0.00 0.50 0.00 0.00 99.50 平均時間: all 0.00 0.00 0.50 0.00 0.00 99.50
2表示每2秒取樣一次,3表示取數3次,-u表示CPU使用率。
- %usr:用戶進程消耗的 CPU 時間百分比。
- %nice: 運行正常進程消耗的 CPU 時間百分比。
- %system:系統進程消耗的 CPU 時間百分比。
- %iowait:I/O 等待所占 CPU 時間百分比。
- %steal:在內存緊張環境下,pagein 強制對不同的頁面進行的 steal 操作。虛擬服務占用的CPU時間百分比,這個值一般為0.
- %idle:CPU 空閑狀態的時間百分比。
在所有的顯示中,我們應主要注意%iowait 和%idle,%iowait 的值過高,表示硬盤存在 I/O 瓶頸, %idle 值高,表示 CPU 較空閑,如果%idle 值高但系統響應慢時,有可能是 CPU 等待分配內存, 此時應加大內存容量。%idle 值如果持續低於 10,那么系統的 CPU 處理能力相對較低,表 明系統中最需要解決的資源是 CPU。
[root@localhost~]# sar -q 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 07時16分31秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 07時16分33秒 0 118 0.16 0.07 0.09 07時16分35秒 0 118 0.16 0.07 0.09 07時16分37秒 0 118 0.15 0.07 0.09 平均時間: 0 118 0.16 0.07 0.09
2表示每2秒取樣一次,3表示取數3次,-q顯示運行隊列的大小,它與系統當時的平均負載相同。
- runq-sz:運行隊列的長度(等待運行的進程數) 。
- plist-sz:進程列表中進程(processes)和線程(threads)的數量。
- ldavg-1:最后 1 分鍾的系統平均負載(System load average) 。
- ldavg-5:過去 5 分鍾的系統平均負載。
- ldavg-15:過去 15 分鍾的系統平均負載。
sar監控內存
[root@localhost~]# sar -r 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 07時22分04秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 07時22分06秒 241108 269556 52.79 12736 90360 543584 21.11 07時22分08秒 241108 269556 52.79 12736 90360 543584 21.11 07時22分10秒 241108 269556 52.79 12736 90360 543584 21.11 平均時間: 241108 269556 52.79 12736 90360 543584 21.11
2表示每2秒取樣一次,3表示取數3次,-r顯示顯示系統內存使用情況。
- kbmemfree: 這個值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空間。
- kbmemused:這個值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空間。
- %memused:這個值是 kbmemused 和內存總量(不包括 swap)的一個百分比。
- kbbuffers 和 kbcached:這兩個值就是 free 命令中的 buffer 和 cache。
- kbcommit:保證當前系統所需要的內存,即為了確保不溢出而需要的內存(RAM+swap)。
- %commit:這個值是 kbcommit 與內存總量(包括 swap)的一個百分比。
[root@localhost~]# sar -B 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 07時26分26秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 07時26分28秒 0.00 0.00 18.91 0.00 52.24 0.00 0.00 0.00 0.00 07時26分30秒 0.00 0.00 19.60 0.00 52.76 0.00 0.00 0.00 0.00 07時26分32秒 0.00 5.97 15.42 0.00 52.24 0.00 0.00 0.00 0.00 平均時間: 0.00 2.00 17.97 0.00 52.41 0.00 0.00 0.00 0.00
2表示每2秒取樣一次,3表示取數3次,-B顯示系統內存分頁情況。
- pgpgin/s:表示每秒從磁盤或 SWAP 置換到內存的字節數(KB)。
- pgpgout/s:表示每秒從內存置換到磁盤或 SWAP 的字節數(KB)。
- fault/s:每秒鍾系統產生的缺頁數,即主缺頁與次缺頁之和(major + minor)。
- majflt/s:每秒鍾產生的主缺頁數。
[[root@localhost~]# sar -W 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 08時31分10秒 pswpin/s pswpout/s 08時31分12秒 0.00 0.00 08時31分14秒 0.00 0.00 08時31分16秒 0.00 0.00 平均時間: 0.00 0.00
2表示每2秒取樣一次,3表示取數3次,-W顯示系統虛擬內存分頁情況。
- pswpin/s:每秒系統換入的交換頁面(swap page)數量。
- pswpout/s:每秒系統換出的交換頁面(swap page)數量。
sar監控I/O
[root@localhost~]# sar -b 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 08時36分27秒 tps rtps wtps bread/s bwrtn/s 08時36分29秒 0.00 0.00 0.00 0.00 0.00 08時36分31秒 0.00 0.00 0.00 0.00 0.00 08時36分33秒 0.00 0.00 0.00 0.00 0.00 平均時間: 0.00 0.00 0.00 0.00 0.00
2表示每2秒取樣一次,3表示取數3次,-b顯示緩沖區使用情況。
- tps:每秒鍾物理設備的 I/O 傳輸總量。
- rtps:每秒鍾從物理設備讀入的數據總量。
- wtps:每秒鍾向物理設備寫入的數據總量。
- bread/s:每秒鍾從物理設備讀入的數據量,單位為 塊/s。
- bwrtn/s:每秒鍾向物理設備寫入的數據量,單位為 塊/s。
sar監控文件和內核
[root@localhost~]# sar -v 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 09時43分12秒 dentunusd file-nr inode-nr pty-nr 09時43分14秒 4466 768 11506 1 09時43分16秒 4466 768 11506 1 09時43分18秒 4466 768 11506 1 平均時間: 4466 768 11506 1
2表示每2秒取樣一次,3表示取數3次,-v顯示進程、節點、文件和鎖表狀態。
- inode-sz:目前核心中正在使用或分配的節點表的表項數,由核心參數 MAX-INODE 控制。
- file-sz:目前核心中正在使用或分配的文件表的表項數, 由核心參數 MAX-FILE 控 制。
- super-sz:溢出出現的次數。
- dentunusd:目錄高速緩存中未被使用的條目數量 。
sar監控設備使用情況
[root@localhost~]# sar -d 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) 09時37分46秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 09時37分48秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 09時37分48秒 dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 09時37分48秒 dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2表示每2秒取樣一次,3表示取數3次,-d顯示設備使用情況。
- tps:每秒從物理磁盤 I/O 的次數.多個邏輯請求會被合並為一個 I/O 磁盤請求,一次傳輸的大小是不確定的。
- rd_sec/s:每秒讀扇區的次數。
- wr_sec/s:每秒寫扇區的次數。
- avgrq-sz:平均每次設備 I/O 操作的數據大小(扇區)。
- avgqu-sz:磁盤請求隊列的平均長度。
- await:從請求磁盤操作到系統完成處理,每次請求的平均消耗時間,包括請求隊列等待時間,單位是毫秒(1 秒=1000 毫秒)。
- svctm:系統處理每次請求的平均時間,不包括在請求隊列中消耗的時間。
- %util:I/O 請求占 CPU 的百分比,比率越大,說明越飽和。
- avgqu-sz 的值較低時,設備的利用率較高。
- 當%util 的值接近 1% 時,表示設備帶寬已經占滿。
- await-svctm=io等待時間。
sar總結
- 要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來
- 懷疑 CPU 存在瓶頸,可用 sar -u 和 sar -q 等來查看
- 懷疑內存存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來查看
- 懷疑 I/O 存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來查看
- 參數列表
-u:CPU 利用率
-v:進程、節點、文件和鎖表狀態。
-d:硬盤使用報告。
-q:顯示運行隊列的大小,它與系統當時的平均負載相同
-B:內存分頁情況
-b:緩沖區使用情況。
-W:系統交換活動,虛擬內存。
iostat
iostat 是對系統的磁盤 I/O 操作進行監控,它的輸出主要顯示磁盤讀寫操作的統計信息,同時給出 CPU 的使用情況。同 vmstat 一樣,iostat 不能對某個進程進行深入分析,僅對操作系統的整體情況進行分析。
iostat監控磁盤
[root@localhost~]# iostat -x
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.04 0.00 0.30 0.23 0.00 99.43 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.16 0.07 0.23 0.12 13.67 1.51 43.06 0.01 22.07 8.37 49.13 11.15 0.39 dm-0 0.00 0.00 0.31 0.19 13.08 1.50 29.58 0.01 29.07 18.88 45.61 7.92 0.39 dm-1 0.00 0.00 0.02 0.00 0.15 0.00 8.00 0.00 5.47 5.47 0.00 4.12 0.01
-x顯示所有磁盤分區的情況。
- rrqm/s:每秒進行 merge 的讀操作數目,即 delta(rmerge)/s 。
- wrqm/s:每秒進行 merge 的寫操作數目,即 delta(wmerge)/s 。
- r/s:每秒完成的讀 I/O 設備次數,即 delta(rio)/s 。
- w/s: 每秒完成的寫 I/O 設備次數,即 delta(wio)/s 。
- rsec/s:每秒讀扇區數,即 delta(rsect)/s。
- wsec/s:每秒寫扇區數,即 delta(wsect)/s
- rkB/s:每秒讀 K 字節數,是 rsect/s 的一半,因為每扇區大小為 512 字節。
- wkB/s:每秒寫 K 字節數,是 wsect/s 的一半
- avgrq-sz:平均每次設備 I/O 操作的數據大小 (扇區),即
delta(rsect+wsect)/delta(rio+wio) 。 - avgqu-sz:平均 I/O 隊列長度,即 delta(aveq)/s/1000 (因為 aveq 的單位為毫秒)。
- Await: 平均每次設備 I/O 操作的等待時間 (毫秒), 即 delta(ruse+wuse)/delta(rio+wio) 。
- **Svctm:平均每次設備 I/O 操作的服務時間 (毫秒),即delta(use)/delta(rio+wio) **
- %util:一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的,即 delta(use)/s/1000 (因為 use 的單位為毫秒) 。
[root@localhost~]# iostat -d
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.35 13.40 1.50 212052 23818 dm-0 0.49 12.82 1.50 202898 23800 dm-1 0.02 0.15 0.00 2400 0
-d顯示磁盤使用情況。
- tps:每秒從物理磁盤 I/O 的次數.多個邏輯請求會被合並為一個 I/O 磁盤請求,一次傳輸的大小是不確定的。磁盤的一次讀或者寫都是一次 I/O 操作
- Blk_read/s:每秒讀取的數據塊數。
- Blk_wrtn/s :每秒寫入的數據塊數。
- Blk_read:讀取的所有塊數。
- Blk_wrtn :寫入的所有塊數。
iostat監控CPU
[root@localhost~]# iostat -c 2 3
Linux 2.6.32-573.22.1.el6.i686 (localhost) 2016年11月02日 _i686_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.04 0.00 0.29 0.24 0.00 99.43 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.50 0.00 0.00 99.50
-c顯示系統CPU使用情況,2表示時間間隔2s,3表示取數3次。
- %usr:用戶進程消耗的 CPU 時間百分比。
- %nice: 運行正常進程消耗的 CPU 時間百分比。
- %system:系統進程消耗的 CPU 時間百分比。
- %iowait:I/O 等待所占 CPU 時間百分比。
- %steal:在內存緊張環境下,pagein 強制對不同的頁面進行的 steal 操作。
- %idle:CPU 空閑狀態的時間百分比。
top
我想這個命令大家肯定已經相當熟悉,甚至有些童鞋有用過。top 命令能夠實時監控系統的運行狀態, 並且可以按照 CPU、 內存和執行時間進行排序,同時 top 命令還可以通過交互式命令進行設定顯示,通過 top 命令可以查看即時活躍的進程。
top - 05:57:44 up 2 min, 1 user, load average: 0.47, 0.37, 0.15 Tasks: 92 total, 1 running, 91 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Mem: 510664k total, 268192k used, 242472k free, 11464k buffers Swap: 2064380k total, 0k used, 2064380k free, 90252k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 745 root 20 0 0 0 0 S 0.3 0.0 0:00.04 flush-253:0 1724 root 20 0 12468 3392 2640 S 0.3 0.7 0:00.45 sshd 1 root 20 0 2900 1408 1204 S 0.0 0.3 0:03.05 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/0 7 root 20 0 0 0 0 S 0.0 0.0 0:00.19 events/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_long/0 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events_power_ef 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm 16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default 18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0 19 root 20 0 0 0 0 S 0.0 0.0 0:00.21 kblockd/0 20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid 21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify 22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug 23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux 24 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ata_sff/0 25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd 26 root 20 0 0 0 0 S 0.0 0.0 0:00.01 khubd
直接在命令行輸入top回車之后就可以看到上面的效果了,內容是不是很豐富,先逐個介紹參數的含義。
其實不難發現,top包含了前面介紹的一些命令的結果,如uptime、free、iostat等,那除了內容比較全面之外,top還提供了一些交互操作,讓我們能更進一步的分析系統性能。
下面我介紹幾個常用的交互操作:
-
展開Cpu(s)
在top交互界面直接按鍵盤的數字1。
這里還是要強調一下,%cpu的值是跟內核數成正比的,如8核cpu的%cpu最大可以800%。 -
顯示線程
在top交互界面按ctrl+h顯示線程,再按一次關閉顯示。 -
幫助
在top交互界面按h進入幫助界面。 -
增加或刪除顯示列
在top交互界面按h進入,輸入想顯示的列的首字母如n,退出直接回車。 -
排序
Cpu : 在top交互界面按shift+p。
Mem :在top交互界面按shift+m。
Time :在top交互界面按shift+t。 -
顯示程序名
在top交互界面按c。 -
監控進程下的線程
在命令行輸入top -H -p pid,其中pid為進程id,進入界面后顯示的PID為線程ID;或者使用命令top -H -p pid進入界面之后在按shift+h來顯示線程。
netstat
Netstat 命令用於顯示本機網絡連接、運行端口、路由表等信息,常用命令有兩個netstat -plnt和netstat -i,我們來看看。
[root@localhost~]# netstat -i
Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth1 1500 0 4249 0 0 0 5786 0 0 0 BMRU lo 65536 0 0 0 0 0 0 0 0 0 LRU
- Iface:表示網絡設備的接口名稱。
- MTU:表示最大傳輸單元,單位為字節。
- RX-OK/TX-OK:表示已經准確無誤地接收/發送了多少數據包。
- RX-ERR/TX-ERR:表示接收/發送數據包時候產生了多少錯誤。
- RX-DRP/TX-DRP:表示接收/發送數據包時候丟棄了多少數據包。
- RX-OVR/TX-OVR:表示由於誤差而丟失了多少數據包。
- Flg 表示接口標記,其中
B 已經設置了一個廣播地址。
L 該接口是一個回送設備。
M 接收所有數據包(混亂模式) 。
N 避免跟蹤。
O 在該接口上,禁用 AR P。
P 這是一個點到點鏈接。
R 接口正在運行。
U 接口處於“活動”狀態。 - 其中 RX-ERR/TX-ERR、 RX-DRP/TX-DRP 和 RX-OVR/TX-OVR 的值應該都為 0,如果不為 0,並且很大,那么網絡質量肯定有問題,網絡傳輸性能也一代會下降。
[root@localhost~]# netstat -plnt
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1073/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1152/master tcp 0 0 :::3306 :::* LISTEN 1623/mysqld tcp 0 0 :::80 :::* LISTEN 1209/httpd tcp 0 0 :::21 :::* LISTEN 1265/proftpd tcp 0 0 :::22 :::* LISTEN 1073/sshd tcp 0 0 ::1:25 :::* LISTEN 1152/master tcp 0 0 :::443 :::* LISTEN 1209/httpd
- Proto :協議
- Recv-Q:表示接收隊列。
- Send-Q :表示發送隊列。
- LocalAddress :表示本地機器名、端口
- Foreign Address :表示遠程機器名、端口
- State:表示狀態,其中
LISTEN :在監聽狀態中。
ESTABLISHED:已建立聯機的聯機情況。
TIME_WAIT:該聯機在目前已經是等待的狀態。 - PID/Program name:進程id/進程名
strace
strace 常用來跟蹤進程執行時的系統調用和所接收的信號。 在 Linux 世界,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace 可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。
那在什么情況下需要用到strace呢?比如用戶CPU高的時候,你可以通過dump線程棧等方式進行深入分析,而系統CPU高時,先分析I/O,此時如果I/O高那么就可以確定是I/O問題了,如果I/O不高,那么想進一步分析就需要用到strace啦。
[root@localhost~]# strace -c -f -r -t -p 1724
Process 1724 attached ^CProcess 1724 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ----------------
100.00 0.000039 20 2 read 0.00 0.000000 0 2 write 0.00 0.000000 0 3 select 0.00 0.000000 0 8 rt_sigprocmask ------ ----------- ----------- --------- --------- ----------------
100.00 0.000039 15 total
以上命令中-p 172的172指的是你的進程id。
- % time :調用該行命令占總時間的百分比
- Seconds :調用總時長
- usecs/call :用戶調用次數
- Calls:系統調用次數
- Errors:錯誤總數
- Syscall:調用的內核命令
總結
篇幅比較長,讀起來難免枯燥,學習linux監控我認為首先要知道它有哪些命令,分別能做什么,其次要掌握每個命令的用法,最后一定要了解命令輸出參數的含義。做到以上幾點,我覺得你就已經具備了簡單的監控和分析的能力,這個再去使用一些監控工具,就so easy了。
我的答案
-
CPU、內存以及硬盤的關系?
我們都知道,CPU是計算機的大腦,主要負責計算和邏輯判斷,且自帶一塊容量比較小的高速緩存區,內存是CPU運行時數據存儲的空間,硬盤的作用是數據保存。那么他們的工作流程到底是怎么樣的呢,還是先看一個比較形象的例子。
把CPU比喻成車間工人,每個工人看做一個CPU內核,把內存比喻成車間,硬盤比喻成倉庫。車間的物件(數據)來自於倉庫,車間工人在車間工作,處理車間內的物件(數據),當車間內的物件(數據)處理好后存放回倉庫。很明顯,車間越大車間工人越多,那么整個工廠單位時間能干的活也就越多。 -
buff和cach的區別?
buff:緩沖區,在進程通信時由於設備讀寫速度不一致產生,慢的一方先將數據存放到buff中,達到一定程度存儲快的設備再讀取buffer的數據,通過buffer可以減少進程間通信需要等待的時間。
cache:緩存區,高速緩存,位於CPU和主內存之間的容量較小但速度很快的存儲器,它減少了CPU等待的時間。 -
線程與進程的區別及優缺點?
一個進程包含至少一個線程,進程是資源集合體,是系統資源分配調度的基本單位,線程是進程的執行單元,進程和線程都可以並發,進程在執行過程中擁有獨立的內存單元,而線程之間共享內存