Linux—效能:獲取效能情況
uptime
,free
,top
原文:ofollow,noindex">Exercise 28. Performance: getting performance stats, uptime, free, top
譯者:飛龍
自豪地採用谷歌翻譯
這個練習很簡單。首先,我們需要什麼樣的效能資料?
-
CPU 使用情況:
- 它的負載如何?
- 哪些程序正在使用它?
-
記憶體使用情況:
- 使用了多少記憶體?
- 多少記憶體是空閒的?
- 多少記憶體用於快取?
- 哪些程序消耗了它?
-
磁碟使用情況:
- 執行多少輸入/輸出操作?
- 由哪個程序?
-
網路使用情況:
- 傳輸了多少資料?
- 由哪個程序?
-
程序情況:
- 有多少程序?
- 他們在做什麼 工作,還是等待什麼?
- 如果在等待什麼,它是什麼呢?CPU,磁碟,網路?
為了獲取這些情況,我們可以使用以下工具:
uptime free vmstat top
我們來看看這個程式及其輸出。
uptime
的輸出:
user1@vm1:~$ uptime #(1)(2)(3)(4)(5)(6) 03:13:58 up 4 days, 22:45,1 user,load average: 0.00, 0.00, 0.00
欄位和描述:
欄位 | 描述 |
---|---|
(1) | 當前時間。 |
(2) | 正常執行時間(啟動後的時間)。 |
(3) | 目前有多少使用者登入。 |
(4) | 過去 1 分鐘的 CPU 負載。這不是規範化的,所以負載均值為 1 意味著單個 CPU 的滿負載,但是在 4 個 CPU 的系統上,這意味著它有 75% 空閒時間。 |
(5) | 過去 5 分鐘的 CPU 負載。 |
(6) | 過去 15 分鐘的 CPU 負載。 |
free
的輸出:
user1@vm1:~$ free -mt #(1)(2)(3)(4)(5)(6) totalusedfreesharedbufferscached Mem:496267229027196 #(7)(8) -/+ buffers/cache:43453 # 9 Swap:4610461 # 10 Total:958267691
欄位和描述:
欄位 | 描述 |
---|---|
(1) | 實體記憶體總量。 |
(2) | 使用的實體記憶體總量。 |
(3) | 空閒的實體記憶體總量。 |
(4) | 共享記憶體列應該被忽略;它已經過時了。 |
(5) | 專用於快取磁碟塊的 RAM 和檔案系統元資料總量。 |
(6) | 專用於從檔案讀取的頁面的 RAM 總量。 |
(7) | 實體記憶體總量,不包括緩衝區和快取,(2)-(5)-(6) |
(8) | 空閒的實體記憶體總量,包括空閒的緩衝區和快取,(1)-(7) |
(9) | 交換檔案使用資訊。 |
(10) | 總記憶體使用資訊,包括交換記憶體 |
vmstat
輸出:
user1@vm1:~$ vmstat -S M procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- #(1,2)(3)(4)(5)(6)(7)(8)(9)(10) (11) (12,13,14,15,16) rbswpdfreebuffcachesisobiboincs us sy id wa 00022927196000011600 1000 user1@vm1:~$ vmstat -S M -a #(17)(18) procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rbswpdfreeinact activesisobiboincs us sy id wa 00011434190024211600 1000 user1@vm1:~$ vmstat -d #19(20)(21)(22)(23)(24)(25)(26)(27)(28)(29) disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectorsmstotal merged sectorsmscursec sda117063534029801761293034054633635846980019 sr00000000000 loop00000000000 user1@vm1:~$ vmstat -m | head #(30)(31)(32)(33)(34) CacheNumTotalSizePages ext3_inode_cache137001370080810 ext3_xattr008846 journal_handle17017024170 journal_head377211236 revoke_table25625616256 revoke_record12812832128 kmalloc_dma-512885128 ip6_dst_cache162432012 UDPLITEv60010248
欄位和描述:
模式 | 情況 | 欄位 | 描述 |
---|---|---|---|
虛擬記憶體 | 程序 | (1) | r:等待執行的程序數。 |
(2) | b:不間斷睡眠中的程序數。 | ||
記憶體 | (3) | swpd:使用的虛擬記憶體量。 | |
(4) | free:空閒記憶體量。 | ||
(5) | buff:用作緩衝區的記憶體量。 | ||
(6) | cache:用作快取的記憶體量。 | ||
(17) | inact:非活動記憶體量。 | ||
(18) | active:活動記憶體量。 | ||
交換 | (7) | si:從磁碟換入的記憶體量(/秒)。 | |
(8) | so:換出到磁碟的記憶體量(/秒)。 | ||
I/O | (9) | bi:從裝置接收的塊(塊/秒)。 | |
(10) | bo:傳送到裝置的塊(塊/秒)。 | ||
系統 | (11) | in:每秒中斷的次數,包括時鐘。 | |
(12) | cs:每秒上下文切換的數量。 | ||
CPU | (13) | us:執行非核心程式碼的時間。(使用者時間,包括優先的時間) | |
(14) | sy:執行核心程式碼的時間。(系統時間) | ||
(15) | id:閒置時間。在 Linux 2.5.41 之前,這包括 IO 等待時間。 | ||
(16) | wa:IO 等待時間。在 Linux 2.5.41 之前,包含在閒置時間中。 | ||
磁碟,-d
|
裝置 | (19) | 裝置名稱 |
讀 | (20) | total:成功完成的總讀取數 | |
(21) | merge:分組的讀取數(生成一個 I/O) | ||
(22) | sectors:成功讀取的分割槽 | ||
(23) | ms:用於讀取的毫秒 | ||
寫 | (24) | total:成功完成的總寫入數 | |
(25) | merge:分組的寫入數(生成一個 I/O) | ||
(26) | sectors:成功寫入的分割槽 | ||
(27) | ms:用於寫入的毫秒 | ||
I/O | (28) | cur:正在進行中的 I/O | |
(29) | s:用於 I/O 的秒數 | ||
Slab,-m
|
Slab | (30) | 快取:快取名稱 |
(31) | num:當前活動物件的數量 | ||
(32) | total:可用物件的總數 | ||
(33) | size:每個物件的大小 | ||
(34) | page:具有至少一個活動物件的頁數 |
top
的輸出:
#(1)(2)(3)(4) top - 03:22:44 up 4 days, 22:54,1 user,load average: 0.00, 0.00, 0.00 #(5)(6)(7)(8)(9) Tasks:63 total,1 running,62 sleeping,0 stopped,0 zombie #(10)(11)(12)(13)(14)(15)(16)(17) Cpu(s):0.0%us,1.1%sy,0.0%ni, 98.9%id,0.0%wa,0.0%hi,0.0%si,0.0%st #(18)(19)(20)(21) Mem:508820k total,273792k used,235028k free,27844k buffers #(22)(23)(24)(25) Swap:473080k total,0k used,473080k free,201252k cached #(26) (27)(28)(29) (30) (31) (32,33) (34)(35)(36) (37) PID USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND 1 root2008356804676 S0.00.20:05.99 init 2 root200000 S0.00.00:00.00 kthreadd 3 rootRT0000 S0.00.00:00.00 migration/0 4 root200000 S0.00.00:00.06 ksoftirqd/0 5 rootRT0000 S0.00.00:00.00 watchdog/0 6 root200000 S0.00.00:03.25 events/0 7 root200000 S0.00.00:00.00 cpuset <...>
欄位和輸出:
部分 | 欄位 | 描述 |
---|---|---|
正常執行時間 | (1) | 當前時間。 |
(2) | 正常執行時間(啟動後的時間)。 | |
(3) | 目前有多少使用者登入。 | |
(4) | 過去 1,5 和 15 分鐘內的 CPU 負載。這不是規範化的,所以負載均值為 1 意味著單個 CPU 的滿負載,但是在 4 個 CPU 的系統上,這意味著它有 75% 空閒時間。 | |
任務 | (5) | 執行程序總數。 |
(6) | 當前正在執行的程序數。 | |
(7) | 當前正在睡眠的程序數。 | |
(8) |
被停止的程序數(例如使用CTRL + Z
)。 |
|
(9) | 已經停止(“殭屍”)的程序數量,已終止,但未由其父程序回收。 | |
CPU(S) | (10) | CPU 執行不優先的使用者程序的時間。 |
(11) | CPU 執行核心及其程序的時間。 | |
(12) | CPU 執行優先的使用者程序的時間。 | |
(13) | CPU 花費的空閒時間。 | |
(14) | CPU 等待 I/O 完成的時間。 | |
(15) | CPU 維護硬體中斷的時間。 | |
(16) | CPU 維護軟體中斷的時間。 | |
(17) | 由管理程式從這個虛擬機器“偷走”的 CPU 總量,用於其他任務(例如啟動另一個虛擬機器)。 | |
記憶體/交換 | (18) | 實體記憶體總量。 |
(19) | 使用的實體記憶體總量。 | |
(20) | 完全空閒的實體記憶體。 | |
(21) | 專用於快取磁碟塊的 RAM 和檔案系統元資料總量。 | |
(22,23,24) | 總,使用和空閒交換記憶體。 | |
(25) | 專用於從檔案讀取的頁面的 RAM 總量。 | |
程序 | (26) | 任務的唯一程序 ID,它定期地包裝,儘管從未重新啟動。 |
(27) | 任務所有者的有效使用者名稱。 | |
(28) | 任務的優先順序。 | |
(29) | 任務的優先值。負的優先值表示更高的優先順序,而正的優先值表示較低的優先順序。在這個欄位中的零隻是代表在確定任務的排程時不會調整優先順序。 | |
(30) | 任務使用的虛擬記憶體總量。它包括所有程式碼,資料和共享庫,以及已經被替換的頁面。以及已被對映但未被使用的頁面。 | |
(31) | 任務已使用的未交換的實體記憶體。 | |
(32) | 任務使用的共享記憶體量。它只是反映可能與其他程序共享的記憶體。 | |
(33) |
任務的狀態可以是以下之一:D
=不間斷睡眠,R
=執行,S
=睡眠,T
=跟蹤或停止,Z
=殭屍。 |
|
(34) | 自上次螢幕更新以來,所經過的 CPU 時間的任務份額,以 CPU 時間總數的百分比表示。 | |
(35) | 任務當前使用的可用實體記憶體的份額。 | |
(36) |
CPU 時間,單位是百分之一秒,與TIME
相同,但通過百分之一秒反映更大的粒度。 |
|
(37) | 命令 – 命令列或程式名稱 |
你可能會看到很多欄位。許多欄位都存在於多個工具中,這些工具有些冗餘的功能。通常情況下,你只需要這個欄位的一小部分,但你需要知道,系統性能的許多資訊(實際上還有更多)可用於你,因為有時候會出現一個模糊的問題,並且為了能夠解決它,需要知道如何讀取這些資料。
現在,你將學習如何使用系統性能工具。
這樣做
1: uptime 2: free 3: vmstat 4: ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )& vmstat 1 5: uptime 6: ( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat )& vmstat -nd 1 | egrep -v 'loop|sr0' 7: echo 3 | sudo tee /proc/sys/vm/drop_caches 8: free -mt ; find / >/dev/null 2>&1 ; free -mt 9: echo 3 | sudo tee /proc/sys/vm/drop_caches 10: cat test.img /dev/null ; free -mt
你會看到什麼
user1@vm1:~$ uptime 05:36:45 up 6 days,1:08,1 user,load average: 0.00, 0.00, 0.00 user1@vm1:~$ free totalusedfreesharedbufferscached Mem:5088202399922688280820213720 -/+ buffers/cache:25452483368 Swap:4730800473080 user1@vm1:~$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rbswpdfreebuffcachesisobiboincs us sy id wa 000 268828820 213720002110141100 1000 user1@vm1:~$ ( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )& vmstat 1 [1] 6078 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rbswpdfreebuffcachesisobiboincs us sy id wa 110 268556828 213736002110141100 1000 000 268556828 21377200160191000 1000 000 268556828 213772000013800 1000 000 268556828 2137720000151100 1000 000 268556828 2137720000141000 1000 000 268556828 2137720000181300 1000 100 267316836 21384400740267260 9910 100 267316836 213844000030370 10000 100 267316836 2138440000271110 10000 100 267316836 2138440000257120 10000 30+0 records in 30+0 records out 31457280 bytes (31 MB) copied, 4.95038 s, 6.4 MB/s 000 267928860 21386000270265291 9720 000 267936860 213848000015900 1000 000 267936860 213848000014700 1000 000 267936860 213848000014700 1000 000 267936860 2138480000131100 1000 Terminated user1@vm1:~$ uptime 05:22:15 up 6 days, 54 min,1 user,load average: 0.07, 0.02, 0.00 [1]+Done( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat ) user1@vm1:~$ uptime 05:22:22 up 6 days, 54 min,1 user,load average: 0.06, 0.02, 0.00 user1@vm1:~$ ( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat )& vmstat -nd 1 | egrep -v 'loop|sr0' [1] 6086 disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectorsmstotal merged sectorsmscursec sda146985 2230744 2182132010584832190 1343154 10927338 13301440105 sda146995 2230744 2182164810584832190 1343154 10927338 13301440105 sda146995 2230744 2182164810584832190 1343154 10927338 13301440105 sda146995 2230744 2182164810584832190 1343154 10927338 13301440105 sda146995 2230744 2182164810584832190 1343154 10927338 13301440105 sda146995 2230744 2182164810584832190 1343154 10927338 13301440105 sda146999 2230744 2182168010585632190 1343154 10927338 13301440105 sda146999 2230744 2182168010585632190 1343154 10927338 13301440105 sda147000 2230744 2182168810585632208 1344160 10935530 13302880105 sda147000 2230744 2182168810585632274 1349214 10976490 13307480105 sda147000 2230744 2182168810585632325 1353259 11009258 13312360105 sda147000 2230744 2182168810585632450 1364657 11101442 13371760105 sda147000 2230744 2182168810585632450 1364657 11101442 13371760105 sda147001 2230744 2182169610585632471 1366301 11114762 13373480105 sda147001 2230744 2182169610585632525 1370529 11149018 13377320105 sda147001 2230744 2182169610585632573 1374577 11181786 13380640105 sda147001 2230744 2182169610585632698 1386562 11278666 13462440105 6553600+0 records in 6553600+0 records out 209715200 bytes (210 MB) copied, 11.7088 s, 17.9 MB/s sda147001 2230744 2182169610585632698 1386562 11278666 13462440105 sda147001 2230744 2182169610585632698 1386562 11278666 13462440105 sda147001 2230744 2182169610585632698 1386562 11278666 13462440105 sda147001 2230744 2182169610585632698 1386562 11278666 13462440105 sda147001 2230744 2182169610585632762 1393910 11337962 13491920105 user1@vm1:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 [1]+Done( sleep 5 && dd if=/dev/zero of=test.img bs=32 count=$((32*1024*200)) && sleep 5 && killall vmstat ) user1@vm1:~$ free -mt ; find / >/dev/null 2>&1 ; free -mt totalusedfreesharedbufferscached Mem:49630466005 -/+ buffers/cache:24472 Swap:4610461 Total:95830928 totalusedfreesharedbufferscached Mem:496644320226 -/+ buffers/cache:35461 Swap:4610461 Total:95864894 user1@vm1:~$ echo 3 | sudo tee /proc/sys/vm/drop_caches 3 user1@vm1:~$ cat test.img /dev/null ; free -mt totalusedfreesharedbufferscached Mem:49623026500205 -/+ buffers/cache:24471 Swap:4610461 Total:958230727 user1@vm1:~$
解釋
- 列印當前的正常執行時間。
- 打印出可用記憶體資訊。
-
這個很有趣,最好認為是一種實驗。首先,我們在後臺啟動
( sleep 5 && dd if=/dev/urandom of=/dev/null bs=1M count=30 && sleep 5 && killall vmstat )&
,之後我們 以連續模式啟動vmstat
,所以它將打印出其資訊直到中斷。我們可以看到,在這個命令啟動 5 秒鐘後,CPU 負載顯著增加了一段時間,然後減少,另外 5 秒鐘後vmstat
被殺死。 - 列印當前的正常執行時間。注意負載平均值的變化。
- 這是另一個實驗,幾乎和以前一樣,但這次用磁碟寫入。
- 刪除所有快取和緩衝區。
- 另一個實驗。我們想看看讀取系統中的所有檔案和目錄名稱,會如何影響記憶體中的檔案系統快取,並且我們可以看到它被快取在緩衝區中,這是有理論根據的。
- 再次刪除所有快取和緩衝區。
- 這次我們想看看,檔案讀取如何影響記憶體中的檔案系統快取。我們可以看到讀取的檔案被快取在快取部分,來增加後續訪問的時間。
附加題
-
為什麼在我們的第一個實驗中,不是
user
,而是system
CPU 使用率上升到 100? -
這是什麼意思?
dd if=/dev/zero of=test.img bs=32 count=$( (32*1024*200) )
。 -
啟動
top
,並按下h
。現在嘗試按照 CPU,記憶體和 PID 對其輸出進行排序。