利用iotop和strace定位MySQL IO繁忙的线程
1、安装iotop、sysbench(模拟高并发)
安装步骤省略
2、使用sysbench模拟并发写入
sysbench --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=xxxxxx --mysql-socket=/dbdata/3306/mysql.sock --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=100000 --report-interval=10 --threads=10 --time=120 /usr/local/sysbench/share/sysbench/oltp_insert.lua prepare
3、使用iotop -o 观察io情况
4、通过OS thread定位到具体的SQL线程,例如34749
select THREAD_OS_ID,name,type,PROCESSLIST_INFO,PROCESSLIST_STATE from performance_schema.threads where THREAD_OS_ID='34749';
4、使用strace命令定位MySQL到底做了什么IO操作
strace -o /tmp/strace_output.txt -T -tt -f -e trace=read,open,write,fdatasync -p 'mysql_pid'
5、查看写入出现次数最多的文件描述符
grep 'write(' /tmp/strace_output.txt |awk '{print $3}'|sort|uniq -c
6、通过文件描述符定位到文件,可以发现大量IO产生在binlog上,进一步可以推断出IO发生在写binlog的线程上
7、查看产生同步磁盘操作最多的文件描述符
结论:
当MySQL服务器出现IO繁忙的时候,使用iotop先查出是那些线程在进行IO操作,然后利用strace跟踪一下具体的IO对象。如果是MySQL服务导致的IO繁忙,可以利用performance_schema.threads查找出具体的SQL线程,再进行进一步的分析。