
故障分析 | linux 磁盘io利用率高,分析的正确姿势
一、背景简介
作为一个DBA难免不了会遇到性能问题,那么我们遇到性能问题该如何进行排查呢?例如我们在高并发的业务下,出现业务响应慢,处理时间长我们又该如何入手进行排查,本篇文章将分析io高的情况下如何分析及定位。
二、环境复现
• 环境配置:本次测试使用128C_512G_4TSSD服务器配置,MySQL版本为8.0.27
• 场景模拟:使用sysbench创建5个表,每个表2亿条数据,执行产生笛卡尔积查询的sql语句,产生io,可以模拟业务压力。首先使用sysbench进行数据压测
三、系统层面底层故障排查
使用sysbench进行模拟高并发
执行笛卡尔积sql语句
3.1 检查当前服务器状态
由上可知:目前一分钟负载为72.56,且呈上升趋势,并且存在io压力
3.2查看当前各个磁盘设备的io情况
由上可知:目前有多块物理磁盘,sda磁盘的io压力较大
3.3 检查sda磁盘当前的io读写情况
由上可知:目前sda磁盘的压力比较大,每秒写入比每秒读差距较大,证明目前有大量的io写入
3.4 检查sda磁盘中哪个应用程序占用的io比较高
由上可知:占用io高的应用程序是mysql,且pid为73739
3.5 分析应用程序中哪一个线程占用的io比较高
由上可知:74770这个线程占用的io比较高
3.6 分析这个线程在干什么?
由上可知:目前这个线程在写入多个文件,fd为文件句柄,文件句柄号有64、159
3.7 查看这个文件句柄是什么
由上可知:这个线程在大量的写入临时文件
四、分析MySQL应用程序
4.1 查看当前的会话列表
由上可知:目前这个sql已经执行了67s,且此sql使用了group by和order by,必然会产生io
4.2 通过线程号查询会话
由上可知:通过查询threads表可以进行验证,该线程在频繁创建临时表的原因就来源于此sql
4.3 查看该sql语句的执行计划,进行进一步认证
由上可知:该sql的执行计划用到了临时表及临时文件,符合
4.4 查看全局状态进一步进行确认
多执行几次,可以看出tmp_files和tmp_disk_tables的值在增长,证明在大量的创建临时文件及磁盘临时表,符合该线程的行为
五、故障处理
通过上述的一系列排查,我们已经分析出来,目前sda磁盘的io使用率最高,且mysqld程序占用的最多,通过排查有一个线程在频繁的创建临时表或临时文件且通过登录mysql排查会话及线程视图可以找到是由某一个慢sql导致的,查看此慢sql的执行计划也会创建临时表和临时文件符合我们之前排查的预期。此时我们就需要针对此慢sql进行优化,优化步骤由DBA进行处理,此处进行忽略。慢sql优化完成后可以进行io的继续观察,看io是否有下降
六、代码分析
我们可以使用pstack进行跟踪线程号,获取当前的线程堆栈信息。切记pstack会调用gdb进行debug调试
本文转载自公共号GreatSQL社区。
