Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

6.3. 工具

可協助診斷 I/O 子系統效能問題的工具有數個,vmstat 提供了系統效能的粗略總覽。下列欄位與 I/O 最有關聯:si(swap in)、so(swap out)、bi(block in)、bo(block out),以及 wa(I/O wait time)。當您的 swap 空間和您的資料分割區位於相同裝置上的時候,siso 有助於您使用它們來作為整體記憶體壓力的指標。sibi 為讀取作業,而 sobo 則為寫入作業,單位皆為 KB。wa 為閒置時間;它會顯示等待 I/O 完成時,有哪些執行佇列被阻擋。
vmstat 分析您的系統能讓您檢視 I/O 子系統是否需要為任何的效能問題負責。freebuffcache 欄位也相當重要。cache 的值會隨著 bo 的值增加,並且 cache 減少和 free 增加代表系統正在執行分頁快取的回寫和無效判定。
請注意,vmstat 所回報的 I/O 數量為所有裝置的所有 I/O 彙總。當您判斷 I/O 子系統中可能有效能問題時,您可透過 iostat 以詳細分析問題所在,這將會以裝置來細分 I/O 回報。您亦可截取其它詳細資訊,例如平均請求大小、每秒的讀取和寫入數量,以及正在進行的 I/O 合併數量。
要辨識您的儲存裝置效能時,透過使用平均請求大小和平均佇列大小(avgqu-sz),您可藉由產生的圖表來估算您儲存裝置的效能,請注意,若平均請求大小為 4KB,而平均佇列大小為 1,則傳輸量不太可能具有極佳的效能。
若效能數據與您所預期的效能不符,您可透過 blktrace 進行更加精細的分析。blktrace 工具程式套件能詳細提供花在 I/O 子系統中的時間有多少。blktrace 的輸出會是一組二進位的追蹤檔案,此檔案能藉由類似 blkparse 的工具程式進行後續的處理。
blkparseblktrace 的姊妹工具程式。它會從 trace 讀取原生輸出,並產生一個速記的文字版本。
以下為 blktrace 的輸出範例:
8,64   3        1     0.000000000  4162  Q  RM 73992 + 8 [fs_mark]
8,64   3        0     0.000012707     0  m   N cfq4162S / alloced
8,64   3        2     0.000013433  4162  G  RM 73992 + 8 [fs_mark]
8,64   3        3     0.000015813  4162  P   N [fs_mark]
8,64   3        4     0.000017347  4162  I   R 73992 + 8 [fs_mark]
8,64   3        0     0.000018632     0  m   N cfq4162S / insert_request
8,64   3        0     0.000019655     0  m   N cfq4162S / add_to_rr
8,64   3        0     0.000021945     0  m   N cfq4162S / idle=0
8,64   3        5     0.000023460  4162  U   N [fs_mark] 1
8,64   3        0     0.000025761     0  m   N cfq workload slice:300
8,64   3        0     0.000027137     0  m   N cfq4162S / set_active wl_prio:0 wl_type:2
8,64   3        0     0.000028588     0  m   N cfq4162S / fifo=(null)
8,64   3        0     0.000029468     0  m   N cfq4162S / dispatch_insert
8,64   3        0     0.000031359     0  m   N cfq4162S / dispatched a request
8,64   3        0     0.000032306     0  m   N cfq4162S / activate rq, drv=1
8,64   3        6     0.000032735  4162  D   R 73992 + 8 [fs_mark]
8,64   1        1     0.004276637     0  C   R 73992 + 8 [0]
如您所見,輸出過於密集並且難讀。您可得知哪項程序負責發出 I/O 至您的裝置,雖然有幫助,不過 blkparse 亦可在摘要中,提供格式易讀的額外資訊。blkparse 的摘要資訊列印在其輸出中的最後部分:
Total (sde):
Reads Queued:          19,       76KiB  Writes Queued:     142,183,  568,732KiB
Read Dispatches:       19,       76KiB  Write Dispatches:   25,440,  568,732KiB
Reads Requeued:         0               Writes Requeued:       125
Reads Completed:       19,       76KiB  Writes Completed:   25,315,  568,732KiB
Read Merges:            0,        0KiB  Write Merges:      116,868,  467,472KiB
IO unplugs:        20,087               Timer unplugs:           0
摘要顯示了平均的 I/O 速率、合併活動,並比較讀取與寫入的工作量。然而大部份情況下,blkparse 的輸出太過冗長,而沒有什麼作用。值得慶幸的是,您可使用數項工具來協助您視覺化處理這些資料。
btt 提供了 I/O 在不同 I/O 堆疊部分中,所花費的時間上的分析。這些部分包含了:
  • Q — 區塊 I/O 已被排入佇列
  • G — 取得請求
    新排入佇列的 I/O 不是會與既有請求合併的 I/O,因此已分配新的區塊層請求。
  • M — 區塊 I/O 已與一項既有的請求合併。
  • I — 請求已插入裝置的佇列中。
  • D — 請求已傳送給裝置。
  • C — 請求已由驅動程式完成。
  • P — 區塊裝置佇列已插入,以讓請求能夠聚集。
  • U — 裝置佇列未插入,這能讓已聚集的請求傳送給裝置。
btt 將花在各個這些部分中的時間,以及花在切換上的時間細分,例如:
  • Q2Q — 請求傳送至區塊層所花費的時間
  • Q2G — 從區塊 I/O 排入佇列開始到它被分配到一項請求之間所花費的時間
  • G2I — 從請求被分配到它被插入裝置佇列之間所花費的時間
  • Q2M — 從區塊 I/O 被排入佇列到它與既有請求合併之間所花費的時間
  • I2D — 從請求被插入裝置佇列到它被實際傳送給裝置之間所花費的時間
  • M2D — 從區塊 I/O 與既有請求合併到該請求被傳送給裝置之間所花費的時間
  • D2C — 裝置請求的服務時間
  • Q2C — 花費在請求的區塊層中的時間
您能夠從上述表格中推算出許多有關於工作量的相關資訊。比方說,若 Q2Q 比 Q2C 大上許多,這代表應用程式並未快速發出 I/O 請求。因此,任何您所遇上的效能問題,可能根本與 I/O 子系統無關。若 DC2 非常高,則代表裝置花上了許多時間為請求提供服務。這顯示該裝置可能負載過高(可能是因為它是共享的資源),或可能是因為傳送給裝置的工作之效能狀況不佳。若 Q2G 非常高,代表同一時間排入了大量請求。這顯示儲存裝置可能無法跟上 I/O 請求載入的速度。
最後,seekwatcher 會取用 blktrace 二進位資料,並產生一組資訊,包括邏輯區塊位址(Logical Block Address,LBA)、傳輸量、每秒的搜尋量,以及每秒的 I/O 量(IOPS)。
seekwatcher 的範例輸出

圖形 6.2. seekwatcher 的範例輸出

所有圖表的 X 軸均為時間。LBA 圖顯示的讀取與寫入均以不同顏色表示。值得注意的是總處理能力(Throughput)與每秒搜尋時間(Seek Count)這兩者的關係。對於常進行搜尋的儲存裝置來說,這兩者成負相關。如果您發現有個裝置的總處理能力並不如預期,但您已經達到 IOPS 的限制,那麼 IOPS 圖表就很有用。