標籤:
針對IO密集型應用做系統調優的時候,我們通常都需要知道系統cpu 記憶體 io 網路等系統效能 和 使用率,結合應用本身的訪問量,以及 mysql的效能指標來綜合分析。比如說:我們將系統壓力情況分為三個階段:從使用者端開始到web server,再到mysql。
1. 客戶量:我們可以從web app的訪問log,查看訪問量(通常會記錄時間),
2. 系統指標: 對比dstat、 iostat/ mpstat pidstat 等搜集對應的系統效能指標,
3. mysql: 使用mysql status ,或者 mycheckpoint等工具搜集mysql的cache , query等資料。
但是問題來了,我們很容易搜集到了系統層、裝置層的IO資料,但是缺少一個體貼的工具來告訴你應用開啟了多少檔案,檔案讀寫比例,執行了多少次fsync,是隨機讀寫還是順序讀寫,另外,mysql是一個龐大而精心設計的系統,使用了一些列的方案如table cache, thread cache 等來提升IO,我們比較容易獲得他的緩衝量,命中率,檔案數,但是卻不好直觀的知道它到底對物理IO裝置讀寫了多少資料。
ioprofile就是這樣一個工具,提供了直觀的量化的資料來描述進程對io裝置的真實讀寫量。
由於實現方式是使用strace注入到線程中,所以運行時需要sudo,方法如下:
sudo ./pt-ioprofile -p 8534 -c count
sudo ./pt-ioprofile -p 8534 -c sizes
2015年 04月 23日 星期四 17:55:35 CSTTracing process ID 8534 total read pwrite fsync open close filename 613878 613878 0 0 0 0 /redmine/mysql/data/mycheckpoint/sv_diff.frm 406924 406924 0 0 0 0 /redmine/mysql/data/mycheckpoint/sv_sample.frm 18432 0 18432 0 0 0 /redmine/mysql/data/ib_logfile1 3029 3029 0 0 0 0 /redmine/mysql/data/mycheckpoint/custom_query_view.frm
sudo ./pt-ioprofile -p 8534 -c times
2015年 04月 23日 星期四 17:54:09 CSTTracing process ID 8534 total pwrite fsync filename 0.100162 0.000271 0.099891 /redmine/mysql/data/ibdata1 0.003826 0.000000 0.003826 /redmine/mysql/data/ib_logfile0
sudo ./pt-ioprofile -p 8534 -c sizes -g filename
有人在生產環境中使用ioprofile時出現導致mysql掛起的現象,雖然是4年前了,但還是請謹慎使用。
以上資料輸出中的 read write fread fwrite fsync 等指標分別是指什麼呢? 多大的量才算正常?
read/write/fsync:
1. linux底層操作;
2. 核心調用, 涉及到進程內容相關的切換,即使用者態到核心態的轉換,這是個比較消耗效能的操作。
fread/fwrite/fflush:
1. c語言標準規定的io流操作,建立在read/write/fsync之上
2. 在使用者層, 又增加了一層緩衝機制,用於減少核心調用次數,但是增加了一次記憶體拷貝。
關係參看:
1. 對於輸入裝置,調用fsync/fflush將清空相應的緩衝區,其內資料將被丟棄;
2. 對於輸出裝置或磁碟檔案,fflush只能保證資料到達核心緩衝區,並不能保證資料到達物理裝置, 因此應該在調用fflush後,調用fsync(fileno(stream)),確保資料存入磁碟。
參考:
1. http://blog.yufeng.info/archives/995
2. http://blog.csdn.net/ybxuwei/article/details/22727565
pt-ioprofile分析查看mysql的真實IO情況