Linux

文件系统和磁盘IO性能问题定位分析思路

一 背景说明

在日常工作中,我们遇到磁盘或者是文件系统IO性能问题时,终归是需要有一套定位排查问题的方法路和思路的。我这里,根据学习倪朋飞的Linux性能优化专栏的收获和我自己工作经验总结。这里先写一个大概的思路,供自己在工作中参考和使用。

二问题定位思路

1 判断系统是否出现IO性能问题

  • 可以通过top查看是否有iowait,当然同时要关注CPU的磁盘指标(按下数字1),也要看系统负载和是否有消耗资源较严重的进程;
  • iostat -dzx 1;持续观察一段命令的输出结果,看看磁盘的IOPS指标(r/s+w/s),throughput指标(rkB/s+wkB/s),延迟await,利用率%util是否异常;其中的命令行选项,-d表示查看磁盘性能指标,-x表示显示扩展的性能指标,-z表示和-d配合使用查看磁盘指标时,过滤掉没有IO操作的磁盘设备,即不显示没有IO活动的磁盘; 1表示每隔1秒输出一次结果;
  • sar -d 1;该命令跟上述的iostat差不多,用于定位磁盘IO性能问题;

此时,如果系统的IO性能不够好,或者观察到有磁盘IO开销比较异常的话,接下来要定位消耗磁盘IO的进程;当然,如果有明显的进程在消耗磁盘IO的话,在top命令下,应该也可以观察到有进程消耗CPU或者内存比较明显,那么这时候看到的进程pid就需要留意;

2 跟踪消耗磁盘IO的进程

pidstat -d -l 1;没间隔1秒输出一次磁盘IO消耗信息;-d表示查看磁盘IO指标,-l表示查看进程执行的命令,可以结合上述top中看到的进程pid和执行的命令;这里的输出中也有pid;

看到有明显的进程消耗IO时,我们可以继续使用pidstat -d -l -p the_pid 1;来单独跟踪特定进程的磁盘IO消耗指标;

到此,基本上找到了消耗磁盘IO对应的进程,可以结合应用来继续分析定位问题。比如:

  • 如果是数据库的进程,从数据库层面去看进程执行的是什么业务操作,执行的SQL语句是啥,看执行计划,表结构,数据量分布,索引情况等。
  • 如果是Redis的进程,继续分析观察到的磁盘IO开销,是否和应用特征相匹配,比如查询Redis缓存,不应该看到磁盘大量的写操作等这种场景;再继续查看Redis的持久化存储配置方式,用的是RDB (Redis Database)方式,还是AOF (Append Only File)。
  • 如果是其它应用的进程,结合业务情况再分析;

3 跟踪进程的内核调用和系统调用

strace -fp the_pid;跟踪进程的内核调用和打开文件的情况,这里继续从操作系统层面去跟进进程的读写文件情况。进一步佐证进程消耗系统IO资源的情况。-f表示同时跟踪查看进程的线程IO信息;

lsof -p the_pid;查看进程打开文件描述符(FD);判断进程是不是在持续的读写哪些文件;

有时上述操作不奏效,看不到进程读写的文件信息,可以尝试使用opensnoop查看进程的系统调用open()情况,在一些进程通过rotate的方式写日志的情形下,上面的两板斧可能不好使,就用这个也看看。

三 注意事项

经过上面的分析定位思路,找到问题进程之后,去着手解决问题。但是,有几个地方也要注意:

1 系统的缓存抖动

系统缓存抖动,可能导致一个数据库的查询应用时快时慢。有时,这种情况几乎是难以解释的,那么此时,我们看看系统的缓存是不是出现抖动,抖动的情况是不是吻合查询应用的时快时慢。vmstat -SM 1;监测memory列下的cache和io列的bi;

2 文件系统的缓存指标

包括系统页缓存、索引节点缓存、目录项缓存。

系统页缓存:free -m;或者 cat /proc/meminfo;

索引节点缓存,目录项缓存:cat /proc/slabinfo;或者slabtop;按下a或者c分别以活动对象、缓存大小排序。具体可以man slabtop;

四 相关阅读

1 Redis持久化配置不当带来的性能问题分析

2 从操作系统层面去分析慢SQL的一种思路

3 一则利用bcc工具包的filetop和opensnoop工具跟踪IO的案例

4 短时进程–消耗CPU的元凶

5 一则进程写日志导致磁盘IO高的案例分析

6 Linux文件系统和磁盘I/O性能小结

留言