分享一款mysql資料庫數據文件IO監控神器--pt-ioprofile

2019-09-19     波波說運維

概述

針對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

注意在生產環境使用的時候一定要謹慎,建議在業務空閒時使用。


覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/zh-sg/r8sXRm0BJleJMoPMXKiZ.html