Linux服务器I/O性能分析-2
生活随笔
收集整理的這篇文章主要介紹了
Linux服务器I/O性能分析-2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、如何正確分析IO性能
1.1 BLKTRACE分析IO性能
之前的文章已經說明,要是系統發生I/O性能問題,我們常用的命令是無法精確定位問題(內核I/O調度器消耗的時間和硬件消耗的時間,這個不能作為性能指標),這時候blktrace就可以用來分析,它記錄了I/O整個過程,從中可以分析是I/O調度器慢還是硬件響應慢。
1.2 BLKTRACE原理
# man blktrace DESCRIPTION:
blktrace is a block layer IO tracing mechanism which provides detailed information about request queue operations up to user space.
There are three major components: a kernel component, a utility to record the i/o trace information for the kernel to user space,
andutilities to analyse and view the trace information. # 大概意思就是說:
# blktrace是一個塊層(block layer)IO跟蹤機制,將請求隊列的詳細信息發送到用戶空間
# 主要有三個組件:
# 1. 內核組件
# 2. 記錄內核到用戶空間的I/O追蹤信息的程序
# 3. 分析、展示I/O追蹤信息的程序
1.2.1 執行過程分析
- 可能會被Device Mapper映射到其它設備 Remap
- 可能會因為I/O請求size太大而被拆分成多個I/O請求 Split
- 可能因為與其它I/O請求的物理位置相鄰而合并 Merge
- 然后通過Device driver交給硬件;如:分布式存儲經過HBA、光纖、SAN交換機(網絡)等最后到達存儲設備,設備完成I/O請求之后再把結果返回給用戶空間。如下圖:
1.3 執行過程解析
通過blktrace將結果輸出到屏幕,然后用blkparse將屏幕中的結果作為輸入,最后將分析結果輸出到屏幕,需要注意的是blktrace不具備分析功能,需要借助blkparse進行分析!!!
# blktrace -d /dev/sda -o - | blkparse -i -
8,0 0 1 0.000000000 8702 A WS 13104216 + 8 <- (8,3) 11258968
8,0 0 2 0.000001717 8702 Q WS 13104216 + 8 [mysqld]
8,0 0 3 0.000003721 8702 G WS 13104216 + 8 [mysqld]
8,0 0 4 0.000004734 8702 I WS 13104216 + 8 [mysqld]
8,0 0 5 0.000006124 8702 D WS 13104216 + 8 [mysqld]
8,0 0 6 0.000035396 0 C WS 13104216 + 8 [0]
8,0 0 7 1.000409841 8702 A WS 13104216 + 8 <- (8,3) 11258968
8,0 0 8 1.000410566 8702 Q WS 13104216 + 8 [mysqld]
8,0 0 9 1.000412044 8702 G WS 13104216 + 8 [mysqld]
8,0 0 10 1.000412785 8702 I WS 13104216 + 8 [mysqld]
8,0 0 11 1.000413498 8702 D WS 13104216 + 8 [mysqld]
8,0 0 12 1.000438822 0 C WS 13104216 + 8 [0]
8,0 0 13 1.018085707 20501 A W 96409432 + 8 <- (8,3) 94564184
8,0 0 14 1.018085964 20501 Q W 96409432 + 8 [kworker/u32:0]
8,0 0 15 1.018086720 20501 G W 96409432 + 8 [kworker/u32:0]
8,0 0 16 1.018087010 20501 I W 96409432 + 8 [kworker/u32:0]
8,0 0 17 1.018087394 20501 D W 96409432 + 8 [kworker/u32:0]
8,0 0 18 1.018093866 20501 A W 96411880 + 8 <- (8,3) 94566632
8,0 0 19 1.018094103 20501 Q W 96411880 + 8 [kworker/u32:0]
8,0 0 20 1.018094495 20501 G W 96411880 + 8 [kworker/u32:0]
8,0 0 21 1.018094639 20501 I W 96411880 + 8 [kworker/u32:0]
8,0 0 22 1.018094963 20501 D W 96411880 + 8 [kworker/u32:0]
8,0 0 23 1.018106915 0 C W 96409432 + 8 [0]
1.3.1 字段解釋
- 第一列:主次設備號
- 第二列:CPU
- 第三列:序列號
- 第四列:時間戳
- 第五列:PID進程號
- 第六列:具體事件 后續詳解
- 第七列:具體的動作(讀、寫等)
- 第八列:磁盤起始塊 + 操作的塊的數量
- 第九列:進程名和具體的命令
1.3.2 第六列解釋
- A:IO被重新映射到不同的設備
- C:IO請求執行完畢
- D:IO請求進入Driver
- G:IO請求生成
- I:IO請求進入IO調度器隊列
- M:IO返回與隊列中的請求合并
- P: 當一個I/O入隊一個空隊列時,Linux會鎖住這個隊列,不處理該I/O,這樣做是為了等待一會,看有沒有新的I/O進來,可以合并
- Q:即將生成IO請求
- S:沒有可用的request結構體,也就是I/O滿了,只能等待有request結構體完成釋放
- T:超時斷開
- U:當隊列中已經有I/O request時,會放開這個隊列,準備向磁盤驅動發送該I/O。
- X: 對于做了Raid或進行了device mapper(dm)的設備,進來的IO可能需要切割,然后發送給不同的設備
1.3.3 第六列代表了IO經過的各階段
1.3.4 IO的生命周期以及計算方法
- Q2G:生成IO請求所消耗的時間,包括remap和split的時間
- G2I:IO請求進入IO調度器所消耗的時間,包括了merge的時間
- I2D:IO請求在IO調度器中等待的時間
- D2C:IO請求在Driver上和硬件上所消耗的時間
- Q2C:整個IO請求所消耗的時間即:Q2I + I2D + D2C = Q2C
- 以上指標有助于進一步定位緩慢發生的地方
- D2C:可以作為硬件性能的指標
- I2D:可以作為IO調度器的性能指標
后續通過寫腳本可以非常值觀的統計IO讀寫數量、延遲、塊大小等信息!
總結
以上是生活随笔為你收集整理的Linux服务器I/O性能分析-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些值得一读的优秀开源 JS 代码
- 下一篇: Tomcat源码分析 (九)-----