概述
針對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設備讀寫了多少數據。到底是數據庫的那部分操作使IO這么忙,或者說到底是哪個表,哪個數據文件的IO動作最頻繁,以及他到底是什么樣的系統調用。
所以今天主要分享一個實用工具幫助我們獲取這些信息--pt-ioprofile。
一、原理
pt-ioprofile主要做了兩件事情,
1. lsof+strace每秒
2.對輸出結果做聚合計算。
對某個pid附加一個strace進程進行IO分析, --profile-pid指定pid, --cell=sizes,該參數將結果已 B/s 的方式展示出來
total:該列是對后面所有列相加得到的和。
read/write:read系統調用從文件描述符fd所代指的打開文件中讀取/寫入數據,通常會配合lseek系統調用來使用,首先使用lseek來定位偏移量,然后進行read/write操作。
ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, void *buf, size_t count);
pread/pwrite:該系統調用讓我們在fd文件的offset處開始讀取/寫入,讀取count個字節,并將這些數據放入*buf中,但是不改變文件文件的當前偏移量
pwrite主要使用在多線程并發讀寫文件的場景,多個線程同時讀寫文件彼此不受影響。
ssize_t pread(int fd, void *buf, size_t count, off_t offset); ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
fsync=數據+元數據(屬主,屬組,文件權限文件大小,文件鏈接)
#include int fsync(int fd);
fsync的功能是確保文件fd所有已修改的內容已經正確同步到硬盤上,該調用會阻塞等待直到設備報告IO完成。
除了同步文件的修改內容(臟頁),fsync還會同步文件的描述信息(metadata,包括size、訪問時間st_atime & st_mtime等等),因為文件的數據和metadata通常存在硬盤的不同地方,因此fsync至少需要兩次IO寫操作,變向隨機IO.
fdatasync=數據,fdatasync的功能與fsync類似,但是僅僅在必要的情況下才會同步metadata,因此可以減少一次IO寫操作。
fdatasync,放寬了同步的語義以提高性能:
#include int fdatasync(int fd);
open/lose/seek:這是最基本的三種文件系統調用,分別是open打開文件描述符,close是關閉文件描述符,lseek是改變文件偏移量。
fcntl:函數可以改變已打開的文件性質,較復雜
filename:對應的數據文件。
二、相關參數
--aggregate:sum|avg:可以算平均值和總和
--cell:count|sizes:times:可以算系統調用次數,系統調用傳輸數據量,系統調用耗費的時間
--group-by:all|filename|pid:聚合方式,所有聚合在一起還是按照文件聚合
--profile-piid:跟蹤的進程pid
--profile-process:mysqld進程名
--run-time:采集時間
--save-samples:將輸出保存到文件,供后續分析。
三、安裝
yum -y install strace yum -y install https://www.percona.com/downloads/percona-toolkit/3.0.1/binary/redhat/7/x86_64/percona-toolkit-3.0.1-1.el7.x86_64.rpm
四、常用命令
1、60s內數據庫有IO活動的文件產生的各種系統調用次數
pt-ioprofile --profile-process=mysqld --run-time=60 --save-samples=/tmp/mysql_ioprofile.txt --group-by=filename --cell=count --aggregate=sum
2、60s內數據庫中有IO活動的文件,各種系統調用平均每秒產生的數據量
pt-ioprofile --profile-process=mysqld --run-time=60 --save-samples=/tmp/mysql_ioprofile.txt --group-by=filename --cell=sizes --aggregate=avg
3、數據庫有IO活動的文件,各種系統調用平均耗費的時間
pt-ioprofile --profile-process=mysqld --save-samples=/tmp/mysql_ioprofile.txt --group-by=filename --cell=times --aggregate=avg
注意在生產環境使用的時候一定要謹慎,建議在業務空閑時使用。