iotop: http://guichaz.free.fr/iotop/
pt-ioprofile: http://www.percona.com/downloads/percona-toolkit/2.2.1/
1、查看磁盤(pán)使用率 df -lh
2、安裝iostat 安裝命令: yum install sysstat
3、iostat -d -k 2 查看IO情況:
哪個(gè)磁盤(pán)的IO負(fù)載較高,接下來(lái)我們就來(lái)定位具體的負(fù)載來(lái)源
%util: 一秒中有百分之多少的時(shí)間用于 I/O 操作,或者說(shuō)一秒中有多少時(shí)間 I/O 隊(duì)列是非空的。即 delta(use)/s/1000 (因?yàn)閡se的單位為毫秒)
如果 %util 接近 100%,說(shuō)明產(chǎn)生的I/O請(qǐng)求太多,I/O系統(tǒng)已經(jīng)滿(mǎn)負(fù)荷,該磁盤(pán)可能存在瓶頸。
4、安裝iotop 命令:
安裝命令:yum install iotop iotop 查看哪個(gè)線程耗IO比較高、按 o 只顯示有磁盤(pán) IO 活動(dòng)的進(jìn)程。
5、pt-ioprofile定位負(fù)載來(lái)源文件
pt-ioprofile --profile-pid=1236 --cell=sizes
pt-ioprofile的原理是對(duì)某個(gè)pid附加一個(gè)strace進(jìn)程進(jìn)行IO分析。
6、對(duì)于定位問(wèn)題更有用的是通過(guò)IO的吞吐量來(lái)進(jìn)行定位。使用參數(shù) --cell=sizes,該參數(shù)將結(jié)果已 B/s 的方式展示出來(lái)
pt-ioprofile --profile-pid=1236 --cell=sizes
從上圖可以看出IO負(fù)載的主要來(lái)源是jetty。
并且壓力主要集中在讀取上。
前段時(shí)間,一個(gè)Mysql數(shù)據(jù)庫(kù)服務(wù)器磁盤(pán)IO寫(xiě)非常高,經(jīng)過(guò)排查,發(fā)現(xiàn)是mysql線程導(dǎo)致的,磁盤(pán)讀寫(xiě)情況,如下圖所示
從上圖可以看到磁盤(pán)IO已經(jīng)達(dá)到6.77M/S,mysql的版本是5.6,這個(gè)版本還沒(méi)有performance_schema.threads視圖的THREAD_OS_ID字段,沒(méi)辦法將操作系統(tǒng)的thread_id和mysql數(shù)據(jù)庫(kù)線程id進(jìn)行關(guān)聯(lián),不能精確定位是mysql那個(gè)線程產(chǎn)生的磁盤(pán)IO寫(xiě)操作。
于是登錄mysql數(shù)據(jù)庫(kù),臨時(shí)開(kāi)始Mysql數(shù)據(jù)庫(kù)的general_log,查看日志記錄,也沒(méi)有發(fā)現(xiàn)什么特殊操作
這就很詭異了,到底是什么原因呢,只能祭出終極武器perf了,看看此時(shí)mysql數(shù)據(jù)庫(kù)什么函數(shù)操作占用資源最多。
[root@mysql ~]# ps -ef|grep -i mysqld
mysql 11650 1 0 8月29 ? 00:00:00 /bin/sh /data/mysql-8.0.21/bin/mysqld_safe --defaults-file=/data/mysql/mysql8/conf/3308/my.cnf
mysql 12694 11650 2 8月29 ? 00:59:29 /data/mysql-8.0.21/bin/mysqld --defaults-file=/data/mysql/mysql8/conf/3308/my.cnf --basedir=/data/mysql-8.0.21 --datadir=/data/mysql/mysql8/data/3308 --plugin-dir=/data/mysql-8.0.21/lib/plugin --log-error=/data/mysql/mysql8/log/3308/error.log --open-files-limit=65535 --pid-file=/data/mysql/mysql8/run/3308/mysql.pid --socket=/data/mysql/mysql8/run/3308/mysql.sock --port=3308
root 49777 49737 0 15:58 pts/0 00:00:00 grep --color=auto -i mysqld
[root@mysql ~]#
[root@mysql ~]#
[root@mysql ~]# perf top -p 12694
觀察結(jié)果如下圖所示
從圖中可以看到,buf_calc_page_new_checksum 函數(shù)操作占用的資源最多。
那么buf_calc_page_new_checksum 這個(gè)函數(shù)到底是做什么的呢?
在mysql刷盤(pán)時(shí),會(huì)調(diào)用這個(gè)函數(shù),這個(gè)函數(shù)的作用是checksum,并寫(xiě)入頁(yè)中。,其調(diào)用順序如下所示
buf_flush_page-->buf_flush_write_block_low-->buf_flush_init_for_writing-->buf_calc_page_new_checksum
從上面可以看出,是Mysql數(shù)據(jù)庫(kù)在做刷臟頁(yè)操作,導(dǎo)致磁盤(pán)的IO寫(xiě)特別高,這也是為什么在general_log看不出什么特殊操作的原因。