利用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线程,再进行进一步的分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!