系統平均負載(Load average) 一些解釋
作者: cross 日期: 2006-11-05 20:36
系統平均負載(Load average)釋疑
Quote http://blog.donews.com/zzw45/archive/2005/11/14/626449.aspx
在Linux系統中,uptime、w、top等命令都會有系統平均負載load average的輸出,那麼什麼是系統平均負載呢?
系統平均負載被定義為在特定時間間隔內運行隊列中的平均進程樹。如果一個進程滿足以下條件則其就會位于運行隊列中:
- 它沒有在等待I/O操作的結果
- 它沒有主動進入等待狀態(也就是沒有調用'wait')
- 沒有被停止(例如:等待終止)
例如:
[root@www2 init.d]# uptime
7:51pm up 2 days, 5:43, 2 users, load average: 8.13, 5.90, 4.94
命令輸出的最后內容表示在過去的1、5、15分鐘內運行隊列中的平均進程數量。
一般來說只要每個CPU的當前活動進程數不大于3那麼系統的性能就是良好的,如果每個CPU的任務數大于5,那麼就表示這台机器的性能有嚴重問題。對于上面的例子來說,假設系統有兩個CPU,那麼其每個CPU的當前任務數為:8.13/2=4.065。這表示該系統的性能是可以接受的。
Quote: http://www.phpx.com/cma2901.html
作者:biti_rainy [文章出自: www.itpub.net]
linux loadavg 算法
發表人:biti_rainy
今天讀linux source code關于cpu load 的計算方法,同時在google上搜索到處參考,暈乎了半天,終于弄明白cpu load 的計算方法了,並不是簡單的移動算朮平均。對于linux來說,采樣計算load時間間隔為5秒,這都是在source code里面定義的固定數字,其采樣結构通過動態內存文件系統 /proc/loadavg 可以動態的得到適時數据,其他工具的輸出,比如 uptime / top/sar 等都是讀該內存數据所產生的。我們在這里主要考究kernel的算法。
對于5秒的間隔,是動態地采樣cpu狀態數据,也就是run queue size ,這包括正在cpu中running的進程數量以及在cpu等待隊列里面的進程數量。對于linux來說,實際上會計算1分鐘、5分鐘、15分鐘的移動平均。為此首先我們要介紹linux 里面定義的3個常量:
#define EXP_1 1884 /* 1/exp(5sec/1min) */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */三個常量分別表示1/5/15分鐘的常量,計算方法是:
1884 = 2048/(power(e,(5/(60*1)))) /* e = 2.71828 */
2014 = 2048/(power(e,(5/(60*5))))
2037 = 2048/(power(e,(5/(60*15))))
我們假定前一時刻按常量1884計算的load為 load1(t-1),當前采樣run queue size 為 rq1,則當前load1(t) = ((load1(t-1) * 1884) + rq1 * (2048 - 1884))/2048
同理可以5分鐘和15分鐘移動平均的算法分別為 load5(t) = ((load5(t-1) * 2014) + rq1 * (2048 - 2014))/2048和load_15(t) = ((load15(t-1) * 2037) + rq1 * (2048 - 2037))/2048
由此可以看出,移動平均間隔越大,當前run queue size 對移動平均的影響趨向減小。
至于為什麼取這個數,涉及到微積分方面的知識了,這樣做出的圖象更平滑。
Quote: http://www.linuxeden.com/html/develop/20060829/24483.html
1. /proc/stat/
包含了所有CPU活動的信息,該文件中的所有值都是從系統啟動開始累計到當前時刻。
[work@builder ~]$ cat /proc/stat
cpu 432661 13295 86656 422145968 171474 233 5346
cpu0 123075 2462 23494 105543694 16586 0 4615
cpu1 111917 4124 23858 105503820 69697 123 371
cpu2 103164 3554 21530 105521167 64032 106 334
cpu3 94504 3153 17772 105577285 21158 4 24
intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 19067887
btime 1139187531
processes 270014
procs_running 1
procs_blocked 0
輸出解釋
CPU 以及CPU0、CPU1、CPU2、CPU3每行的每個參數意思(以第一行為例)為:
參數 解釋
user (432661) 從系統啟動開始累計到當前時刻,用戶態的CPU時間(單位:jiffies) ,不包含 nice值為負進程。1jiffies=0.01秒
nice (13295) 從系統啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間(單位:jiffies)
system (86656) 從系統啟動開始累計到當前時刻,核心時間(單位:jiffies)
idle (422145968) 從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其它等待時間(單位:jiffies)
iowait (171474) 從系統啟動開始累計到當前時刻,硬盤IO等待時間(單位:jiffies) ,
irq (233) 從系統啟動開始累計到當前時刻,硬中斷時間(單位:jiffies)
softirq (5346) 從系統啟動開始累計到當前時刻,軟中斷時間(單位:jiffies)
CPU時間=user+system+nice+idle+iowait+irq+softirq
“intr”這行給出中斷的信息,第一個為自系統啟動以來,發生的所有的中斷的次數;然后每個數對應一個特定的中斷自系統啟動以來所發生的次數。
“ctxt”給出了自系統啟動以來CPU發生的上下文交換的次數。
“btime”給出了從系統啟動到現在為止的時間,單位為秒。
“processes (total_forks) 自系統啟動以來所創建的任務的個數目。
“procs_running”:當前運行隊列的任務的數目。
“procs_blocked”:當前被阻塞的任務的數目。
2. /proc/loadavg
該文件中的所有值都是從系統啟動開始累計到當前時刻。該文件只給出了所有CPU的集合信息,不能該出每個CPU的信息。
[root@localhost ~]# cat /proc/loadavg
4.61 4.36 4.15 9/84 5662
每個值的含義為:
參數 解釋
lavg_1 (4.61) 1-分鐘平均負載
lavg_5 (4.36) 5-分鐘平均負載
lavg_15(4.15) 15-分鐘平均負載
nr_running (9) 在采樣時刻,運行隊列的任務的數目,與/proc/stat的procs_running表示相同意思
nr_threads (84) 在采樣時刻,系統中活躍的任務的個數(不包括運行已經結束的任務)
last_pid(5662) 最大的pid值,包括輕量級進程,即線程。
假設當前有兩個CPU,則每個CPU的當前任務數為4.61/2=2.31
3. uptime
uptime是Linux系統常用的命令,用來報告系統已經運行多長時間,依此顯示的信息:現在時間,系統已經運行了的時間,目前有多少登陸用戶, 1分鐘系統平均負載,5分鐘系統平均負載,15分鐘系統平均負載。該命令從/proc/loadavg 中獲得load average的信息。
范例1:系統只用一個CPU
[root@localhost ~]# uptime
12:20:49 up 3 days,9:20, 5 users, load average 1.10 1.32 1.15
對于一個CPU的系統來說,范例1中的平均負載高了些。通常來說:如果系統有n個CPU而且平均負載小于n,則說明某些CPU還有空閑的時間片。通過該命令,你能知道CPU是否繁忙,但是無法知道為什麼忙。
4. mpstat
mpstat是Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統里,其不但能查看所有CPU的平均狀況信息,而且能夠查看特定CPU的信息。下面只介紹 mpstat與CPU相關的參數,mpstat的語法如下:
mpstat [-P {|ALL}] [internal [count]]
參數的含義如下:
參數 解釋
-P {|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@builder linux-2.6.14]$ mpstat
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/2005
09:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59
范例2: 每2秒產生了4個處理器的統計數据報告
下面的命令可以每2秒產生了4個處理器的統計數据報告,一共產生三個interval 的信息,然后再給出這三個interval的平均信息。默認時,輸出是按照CPU 號排序。第一個行給出了從系統引導以來的所有活躍數据。接下來每行對應一個處理器的活躍狀態。。
[work@builder linux-2.6.14]$ mpstat -P ALL 2 3
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/2005
09:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59
09:38:48 AM 0 2.01 0.00 1.01 0.50 0.00 0.00 96.48 5.03
09:38:48 AM 1 51.26 0.00 3.02 1.01 0.00 0.00 44.72 7.04
09:38:48 AM 2 17.09 0.00 2.01 0.50 0.00 0.00 81.41 0.00
09:38:48 AM 3 22.61 0.00 1.01 0.00 0.00 0.00 76.38 1006.03
09:38:48 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:50 AM all 24.22 0.00 1.25 1.25 0.00 0.00 73.28 1049.75
09:38:50 AM 0 1.00 0.00 1.00 0.00 0.00 0.00 98.01 28.86
09:38:50 AM 1 93.03 0.00 3.48 0.00 0.00 0.00 2.99 25.37
09:38:50 AM 2 1.99 0.00 0.50 4.98 0.00 0.00 92.54 0.00
09:38:50 AM 3 1.00 0.00 0.50 0.00 0.00 0.00 98.51 995.52
09:38:50 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:52 AM all 23.69 0.00 2.37 0.37 0.00 0.12 73.44 1028.36
09:38:52 AM 0 2.99 0.00 1.49 0.00 0.00 0.50 95.02 111.94
09:38:52 AM 1 52.74 0.00 2.99 1.00 0.00 0.00 42.29 4.48
09:38:52 AM 2 14.93 0.00 1.99 0.00 0.00 0.00 82.09 4.48
09:38:52 AM 3 23.38 0.00 1.99 0.50 0.00 0.00 73.13 907.46
Average: CPU %user %nice %system %iowait %irq %soft %idle intr/s
Average: all 23.73 0.00 1.79 0.71 0.00 0.04 73.73 1032.28
Average: 0 2.00 0.00 1.16 0.17 0.00 0.17 96.51 48.75
Average: 1 65.72 0.00 3.16 0.67 0.00 0.00 29.95 12.31
Average: 2 11.31 0.00 1.50 1.83 0.00 0.00 85.36 1.50
Average: 3 15.64 0.00 1.16 0.17 0.00 0.00 82.70 969.55
[work@builder linux-2.6.14]$
范例3:比較帶參數和不帶參數的mpstat的結果。
在后台開一個2G的文件
> cat 1.img —/* 1.img=2GBytes
然后在另一個終端運行mpstat命令
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日
13時48分52秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13時48分52秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日
13時48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13時48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日
13時48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13時48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日
13時48分54秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13時48分54秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]#
然后再運行命令:mpstat 3 100 /*每隔3秒給出一次信息,共給出100次*/
[root@localhost ~]# mpstat 3 100
Linux 2.6.13 (localhost.localdomain) 2005年12月15日
13時48分25秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13時48分28秒 all 96.00 0.00 4.00 0.00 0.00 0.00 0.00 401.67
13時48分31秒 all 96.01 0.00 3.65 0.00 0.33 0.00 0.00 393.36
13時48分34秒 all 95.36 0.00 4.30 0.00 0.33 0.00 0.00 532.45
13時48分37秒 all 94.00 0.00 5.67 0.00 0.33 0.00 0.00 400.33
13時48分40秒 all 95.00 0.00 5.00 0.00 0.00 0.00 0.00 330.33
13時48分43秒 all 95.33 0.00 4.33 0.00 0.33 0.00 0.00 337.33
13時48分46秒 all 94.68 0.00 4.98 0.00 0.33 0.00 0.00 329.57
13時48分49秒 all 95.67 0.00 4.00 0.00 0.33 0.00 0.00 417.33
13時48分52秒 all 95.67 0.00 3.67 0.00 0.67 0.00 0.00 448.00
13時48分55秒 all 94.02 0.00 5.32 0.00 0.33 0.33 0.00 410.96
13時48分58秒 all 95.35 0.00 4.32 0.00 0.33 0.00 0.00 466.45
[root@localhost ~]#
上兩表顯示出當要正确反映系統的情況,需要正确使用命令的參數。vmstat 和iostat 也需要注意這一問題。
5. 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的平均值。
與CPU有關的輸出的含義 (采用進一法)
參數 解釋 從/proc/stat獲得數据
任務的信息
r 在internal時間段里,運行隊列里等待CPU的任務(任務)的個數,即不包含vmstat進程 procs_running-1
b 在internal時間段里,被資源阻塞的任務數(I/0,頁面調度,等等.) ,通常情況下是接近0的 procs_blocked
CPU信息 所有值取整(四舍五入)
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
范例1:average mode (粗略信息)
當vmstat不帶參數時,對應的輸出值是從系統啟動以來的平均值,而r和b則對應的是完成這一命令時,系統的值。從下面例子,可以看出系統基本出去閑置狀態(idle)。自啟動以來,CPU在用戶態消耗時間為5%,在核心態消耗為本1%,剩下的為閑置時間。需要指出的是:這里的用戶態時間包括nice值為負的進程的時間。
[root@localhost ~]# vmstat
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 4580 428 98516 0 0 49 6 15 19 2 1 96 1
[root@localhost ~]#
范例2:average mode (詳細信息)
命令格式:
vmstat –s
這里只討論與CPU相關信息。“CPU ticks”表示自系統啟動CPU運行時間,這里以tick為時間單位。用tick來西安市us,sy id 和wa的時間;forks指自從系統啟動以來,所創建的新任務的個數。這些信息從/proc/stat 的第一行和”processes”行獲得。
[root@localhost ~]# vmstat -s
255280 total memory
244216 used memory
206624 active memory
21208 inactive memory
11064 free memory
628 buffer memory
91396 swap cache
255992 total swap
24 used swap
255968 free swap
973400 non-nice user cpu ticks
477 nice user cpu ticks
206168 system cpu ticks
43567714 idle cpu ticks
373234 IO-wait cpu ticks
62732 IRQ cpu ticks
1972 softirq cpu ticks
22366502 pages paged in
88756936 pages paged out
0 pages swapped in
0 pages swapped out
135634319 interrupts
137288441 CPU context switches
1134440368 boot time
208990 forks
[root@localhost ~]#
結果解釋
參數 描述 /proc/stat
non-nice user cpu ticks 自系統啟動以來,CPU在用戶態下運行非nice進程的時間,單位為jiffies user
nice user cpu ticks 自系統啟動以來,CPU在用戶態下運行nice進程的時間,單位為jiffies nice
system cpu ticks 自系統啟動以來,CPU處于系統狀態的時間,單位為jiffies sys
idle cpu ticks 自系統啟動以來,CPU處于閑置狀態的時間,單位為jiffies idle
IO-wait cpu ticks 自系統啟動以來,CPU處理IO中斷的時間,單位為jiffies iowait
IRQ cpu ticks 自系統啟動以來,CPU處理硬中斷的時間,單位為jiffies irq
softing cpu ticks 自系統啟動以來,CPU處理軟中斷的時間,單位為jiffies Softirq
interrupts 自系統啟動以來,發生的所有的中斷的次數目 Intr
CPU context switches 自系統啟動以來,發生的上下文交換的次數 Ctxt
boot time 自系統啟動以來到現在運行的時間,單位為秒。 btime
forks 自系統啟動以來所創建的任務的個數目。 Process
范例3:定期采樣(delay [count])
定期采樣數据是指每隔delay時間,采樣一次。當count 為0時,vmstat 將不停地定期報告信息;否則當報告count次后,vmstat 命令停止運行。
第一行的信息如同范例1,是自系統啟動以來的平均信息。從第二行開始,每行的意思是:r和b采樣那一時刻系統運行隊列和等待隊列的情況;而usystem參數(in,cs)以及CPU參數(us,sy,id,wa)對應的輸出值是系統在前一個delay的情況。
從下面例子可以看出上下文交換的次數小于中斷的發生次數。當系統大部分時間是空閑並且中斷大部分是時間中斷時,這種現象极可能發生。當時間中斷發生時, 因為調度器沒有什麼任務可調度,所以很少發生上下文切換。
[root@localhost ~]# vmstat 2 4
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 24 11032 652 91396 0 0 49 6 15 19 2 1 96 1
0 0 24 11032 652 91396 0 0 0 0 377 464 1 0 99 0
0 0 24 11024 652 91396 0 0 0 0 387 476 1 0 100 0
0 0 24 11024 652 91396 0 0 0 0 323 377 0 0 100 0
[root@localhost ~]#
6. 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:
[root@localhost /]# dd if=/dev/zero of=/1.img bs=1024 count=1000000&
[1] 15854
[root@localhost /]# iostat -c 1
Linux 2.6.13 (localhost.localdomain) 2005年12月19日
avg-cpu: %user %nice %sys %iowait %idle
1.94 0.00 0.56 0.75 96.75
avg-cpu: %user %nice %sys %iowait %idle
3.65 0.00 13.87 82.48 0.00
avg-cpu: %user %nice %sys %iowait %idle
7. sar
sar是System Activity Reporter(系統活躍情況報告)的縮寫。顧名思義,sar工具將對系統當前的狀態進行采樣,然后通過計算數据和比例來表達系統的當前運行狀態。它的特點是可以連續對系統采樣,獲得大量的采樣數据;采樣數据和分析的結果都可以存入文件,所需的負載很小。這些是檢查曆史數据和一些近來的系統事件。sar用于檢查的性能數据類似于vmstat, mpstat和 iostat的顯示。 sar的數据是一段時間保存的內容,因此可以察看過去的信息。 lastcomm可以現在系統最近被執行的命令。這些可以用在系統審計中。sa 可以在*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,則從標准數据文件
范例1:
首先在后台運行一個創建1GB文件的任務,然后輸入:“sar -c -q -w 3 2”,表示每3秒采樣一次,采樣兩次,可以看到系統有82個任務,但是在10時12分08秒時有一個任務在運行,在下一次采樣10時12分11秒時,沒有任務在運行。
[root@localhost /]# dd if=/dev/zero of=/1.img bs=1024 count=1000000&
[1] 16213
[root@localhost /]# sar -c -q -w -I SUM 3 2
Linux 2.6.13 (localhost.localdomain) 2005年12月19日
10時12分05秒 proc/s
10時12分08秒 0.00
10時12分05秒 cswch/s
10時12分08秒 692.33
10時12分05秒 INTR intr/s
10時12分08秒 sum 895.33
10時12分05秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
10時12分08秒 1 82 0.20 0.08 0.09
10時12分08秒 proc/s
10時12分11秒 0.00
10時12分08秒 cswch/s
10時12分11秒 648.50
10時12分08秒 INTR intr/s
10時12分11秒 sum 461.79
10時12分08秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
10時12分11秒 0 82 0.59 0.16 0.12
Average: proc/s
Average: 0.00
Average: cswch/s
Average: 670.38
Average: INTR intr/s
Average: sum 678.20
Average: runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
Average: 0 82 0.40 0.12 0.10
與CPU有關的輸出的含義
參數 解釋 從/proc/stat獲得數据
proc/s 在internal時間段里,每秒上下文切換率 processes/total*100
cswch 在internal時間段里,每秒上下文切換率 ctxt/total*100
intr/s 在internal時間段里,每秒CPU接收的中斷的次數 idle/total*100
從/proc/loadavg獲得數据
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次。此時創建1GB文件的任務還在后台進行。
[root@localhost /]# sar 3 2
Linux 2.6.13 (localhost.localdomain) 2005年12月19日
10時12分37秒 CPU %user %nice %system %iowait %idle
10時12分40秒 all 2.91 0.00 14.18 82.91 0.00
10時12分43秒 all 2.66 0.00 14.95 82.39 0.00
Average: all 2.78 0.00 14.58 82.64 0.00
[root@localhost /]#
與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
輸入命令“sar”,當不帶任何參數時,表示每一秒采樣一次,每次顯示從系統到該采樣時系統的平均信息。從Fig.8看出在10時12分43秒,系統idle應該為0,而Fig.9
[root@localhost /]# sar
Linux 2.6.13 (localhost.localdomain) 2005年12月19日
00時00分01秒 CPU %user %nice %system %iowait %idle
00時10分01秒 all 0.11 0.00 0.16 0.00 99.73
00時20分01秒 all 0.13 0.00 0.15 0.00 99.72
.
.
.
08時10分01秒 all 0.11 0.00 0.14 0.00 99.75
08時20分01秒 all 0.13 0.00 0.15 0.00 99.72
08時30分01秒 all 0.13 0.00 0.16 0.00 99.71
08時40分01秒 all 3.96 0.00 0.57 0.34 95.12
08時50分01秒 all 7.42 0.00 0.77 0.74 91.07
09時00分01秒 all 4.93 0.00 1.97 8.14 84.95
09時10分01秒 all 4.81 0.00 0.69 0.29 94.21
09時20分01秒 all 3.09 0.00 0.93 1.72 94.25
09時30分01秒 all 7.59 0.00 1.59 1.27 89.55
09時40分01秒 all 2.27 0.00 0.74 0.32 96.67
09時50分01秒 all 4.81 0.00 0.81 0.07 94.31
10時00分02秒 all 1.84 0.00 2.17 7.78 88.21
10時10分01秒 all 0.63 0.00 0.24 0.20 98.93
10時20分02秒 all 1.70 0.00 1.85 7.95 88.50
10時30分01秒 all 0.50 0.00 0.21 0.21 99.08
Average: all 0.81 0.00 0.33 0.49 98.37
[root@localhost /]#
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
上表中的所有值可取到兩位小數點。
范例2:
[work@builder linux-2.6.14]$ sar –P ALL 2 3
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/28/2005
08:28:45 AM CPU %user %nice %system %iowait %idle
08:28:47 AM all 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 1 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 3 0.00 0.00 0.00 0.00 100.00
08:28:47 AM CPU %user %nice %system %iowait %idle
08:28:49 AM all 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 1 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 3 0.00 0.00 0.00 0.00 100.00
08:28:49 AM CPU %user %nice %system %iowait %idle
08:28:51 AM all 0.00 0.00 0.12 0.25 99.63
08:28:51 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:51 AM 1 0.00 0.00 0.00 0.50 99.50
08:28:51 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:51 AM 3 0.00 0.00 0.00 0.00 100.00
Average: CPU %user %nice %system %iowait %idle
Average: all 0.00 0.00 0.04 0.08 99.88
Average: 0 0.00 0.00 0.00 0.00 100.00
Average: 1 0.00 0.00 0.00 0.17 99.83
Average: 2 0.00 0.00 0.00 0.00 100.00
Average: 3 0.00 0.00 0.00 0.00 100.00
Fig.1.
8. top
top命令提供了實時的對系統處理器的狀態監視,即可以通過用戶按鍵來不斷刷新當前狀態。如果前台執行該命令,它將獨占前台,直到用戶終止該程序為止,但是該命令的很多特性都可以通過交互式命令或者在個人定制文件中進行設定。
下面是該命令的語法格式:
top [-] [d delay] [options]
一些參數的含義如下:
參數 解釋
d delay 相鄰的兩次采樣的間隔時間
q 該選項將使top沒有任何延遲的進行刷新。如果調用程序有超級用戶權限,那麼top將以盡可能高的優先級運行
-l 不顯示空閑進程,默認時,top顯示空閑進程
-S 將系統進程信息也顯示于屏幕,默認時,不顯示。
與CPU有關的輸出的含義
參數 解釋
CPU信息 從/proc/stat獲得信息
us 在internal時間段里,用戶態的CPU時間(%),不包含nice值為負的任務占用的CPU的時間
usr/total*100
ni 在internal時間段里,nice值為負的任務的用戶態的Niced進程的CPU時間(%) nice/total*100
sy 在internal時間段里,核心態的CPU時間(%) system/total*100
id 在internal時間段里,cpu空閑的時間,不包括等待i/o的時間(%) idle/total*100
wa 在internal時間段里,等待i/o的時間(%) iowait/total*100
hi 在internal時間段里,硬中斷時間(%) irq/total*100
si 在internal時間段里,軟中斷時間(%) softirq/total*100
任務
total 采樣時,系統全部進程的個數,包括正在運行的top進程,不包括線程。 =running+sleeping+stopped+zombie
running 采樣時,運行隊列的進程的個數,但不包含top這個進程 通過判斷/proc/pid/status中stat的值。
sleeping 采樣時,可中斷和不可中斷狀態的進程的個數
stopped 采樣時,停止狀態的進程的個數
zombie 采樣時,僵屍狀態的進程的個數
運行中的參數的含義
參數 解釋
q 退出程序
r 重新安排一個進程的優先級別。系統提示用戶輸入需要改變的進程PID
S 切換到累計模式
L 切換顯示平均負載和啟動時間信息
T 切換顯示進程和CPU狀態信息
M 切換顯示內存信息
s 改變兩次刷新之間的延遲時間。系統將提示用戶輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷刷新,默認值是5 s。需要注意的是如果設置太小的時間,很可能會引起不斷刷新,從而根本來不及看清顯示的情況,而且系統負載也會大大增加
范例1:查看 鍵入top命令查看系統狀況
>top
top - 16:52:17 up 3 min, 1 user, load average: 0.10, 0.27, 0.14
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
top - 16:52:31 up 4 min, 1 user, load average: 0.08, 0.26, 0.13
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.3% hi, 0.0% si
Mem: 251924k total, 238168k used, 13756k free, 4420k buffers
Swap: 0k total, 0k used, 0k free, 165200k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4171 root 15 0 48404 12m 2220 S 0.7 5.0 0:01.36 X
4404 root 15 0 66540 16m 13m S 0.3 6.9 0:02.31 kdeinit
1 root 16 0 1772 544 464 S 0.0 0.2 0:00.61 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/0
4 root 5 -10 0 0 0 S 0.0 0.0 0:00.02 khelper
5 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
19 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
30 root 15 0 0 0 0 S 0.0 0.0 0:00.01 pdflush
32 root 14 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0
20 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
31 root 15 0 0 0 0 S 0.0 0.0 0:00.01 kswapd0
618 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod
第一行的項目依次為當前時間、系統啟動時間、當前系統登錄用戶數目、平均負載。
第二行為進程情況,依次為進程總數、休眠進程數、運行進程數、僵死進程數、終止進程數。
第三行為CPU狀態,依次為用戶占用、系統占用、優先任務占用、閑置任務占用。
第四行為內存狀態,依次為平均可用內存、已用內存、空閑內存、共享內存、緩存使用內存。
第五行為交換狀態,依次為平均可用交換容量、已用容量、閑置容量、交換高速緩存容量。
然后下面就是和ps相仿的各進程情況列表了。
總的來說,top命令的功能強于ps,但需要長久占用前台,所以用戶應該根据自己的情況來使用這個命令。
9. oprofile
Oprofile這個性能監視工具是利用處理器上所包含的專用的性能監視硬件(若沒有性能監視硬件則使用一個基于計時器的代用品)來收集與性能相關的數据樣品(samples)。它獲得關于內核以及系統上的可執行文件的信息,例如內存是何時被引用的;L2緩存請求的數量;收到的硬件中斷數量等。
下表提供了對 oprofile 軟件包中包括的工具的總覽。
命令 描述
opcontrol 配置要收集的數据
op_help 顯示系統處理器的可用事件以及每個事件的簡單描述
opreport 獲得有用的profile數据
Opannotate 如果應用程序使用調試符號編譯了,創建帶注解
oprofiled 作為守護進程來運行,定期把樣品數据寫入磁盤
Oparchive 收集可執行文件信息和調試信息,將采樣文件歸檔
op_import 把樣品數据庫文件從异類二進制格式轉換成系統的本地原始格式。只有在分析不同體系的樣品數据庫時才使用該選項。
(1)opcontrol
在運行 OProfile 之前,必須用opcontrol配置監視環境。在 opcontrol 命令被執行時,設置選項就會被保存到 /root/.oprofile/daemonrc 文件中。
命令格式
opcontrol [--vmlinux] [--start] [--stop] [--dump] [--shutdown] [--save=filename]
參數解釋
參數 描述
vmlinux 用來配置是否監視內核。要監視內核,以根用戶身份執行以下命令:
>opcontrol --vmlinux=/usr/src/linux-2.6.13/vmlinux
要配置 OProfile 不監視內核,以根用戶身份執行以下命令:
>opcontrol --no-vmlinux
這個命令還會載入 oprofile 內核模塊(如果還沒有被載入),並創建 /dev/oprofile/ 目錄(如果不存在)。
start 開始監視系統
要使用 OProfile 來開始監視系統,以根用戶身份執行以下命令:
>opcontrol --start
Reading module info.
Using log file /var/lib/oprofile/oprofiled.log
Daemon started.
Profiler running.
/root/.oprofile/daemonrc 中的設置被使用。OProfile 守護進程 oprofiled 被啟動;它定期把樣品數据寫入 /var/lib/oprofile/samples/ 目錄。該守護進程的日志位于 /var/lib/oprofile/oprofiled.log。如果 OProfile 使用不同的配置選項被重新啟動,以前會話中的樣品文件就會被自動備份到 /var/lib/oprofile/samples/session-N 目錄中,這里的 N 是前一次備份會話數量再加1。
stop 停止監視
Shutdown 要停止建檔器,以根用戶身份執行以下命令:
>opcontrol –shutdown
Save save 保存數据
要保存當前的抽樣文件集合,執行以下命令,把 替換成當前會話中的獨特描述性名稱。 opcontrol --save= 目錄 /var/lib/oprofile/samples/name/ 被創建,當前的抽樣文件被復制到其中。
Dump dump OProfile 守護進程 oprofiled 定期收集樣品,並把它們寫入 /var/lib/oprofile/samples/ 目錄。在讀取數据之前,請以根用戶身份執行以下命令來确定所有數据都被寫入這個目錄中了
上一篇
返回
下一篇
標籤:



