Linux 系統性能監控命令詳解
系統負載過重時往往會引起其它子系統的問題,比如:
->大量的讀入內存的IO請求(page-in IO)會用完內存隊列;
->大量的網絡流量會造成CPU的過載;
->CPU的高使用率可能正在處理空閑內存隊列;
->大量的磁盤讀寫會消耗CPU和IO資源。
我們測試的系統,總的來說可分為二類:
第一,IO Bound,這類系統會大量消耗內存和底層的存儲系統,它并不消耗過多的CPU和網絡資源(除非系統是網絡的)。IO bound系統消耗CPU資源用來接受IO請求,然后會進入休眠狀態。數據庫通常被認為是IO bound系統。
第二,CPU Bound,這類系統需要消耗大量的CPU資源。他們往往進行大量的數學計算。高吞吐量的Web server,Mail Server通常被認為是CPU Bound系統。
在性能測試中首先要做的是建立基線(Baseline),這樣后續的調整才會有一個參考標準。值得注意的是,在測試基線的時候,一定要保證系統工作在正常的狀態下。
CPU
常用的監視工具有:mpstat,vmstat,top。
1.mpstat
mpstat是 Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。下面只介紹 mpstat與CPU相關的參數,mpstat的語法如下:
mpstat [-P {cpu|ALL}] [internal [count]]
參數的含義如下:
參數 | 解釋 | |
---|---|---|
-P {cpu | ALL} | 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值 |
internal | 相鄰的兩次采樣的間隔時間 | |
count | 采樣的次數,count只能和delay一起使用 |
當沒有參數時,mpstat則顯示系統啟動以后所有信息的平均值。有interval時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個interval時間段的平均信息。與CPU有關的輸出的含義如下:
參數 | 解釋 | 從/proc/stat獲得數據 |
---|---|---|
CPU | 處理器ID | |
user | 在internal時間段里,用戶態的CPU時間(%),不包含 nice值為負進程 | usr/total*100 |
nice | 在internal時間段里,nice值為負進程的CPU時間(%) | nice/total*100 |
system | 在internal時間段里,核心時間(%) | system/total*100 |
iowait | 在internal時間段里,硬盤IO等待時間(%) | iowait/total*100 |
irq | 在internal時間段里,硬中斷時間(%) | irq/total*100 |
soft | 在internal時間段里,軟中斷時間(%) | softirq/total*100 |
idle | 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間 (%) | idle/total*100 |
intr/s | 在internal時間段里,每秒CPU接收的中斷的次數 | intr/total*100 |
CPU總的工作時間:total_cur = user + system + nice + idle + iowait + irq + softirq
total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq
user = user_cur – user_pre
total = total_cur - total_pre
其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數點。
范例1 average mode (粗略信息)
當mpstat不帶參數時,輸出為從系統啟動以來的平均值。
[work@jx-testing-ps1933.jx.baidu.com ~]$ mpstat Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 10:06:32 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:06:32 AM all 0.71 0.00 0.19 0.01 0.00 0.04 99.05 271.64 |
范例2 每2秒產生了4個處理器的統計數據報告
下面的命令可以每2秒產生了4個處理器的統計數據報告,一共產生三個interval 的信息,然后再給出這三個interval的平均信息。默認時,輸出是按照CPU 號排序。第一個行給出了從系統引導以來的所有活躍數據。接下來每行對應一個處理器的活躍狀態。
[work@jx-testing-ps1933.jx.baidu.com ~]$ mpstat -P ALL 2 3 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 10:11:04 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:11:06 AM all 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1013.13 10:11:06 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 100.00 253.54 10:11:06 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:06 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 100.00 254.55 10:11:06 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:06 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:11:08 AM all 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1015.15 10:11:08 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:08 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 100.00 253.03 10:11:08 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 99.49 257.58 10:11:08 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:08 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:11:10 AM all 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1016.16 10:11:10 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:10 AM 1 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 10:11:10 AM 2 0.00 0.00 0.00 0.00 0.00 0.00 100.00 258.08 10:11:10 AM 3 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 Average: CPU %user %nice %system %iowait %irq %soft %idle intr/s Average: all 0.00 0.00 0.00 0.00 0.00 0.00 100.00 1014.81 Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.86 Average: 1 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.69 Average: 2 0.00 0.00 0.00 0.00 0.00 0.00 99.83 256.73 Average: 3 0.00 0.00 0.00 0.00 0.00 0.00 100.00 252.53 |
2.vmstat
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫, 是實時系統監控工具。該命令通過使用knlist子程序和/dev/kmen偽設備驅動器訪問這些數據,輸出信息直接打印在屏幕。vmstat反饋的與CPU相關的信息包括:
(1)多少任務在運行
(2)CPU使用的情況
(3)CPU收到多少中斷
(4)發生多少上下文切換
下面只介紹 Vmstat與CPU相關的參數
vmstat的語法如下:
vmstat [delay [count]]
參數的含義如下:
參數 | 解釋 |
---|---|
delay | 相鄰的兩次采樣的間隔時間 |
count | 采樣的次數,count只能和delay一起使用 |
當沒有參數時,vmstat則顯示系統啟動以后所有信息的平均值。有delay時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個delay時間段的平均信息。當系統有多個CPU時,輸出為所有CPU的平均值。
參數 | 解釋 | 從/proc/stat獲得數據 |
---|---|---|
r | 在internal時間段里,運行隊列里等待CPU的任務(任務)的個數,即不包含vmstat進程 | procs_running-1 |
b | 在internal時間段里,被資源阻塞的任務數(I/0,頁面調度,等等.)通常情況下是接近0的 | procs_blocked |
us | 在internal時間段里,用戶態的CPU時間(%),包含 nice值為負進程 | (user+nice)/total*100 |
sy | 在internal時間段里,核心態的CPU時間(%) | (system+irq+softirq)/total*100 |
id | 在internal時間段里,cpu空閑的時間,不包括等待i/o的時間(%) | idle/total*100 |
wa | 在internal時間段里,等待i/o的時間(%) | iowait/total*100 |
in | 在internal時間段里,每秒發生中斷的次數 | intr/interval |
cs | 在internal時間段里,每秒上下文切換的次數,即每秒內核任務交換的次數 | ctxt/interval |
total_cur = user + system + nice + idle + iowait + irq + softirq
total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq
total = total_cur - total_pre
3.iostat
iostat [-t] [-c] [interval [count]]
參數的含義如下:
參數 | 解釋 |
---|---|
T | 表示輸出采用的時間 |
C | 表示只顯示CPU的信息 |
Internal | 相鄰的兩次采樣的間隔時間 |
count | 采樣的次數,count只能和delay一起使用 |
當沒有參數時,iostat則顯示系統啟動以后所有信息的平均值。與CPU有關的輸出的含義
參數 | 解釋 | 從/proc/stat獲得 |
---|---|---|
CPU | 處理器ID | |
user | 在internal時間段里,用戶態的CPU時間(%) ,不包含 nice值為負進程 | usr/total*100 |
nice | 在internal時間段里,nice值為負進程的CPU時間(%) | nice/total*100 |
sys | 在internal時間段里,核心時間(%) | (system+irq+softirq)/total*100 |
iowait | 在internal時間段里,硬盤IO等待時間(%) | iowait/total*100 |
idle | 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間 (%) | idle/total*100 |
total_cur = user + system + nice + idle + iowait + irq + softirq
total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq
total = total_cur - total_pre
有interval時,第一行的信息自系統啟動以來的平均信息。從第二行開始,輸出為前一個interval時間段的平均信息。
示例1
[work@jx-testing-ps1933.jx.baidu.com ~]$ iostat -c 1 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 avg-cpu: %user %nice %sys %iowait %idle 0.71 0.00 0.22 0.01 99.05 avg-cpu: %user %nice %sys %iowait %idle 0.00 0.00 0.00 0.00 100.00 avg-cpu: %user %nice %sys %iowait %idle 0.00 0.00 0.00 0.00 100.00 |
4.sar
sar是System Activity Reporter(系統活躍情況報告)的縮寫。顧名思義,sar工具將對系統當前的狀態進行采樣,然后通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統采樣,獲得大量的采樣數據;采樣數據和分析的結果都可以存入文件,所需的負載很小。這些是檢查歷史數據和一些近來的系統事件。sar 用于檢查的性能數據類似于vmstat, mpstat和 iostat的顯示。 sar的數據是一段時間保存的內容,因此可以察看過去的信息。 lastcomm可以現在系統最近被執行的命令。這些可以用在系統審計中。sar可以在*BSD和Linux中找到,它給用戶在系統審計中更多的選項來收集信息。
在反饋CPU整體信息方面,sar 反饋的與CPU相關的信息包括:
(1)多少任務在運行
(2)CPU使用的情況
(3)CPU收到多少中斷
(4)發生多少上下文切換
sar的語法如下:
sar [-options] [interval [count]]
其中,internal是兩次采樣的間隔時間;count是指采樣的次數;與CPU相關的options有:
參數的含義如下:
參數 | 解釋 | |||
---|---|---|---|---|
-c | 表示輸出采用的時間 | |||
-e hh:mm:ss | 表示只顯示CPU的信息 | |||
-i {irq | SUM | ALL | XALL} | 相鄰的兩次采樣的間隔時間 |
-P {cpu | ALL} | |||
-q | 顯示在采樣的時刻,可運行隊列的任務的個數,以及系統平均負載 | |||
-u | CPU 使用的情況,報告了cpu的用戶態,系統態,等待I/O和空閑時間上的百分比。 | |||
-w | 每秒上下文交換率 | |||
-o | filename 將結果放在文件里 | |||
-f | filename 表示從file文件中取出數據,如果沒有指定-f file,則從標準數據文件 |
范例
首先在后臺運行一個創建2GB文件的任務,然后輸入:“sar -c -q -w 3 2”,表示每3秒采樣一次,采樣兩次,可以看到系統有58個任務,但是在10時47分01秒時有一個任務在運行,在下一次采樣10時47分04秒時,沒有任務在運行。
[work@jx-testing-ps1933.jx.baidu.com ~]$ dd if=/dev/zero of=./1.img bs=2048 count=1000000& [1] 22332 [work@jx-testing-ps1933.jx.baidu.com ~]$ sar -c -q -w -I SUM 3 2 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 1000000+0 records in 1000000+0 records out 10:46:58 AM proc/s 10:47:01 AM 0.00 10:46:58 AM cswch/s 10:47:01 AM 166.44 10:46:58 AM INTR intr/s 10:47:01 AM sum 1172.15 10:46:58 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 10:47:01 AM 1 58 0.04 0.01 0.00 10:47:01 AM proc/s 10:47:04 AM 0.00 10:47:01 AM cswch/s 10:47:04 AM 57.91 10:47:01 AM INTR intr/s 10:47:04 AM sum 1142.09 10:47:01 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 10:47:04 AM 0 58 0.11 0.03 0.01 Average: proc/s Average: 0.00 Average: cswch/s Average: 112.27 Average: INTR intr/s Average: sum 1157.14 Average: runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 Average: 0 58 0.07 0.02 0.01 |
與CPU有關的輸出的含義
參數 | 解釋 | 從/proc/stat和/proc/loadavg獲得數據 |
---|---|---|
proc/s | 在internal時間段里,每秒上下文切換率 | processes/total*100 |
cswch | 在internal時間段里,每秒上下文切換率 | ctxt/total*100 |
intr/s | 在internal時間段里,每秒CPU接收的中斷的次數 | idle/total*100 |
runq-sz | 采樣時,運行隊列中任務的個數,不包括vmstat 進程。 | procs_running-1 |
plist-sz | 采樣時,系統中活躍的任務的個數 | nr_threads |
ldavg-1 | 采樣的前一秒鐘系統的負載(%) | lavg_1 |
ldavg-5 | 采樣的5秒鐘系統的負載(%) | lavg_5 |
ldavg-15 | 采樣的前15秒鐘系統的負載(%) | lavg_15 |
下面輸入命令“sar 3 2”,表示每隔3秒顯示CPU的狀態,共顯示2次。此時創建2GB文件的任務還在后臺進行。
[work@jx-testing-ps1933.jx.baidu.com ~]$ sar 3 2 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 1000000+0 records in 1000000+0 records out 10:59:22 AM CPU %user %nice %system %iowait %idle 10:59:25 AM all 0.76 0.00 18.01 29.46 51.77 10:59:28 AM all 0.00 0.00 1.69 19.81 78.50 Average: all 0.38 0.00 9.86 24.64 65.12 |
與CPU有關的輸出的含義
參數 | 解釋 | 從/proc/stat獲得數據 |
---|---|---|
CPU | 處理器ID | |
user | 在internal時間段里,用戶態的CPU時間(%) ,不包含 nice值為負進程 | usr/total*100 |
nice | 在internal時間段里,nice值為負進程的CPU時間(%) | nice/total*100 |
sys | 在internal時間段里,核心時間(%) | (system+irq+softirq)/total*100 |
iowait | 在internal時間段里,硬盤IO等待時間(%) | iowait/total*100 |
idle | 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間 (%) | irq/total*100 |
MEMORY
首先說說虛擬內存和物理內存:
虛擬內存就是采用硬盤來對物理內存進行擴展,將暫時不用的內存頁寫到硬盤上而騰出更多的物理內存讓有需要的進程來用。當這些內存頁需要用的時候在從硬盤讀回內存。這一切對于用戶來說是透明的。通常在Linux系統說,虛擬內存就是swap分區。在X86系統上虛擬內存被分為大小為4K的頁。
每一個進程啟動時都會向系統申請虛擬內存(VSZ),內核同意或者拒就請求。當程序真正用到內存時,系統就它映射到物理內存。RSS表示程序所占的物理內存的大小。用ps命令我們可以看到進程占用的VSZ和RSS。
[work@jx-testing-ps1933.jx.baidu.com ~]$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4752 544 ? S 2007 0:01 init [3] root 2 0.0 0.0 0 0 ? S 2007 0:22 [migration/0] root 3 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S 2007 0:20 [migration/1] root 5 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/1] root 6 0.0 0.0 0 0 ? S 2007 0:18 [migration/2] root 7 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/2] root 8 0.0 0.0 0 0 ? S 2007 0:12 [migration/3] root 9 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/3] |
在命令行使用“Free”命令可以監控內存使用情況
[work@tc-testing-ps5006.tc.baidu.com ~]$ free total used free shared buffers cached Mem: 8165816 8145048 20768 0 22920 5840236 -/+ buffers/cache: 2281892 5883924 Swap: 1024056 2316 1021740 |
輸出的含義
參數 | 解釋 |
---|---|
Mem | 物理內存 |
total | 不顯示核心使用的物理內存(通常大約1MB) |
used | 被使用的內存總額(第二行不計緩沖) |
free | 全部沒使用的內存 |
Shared | 多個進程共享的內存總額 |
Buffers | 顯示磁盤緩存的當前大小 |
Swap | 對對換空間,顯示的信息類似上面。如果這行為全0,那么沒使用對換空間 |
在缺省的狀態下,free命令以千字節(也就是1024字節為單位)來顯示內存使用情況。可以使用—h參數以字節為單位顯示內存使用情況,或者可以使用—m參數以兆字節為單位顯示內存使用情況。還可以通過—s參數使用命令來不間斷地監視內存使用情況。
使甩vmstat命令監視虛擬內存使用情況
[work@jx-testing-ps1933.jx.baidu.com ~]$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4752 544 ? S 2007 0:01 init [3] root 2 0.0 0.0 0 0 ? S 2007 0:22 [migration/0] root 3 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S 2007 0:20 [migration/1] root 5 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/1] root 6 0.0 0.0 0 0 ? S 2007 0:18 [migration/2] root 7 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/2] root 8 0.0 0.0 0 0 ? S 2007 0:12 [migration/3] root 9 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/3] |
與內存和IO相關的參數含義
參數 | 解釋 |
---|---|
swpd | 現時可用的交換內存(單位KB) |
free | 空閑的內存(單位KB) |
buff | 緩沖去中的內存數(單位:KB) |
cache | 被用來做為高速緩存的內存數(單位:KB) |
si | 從磁盤交換到內存的交換頁數量,單位:KB/秒 |
so | 從內存交換到磁盤的交換頁數量,單位:KB/秒 |
bi | 發送到塊設備的塊數,單位:塊/秒 |
bo | 從塊設備接收到的塊數,單位:塊/秒 |
IO
監控IO的常用命令為iostat
[work@jx-testing-ps1933.jx.baidu.com ~]$ iostat -x Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com) 07/30/2008 avg-cpu: %user %nice %sys %iowait %idle 0.71 0.00 0.22 0.01 99.05 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.01 0.26 0.40 1.01 50.25 152.31 25.12 76.15 144.46 0.02 12.24 0.65 0.09 |
io相關的參數含義
參數 | 解釋 |
---|---|
rrqm/s | 每秒進行 merge 的讀操作數目 |
wrqm/s | 每秒進行 merge 的寫操作數目 |
r/s | 每秒完成的讀 I/O 設備次數 |
w/s | 每秒完成的寫 I/O 設備次數 |
rsec/s | 每秒讀扇區數 |
wsec/s | 每秒寫扇區數 |
rkB/s | 每秒讀K字節數。是 rsect/s 的一半,因為每扇區大小為512字節 |
wkB/s | 每秒寫K字節數。是 wsect/s 的一半 |
avgrq-sz | 平均每次設備I/O操作的數據大小 (扇區) |
avgqu-sz | 平均I/O隊列長度 |
await | 平均每次設備I/O操作的等待時間 (毫秒) |
svctm | 平均每次設備I/O操作的服務時間 (毫秒) |
%util | 一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的 |
NETWORK
網絡是所有子系統中最難監控的了。首先是由于網絡是抽象的,更重要的是許多影響網絡的因素并不在我們的控制范圍之內。這些因素包括,延遲、沖突、阻塞等等。
由于網絡監控中,需要查看許多設備的狀態和參數,需要root權限才可以,所以就不在這里進行介紹了。
LINUX進程內存占用查看方法
(1)top
可以直接使用top命令后,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用如下的命令:
$ top -u oracle
(2)pmap
可以根據進程查看進程相關信息占用的內存情況,(進程號可以通過ps查看)如下所示:
$ pmap -d 14596
(3)ps
如下例所示:
$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 其中rsz是是實際內存
$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle | sort -nrk5
其中rsz為實際內存,上例實現按內存排序,由大到小