1、pstree

   進程樹查看

-p:並顯示各進程的PID

[[email protected] ~]# pstree
init─┬─ManagementAgent───2*[{ManagementAgen}]
     ├─NetworkManager
     ├─VGAuthService
     ├─atd
     ├─auditd───{auditd}
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─dbus-daemon
     ├─dhclient
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─login───bash
     ├─master─┬─pickup
     │        └─qmgr
     ├─5*[mingetty]
     ├─modem-manager
     ├─polkitd
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─sshd───bash
     │      └─sshd───bash───pstree
     ├─ssserver
     ├─udevd───2*[udevd]
     ├─vmtoolsd───{vmtoolsd}
     └─wpa_supplicant

2、pgrep

-U UID:僅顯示以指定用戶身份運行的進程號;可接用戶名或UID

-G GID

-l: 顯示PID和進程名;

[[email protected] ~]# pgrep -U postfix
1852
20521
[[email protected] ~]# pgrep -G postfix
1852
20521
[[email protected] ~]# pgrep -l -U postfix
1852 qmgr
20521 pickup
[[email protected] ~]# pgrep -U -l postfix
pgrep: invalid user name: -l

3、pidof

   顯示指定命令所啓動的pid

pidof PROGRAM   #PROGRAM是給定命令或程序

[[email protected] ~]# pidof sshd
20140 19956 19828 14103 1637

4、ps

  顯示的是當前進程狀態信息的快照,爲靜態結果

[[email protected] ~]# ping 192.168.10.10 >/dev/null &
[1] 18435
[[email protected] ~]# ps
  PID TTY          TIME CMD
 8587 pts/0    00:00:00 bash
18435 pts/0    00:00:00 ping
18473 pts/0    00:00:00 ps

   默認情況,ps命令只顯示屬於當前用戶並正在當前終端中運行的進程

wKiom1hTt1Gw1tjqAADRZvjJkPo969.png支持衆多選項:

   BSD風格:選項前不加「-」

   SysV風格

根據進程啓動時是否是通過終端上的用戶接×××互式啓動的,進程可分爲兩類:

所有與終端相關的進程:a

所有與終端無關的進程:x

以用戶爲中心組織進程狀態信息顯示:u

常用選項組合1:axu

[[email protected] ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  19360  1536 ?        Ss   03:55   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    03:55   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    03:55   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    03:55   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    03:55   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    03:55   0:00 [watchdog/0]

USER:進程的屬主

PID:進程號

%CPU:佔據CPU的的百分比

%MEM:佔據內存的百分比

VSZ:佔用線性地址空間的大小

RSS:常駐內存集,指不可以被交換至swap空間的數據佔據空間大小;

TTY:終端

START:進程啓動時間

TIME:佔據CPU累計時間

COMMAND:啓動當前進程的命令,[COMMAND]表示爲內核線程

STAT:進程狀態

      R:運行

      S:interruptible sleeping,可中斷睡眠

      D:uniterruptible sleeping, 不可中斷睡眠

      T: stopped 停止

      Z: zombie 僵死

      s: session leader  進程領導者

     +: 前臺進程,佔據着某終端,終端關閉進程也被關閉

     l: 多線程進程

     <: 高優先級進程

     N: 低優先級進程


常用選項組合2: -ef          

        -e: 顯示所有進程;

        -f: 顯示豐富格式信息

ppid:父進程號


常用選項組合3:-eFH

-F: 顯示額外信息

-H: 以層級形式顯示進程間關係;


o 要顯示的字段:自定義

例如:ps axo pid,command,psr,pri,ni

     psr: 當前進程運行的CPU編號;

     pri: 當前進程的優先級;

      ni: 當前進程的nice值:-20, 19


5、uptime

   顯示當前系統時間運行時長(上次開機至現在運行的時間),登錄的用戶數系統平均負載

系統平均負載:在特定時間間隔內CPU上等待運行的進程隊列的長度(平均進程數

  通過top\uptime\w\tload可以獲取到load average的值,它的三個數字值分別記錄了一分鐘\五分鐘\十五分鐘的系統平均負載。


6、top命令

  top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態.如果在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止,比較準確的說,top命令提供了實時的對系統的整體運行狀態監視.它將顯示系統中CPU最「敏感」的任務列表,是一個綜合了多方信息監測系統性能和運行信息的實用工具。

該命令可以按CPU使用、內存使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過交互式命令或者在個人定製文件中進行設定,有許多交互式的子命令:wKiom1hTlTuSj6L_AABW7h5EvaQ322.png

首部信息顯示:

l: 是否顯示系統負載行;隊列長度的合理區間:CPU顆數*0.7

t: 是否顯示進程摘要信息及CPU平均佔用率(負載狀態);

1:(數字1)分別顯示多顆CPU負載狀態

m:是否顯示內存和交換分區使用信息


排序:

P:以佔據的CPU百分比大小排序;從大到下依次排序

M:以佔據Memory空間大小排序;

T:累積佔用CPU時間排序;


cpu平均佔用率欄詳解:

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
        us: user space

us:用戶空間所佔的比率

sy: system (kernel space) 內核空間

ni: nice (被nice調整過的進程)改變過優先級的進程佔用CPU的百分比

id: idle   空閒

wa: wait io  等待io完成

hi:hardware interrupt  硬件中斷

si: software interrupt   軟件終端

st: stolen, 被虛擬化(虛擬機)「偷走」的百分比


q: 退出命令

s:修改刷新間隔時間,默認爲3

k: 終止指定進程


top命令的選項:

-b: batch,批次顯示

-n #: 顯示的批次數量,和-b一起使用

-d N: 指明延遲時長

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                        
 9916 root      20   0  169m 114m  17m S  9.6  0.2 128:36.64 svr_scene                                                                                       
26430 root      20   0  167m 119m  17m S  5.0  0.2 445:02.57 svr_scene                                                                                       
 9920 root      20   0  156m  28m 4948 S  3.6  0.0  52:39.27 svr_gateway                                                                                     
 9911 root      20   0 74728  35m  14m S  3.0  0.1  23:01.81 svr_manager                                                                                     
 9918 root      20   0 92628  53m  16m S  3.0  0.1  38:44.87 svr_app                                                                                         
 5421 root      20   0  150m  23m 1464 S  2.7  0.0 572:10.42 redis-server                                                                                    
 9914 root      20   0  215m  76m  15m S  2.7  0.1  27:45.02 svr_data                                                                                        
26431 root      20   0 96556  51m  16m R  1.7  0.1 131:52.15 svr_app

進程信息

列名

含義

PID

進程id

PPID

父進程id

RUSER

Real user name

UID

進程所有者的用戶id

USER

進程所有者的用戶名

GROUP

進程所有者的組名

TTY

啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?

PR

優先級

NI

nice值。負值表示高優先級,正值表示低優先級

P

最後使用的CPU,僅在多CPU環境下有意義

%CPU

上次更新到現在的CPU時間佔用百分比

TIME

進程使用的CPU時間總計,單位秒

TIME+

進程使用的CPU時間總計,單位1/100秒

%MEM

進程使用的物理內存百分比

VIRT

進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES

SWAP

進程使用的虛擬內存中,被換出的大小,單位kb。

RES

進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA

CODE

可執行代碼佔用的物理內存大小,單位kb

DATA

可執行代碼以外的部分(數據段+棧)佔用的物理內存大小,單位kb

SHR

共享內存大小,單位kb

nFLT

頁面錯誤次數

nDRT

最後一次寫入到現在,被修改過的頁面數。

S

進程狀態。
            D=不可中斷的睡眠狀態
            R=運行
            S=睡眠
            T=跟蹤/停止
            Z=殭屍進程

COMMAND

命令名/命令行

WCHAN

若該進程在睡眠,則顯示睡眠中的系統函數名

Flags

任務標誌,參考 sched.h

  默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過下面的快捷鍵來更改顯示內容。

通過 f 鍵可以選擇顯示的內容:

  按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按回車鍵確定。
按 o 鍵可以改變列的顯示順序:

  按小寫的 a-z 可以將相應的列向右(下)移動,而大寫的 A-Z 可以將相應的列向左(上)移動。最後按回車鍵確定。
按大寫的 F 或 O 鍵,然後按 a-z 可以將進程按照相應的列進行排序。而大寫的 R 鍵可以將當前的排序倒轉。


VIRT:virtual memory usage 虛擬內存 
1、進程「需要的」虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量


RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out
2、包含其他進程的共享
3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
4、關於庫佔用內存的情況,它只統計加載的庫文件所佔內存大小

SHR:shared memory 共享內存
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所佔的物理內存大小公式:RES – SHR
4、swap out後,它將會降下來

DATA
1、數據佔用的內存。如果top沒有顯示,按f鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。

VIRT=SWAP+RES
RES=CODE+DATA

8、htop
   htop是Linux系統下一個基本文本模式的、交互式的進程查看器,主要用於控制檯或shell中,可以替代top,或者說是top的高級版。

快速查看關鍵性能統計數據,如CPU(多核佈局)、內存/交換使用
可以橫向或縱向滾動瀏覽進程列表,以查看所有的進程和完整的命令行
殺掉進程時可以直接選擇而不需要輸入進程號
通過鼠標操作條目
比top啓動得更快

命令:

u: 過濾僅顯示選定用戶的進程;

s: 跟蹤選定的進程所發起的系統調用;

l: 顯示選定進程所打開的文件;

t: 顯示進程的層次結構;

a: 設定進程的cpu親緣性;(將選定的進程綁定在指定的CPU上)

選項:

-d #: 延遲時長

-u USERNAME: 僅顯示指定用戶的進程;

-s COLUMN: 根據指定的字段進行排序;


9、vmstat

  報告關於進程、內存、磁盤I/O,系統中斷,進程切換,cpu平均佔用率等系統整體運行狀態

[[email protected] ~]# vmstat  #默認顯示一次
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1383072  59572 325744    0    0     4     0   21   21  0  0 100  0  0	

wKiom1hTlSehPXZtAAB5fMhcUO0923.png

r:運行或等待運行的進程個數

in:中斷髮生速率,每秒的中斷數

使用格式:

   vmstat [delay [counts]]

         延時刷新  刷新幾次 

     -s:顯示內存統計數據

[[email protected] ~]# vmstat 1 3  #每隔1秒刷新一次,總共刷新3次,不指定刷新次數則一直運行下去
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 1383104  59676 325744    0    0     4     0   21   21  0  0 100  0  0	
 0  0      0 1383080  59676 325744    0    0     0     0   41   34  0  0 100  0  0	
 0  0      0 1383080  59676 325744    0    0     0     0   74   46  0  0 100  0  0	
[[email protected] ~]# vmstat -s
      1914492  total memory
       531264  used memory
       201280  active memory
       218100  inactive memory
      1383228  free memory
        59676  buffer memory
       325744  swap cache
      2047992  total swap
            0  used swap
      2047992  free swap
         2140 non-nice user cpu ticks
           36 nice user cpu ticks
         7526 system cpu ticks
      8954651 idle cpu ticks
         7688 IO-wait cpu ticks
           29 IRQ cpu ticks
         1649 softirq cpu ticks
            0 stolen cpu ticks
       385801 pages paged in
        40062 pages paged out
            0 pages swapped in
            0 pages swapped out
      1897682 interrupts
      1896584 CPU context switches
   1481831717 boot time
        16382 forks

10、dstat

     動態地統計系統資源信息

     dstat命令是一個全能信息統計工具,擁有彩色界面,實時刷新,功能非常強大wKioL1hTrznyj2pmAABdFkTS2tA456.png

使用格式:

 dstat [-afv] [options..] [delay [count]]      

-c: 顯示cpu性能指標相關的統計數據;

-d: 顯示disk相關的速率數據;

-g: 顯示page相關的速率數據;

-i: 顯示interrupt相關的速率數據;

-l: 顯示load average相關的統計數據;

-m: 顯示memory相關的統計數據;

-n: 顯示網絡收發數據的速率;

-p: 顯示進程相關的統計數據,

-r: io請求的速率;

-s: 顯示swap的相關數據

-y: 顯示系統相關的數據,包括中斷和進程切換;

--top-cpu:顯示最佔用CPU的進程;

--top-bio:顯示最消耗block io的進程;

--top-io:最佔用io的進程;

--top-mem:顯示最佔用內存的進程;

--ipc: 顯示進程間通信相關的速率數據;

--raw: 顯示raw套接的相關的數據;

--tcp: 顯示tcp套接字的相關數據;

--udp: 顯示udp套接字的相關數據;

--unix: 顯示unix sock接口相關的統計數據;

--socket: 

-a: -cdngy


11、iostat來對linux硬盤IO性能進行了解

Linux系統中的 iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是彙報磁盤活動統計情況,同時也會彙報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。iostat屬於sysstat軟件包。可以用yum install sysstat 直接安裝。

1.命令格式:

iostat[參數][時間][次數]

2.命令功能:

            通過iostat方便查看CPU、網卡、tty設備、磁盤、CD-ROM 等等設備的活動情況,負載信息

3.命令參數:

-c 顯示CPU使用情況

-d 顯示磁盤使用情況;可以指定只顯示某分區的使用情況,不指定顯示所有磁盤的使用情況,

-k 以 KB 爲單位顯示

-m 以 M 爲單位顯示

-N 顯示磁盤陣列(LVM) 信息

-n 顯示NFS 使用情況

-p[磁盤] 顯示磁盤和分區的情況

-t 顯示終端和CPU的信息

-x 顯示詳細信息

-V 顯示版本信息


4.使用實例:

實例1:顯示所有設備負載情況

命令:

iostat

[[email protected] ~]$ iostat
Linux 2.6.32-431.el6.x86_64 (esf)     05/20/2017     _x86_64_    (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.23    0.00    0.09    0.27    0.00   99.41

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              16.43         3.55       446.43   15920980 2004854200

[[email protected] ~]$ iostat -k
Linux 2.6.32-431.el6.x86_64 (esf)     05/20/2017     _x86_64_    (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.23    0.00    0.09    0.27    0.00   99.41

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              16.43         1.77       223.22    7960490 1002488360

說明:

cpu屬性值說明:

%user:CPU處在用戶模式下的時間百分比。

%nice:CPU處在帶NICE值的用戶模式下的時間百分比。

%system:CPU處在系統模式下的時間百分比。

%iowait:CPU等待輸入輸出完成時間的百分比。

%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。

%idle:CPU空閒時間百分比。


備註:

   如果%iowait的值過高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閒,如果%idle值高但系統響應慢時,有可能是CPU等待分配內存,此時應加大內存容量。%idle值如果持續低於10,那麼系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU


disk屬性值說明:

            tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。

「一次傳輸」意思是「一次I/O請求」。多個邏輯請求可能會被合併爲「一次I/O請求」。「一次傳輸」請求的大小是未知的。

kB_read/s:每秒從設備(drive expressed)讀取的數據量;

kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;

kB_read:讀取的總數據量;kB_wrtn:寫入的總數量數據量;

這些單位都爲Kilobytes。


rrqm/s:  每秒進行 merge 的讀操作數目。即 rmerge/s

wrqm/s:  每秒進行 merge 的寫操作數目。即 wmerge/s

r/s:  每秒完成的讀 I/O 設備次數。即 rio/s

w/s:  每秒完成的寫 I/O 設備次數。即 wio/s

rsec/s:  每秒讀扇區數。即 rsect/s

wsec/s:  每秒寫扇區數。即 wsect/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 操作,即被io消耗的cpu百分比


備註:

  如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大於 svctm,說明I/O 隊列太長,io響應太慢,則需要進行必要優化。如果avgqu-sz比較大,也表示有當量io在等待。

[[email protected] ~]$ iostat -xk
Linux 2.6.32-431.el6.x86_64 (esf)     05/20/2017     _x86_64_    (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.23    0.00    0.09    0.27    0.00   99.41

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    39.45    0.09   16.33     1.77   223.17    27.39     0.25   15.45   4.97   8.16

[[email protected] ~]$ iostat -xkd
Linux 2.6.32-431.el6.x86_64 (esf)     05/20/2017     _x86_64_    (24 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    39.45    0.09   16.33     1.77   223.17    27.39     0.25   15.45   4.97   8.16


%util:  一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的.即 delta(use)/s/1000 (因爲use的單位爲毫秒)

如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸.
idle小於70% IO壓力就較大了,一般讀取速度有較多的wait.

   同時可以結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高)。
        另外 await 的參數也要多和 svctm 來參考.差的過高就一定有 IO 的問題.

avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的數據的大小,如果次數多,但數據拿的小的話,其實 IO 也會很小。如果數據拿的大,才IO 的數據會高。也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是講,讀定速度是這個來決定的。

svctm 一般要小於 await (因爲同時等待的請求的等待時間被重複計算了),svctm 的大小一般和磁盤性能有關,CPU/內存的負荷也會對其有影響,請求過多也會間接導致 svctm 的增加。await 的大小一般取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大於 svctm,說明 I/O 隊列太長,應用得到的響應時間變慢,如果響應時間超過了用戶可以容許的範圍,這時可以考慮更換更快的磁盤,調整內核 elevator 算法,優化應用,或者升級 CPU。

隊列長度(avgqu-sz)也可作爲衡量系統 I/O 負荷的指標,但由於 avgqu-sz 是按照單位時間的平均值,所以不能反映瞬間的 I/O 洪水。


別人一個不錯的例子.(I/O 系統 vs. 超市排隊)

舉一個例子,我們在超市排隊 checkout 時,怎麼決定該去哪個交款臺呢? 首當是看排的隊人數,5個人總比20人要快吧? 除了數人頭,我們也常常看看前面人購買的東西多少,如果前面有個採購了一星期食品的大媽,那麼可以考慮換個隊排了.還有就是收銀員的速度了,如果碰上了連 錢都點不清楚的新手,那就有的等了.另外,時機也很重要,可能 5 分鐘前還人滿爲患的收款臺,現在已是人去樓空,這時候交款可是很爽啊,當然,前提是那過去的 5 分鐘裏所做的事情比排隊要有意義 (不過我還沒發現什麼事情比排隊還無聊的).

I/O 系統也和超市排隊有很多類似之處:

總IO請求數:r/s+w/s;類似於交款人的總數
平均隊列長度(avgqu-sz):類似於單位時間裏平均排隊人的個數
平均服務時間(svctm):類似於收銀員的收款速度
平均等待時間(await):類似於平均每人的等待時間
平均I/O數據(avgrq-sz):類似於平均每人所買的東西多少
I/O 操作率 (%util):類似於收款臺前有人排隊的時間比例.

我們可以根據這些數據分析出 I/O 請求的模式,以及 I/O 的速度和響應時間.


下面是別人寫的這個參數輸出的分析

# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0  0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29

上面的 iostat 輸出表明秒有 28.57 次設備 I/O 操作:

總IO(io)/s = r/s(讀) +w/s(寫) = 1.02+27.55 = 28.57 (次/秒) 其中寫操作佔了主體 (w:r = 27:1).


平均每次設備 I/O 操作只需要 5ms 就可以完成,但每個 I/O 請求卻需要等上 78ms,爲什麼?

        因爲發出的 I/O 請求太多 (每秒鐘約 29 個),系統處理不過來,產生IO阻塞,需要等待


假設這些請求是同時發出的,那麼平均等待時間可以這樣計算:

        平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + … + 請求總數-1) / 請求總數

應用到上面的例子:

        平均等待時間 = 5ms * (1+2+…+28)/29 = 70ms

和 iostat 給出的78ms 的平均等待時間很接近.這反過來表明 I/O 是同時發起的.

    

      一秒中有 14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裏 I/O 系統無事可做,所有 29 個 I/O 請求都在142毫秒之內處理掉了.

         delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8

      表明每秒內的I/O請求總共需要等待2232.8ms.所以平均隊列長度應爲 2232.8ms/1000ms = 2.23,而 iostat 給出的平均隊列長度 (avgqu-sz) 卻爲 22.35,爲什麼?! 因爲 iostat 中有 bug,avgqu-sz 值應爲 2.23,而不是 22.35.


       每秒發出的 I/O 請求很多 (約 29 個),平均隊列卻不長 (只有 2個 左右),這表明這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的.