io tracing常用工具
内核的io系统错综复杂,跟踪io并不像用户态使用gdb那么简单,也没有一种万能的工具可以做到。针对不同的子系统,我们需要挑选不同的工具来跟踪io,以达到监控性能、诊断故障或者了解工作原理的目的。
一 性能监测
iostat
是最常用到的io性能监测工具,它可以实时报告读写速率、块大小、时延等重要信息。
pidstat/iotop
iostat监测的对象是块设备,而pidstat是进程级别的,可以实时监测指定进程的读写速率、时延等重要信息。类似的还有iotop,但后者的显示方式像top。
sar
如果遇到io问题,但没有使用iostat等工具及时采集并保存数据,如何获取过去的io信息呢?sar可以做到,它将过去一段时间的系统性能数据(包括io性能)保存在/var/log/sa/路径下的文件中,虽然颗粒度只有10min。
二 块层
blktrace/blkprase/btt
一个io请求进入块层,会发生remap/split/queued/getreq/merge/insert/sleep/plug/unplug/issued/complete等事件,这些事件组成了io请求的完成流程,而blktrace跟踪这些事件,在时间轴上记录每个io发生具体事件的时间戳、进程、块设备、事件名称等有用信息。blkprase/btt将blktrace记录的信息进行解析和整合,以对用户友好的方式格式化输出,可以帮助了解每个io请求在块层发生了什么。
biolatency/biosnoop
bcc是一个基于bpf 的强大linux性能监控分析工具集,包括io/net/memory。其中与io相关的工具有biolatency/biosnoop,xfsdist/ext4dist/nfsdist,xfsslower/ext4slower/nfsslower,vfscount/vfsstat,接下来的章节会讲到这些工具 。
biolatency跟踪io请求从进入块层到io请求结束,以直方图的形式打印块设备的时延分布信息。当加参数“-Q”,统计的是块层+设备的时延,开始点和结束点分别是blk_account_io_start
和blk_account_io_done
。当不加参数“-Q”,统计的是设备的时延,开始点和结束点分别blk_mq_start_request
和blk_account_io_done
。相比blktrace的精细,biolatency更好上手,能帮助用户快速定位io性能瓶颈在哪里,是设备本身导致的,还是块层处理慢导致的。
biosnoop精准跟踪到每个io请求,将每个io的进程、块设备、大小、耗时等有效信息打印出来。当加参数“-Q”,统计的是块层+设备的时延,开始点和结束点分别是blk_account_io_start
和blk_account_io_done
。当不加参数“-Q”,统计的是设备的时延,开始点和结束点分别
是blk_mq_start_request
和blk_account_io_done
。
perf
指令perf record-e block:* -ag
可以跟踪块层的io请求的事件,或者跟踪具体的事件,比如block_getrq
,使用perf report将函数调用关系图展开。
三 vfs
vfscount/vfsstat
属于bcc工具集。vfscount统计一段时间内以vfs_开头的系统调用函数的调用次数,对于搞清楚系统的io负荷分布情况非常有用。vfsstat和vfscount类似,统计read/write/fsync/open/create的调用次数。
四 文件系统
xfsdist/ext4dist/nfsdist
跟踪文件系统的read/write/open/fsync系统调用,并以直方图的形式打印时延分布信息。以xfs文件系统为例,对应的探测点为xfs_file_read_iter
/xfs_file_write_iter
/xfs_file_open
/xfs_file_fsync
。
xfsslower/ext4slower/nfsslower
打印io时延超过设定值(默认是10ms)的进程、块大小、文件名称等相关信息。以xfs文件系统为例,对应的探测点为xfs_file_read_iter
/xfs_file_write_iter
/xfs_file_open/xfs_file_fsync
。可以帮助用户定位哪个进程的io慢。
perf
以xfs文件系统为例,指令perf stat -e xfs:* -ag
统计发生在xfs层的事件数量,或者统计具体的事件,比如xfs_file_buffered_write
。
funcgraph
假如使用上述的工具,初步定位io慢的进程和系统调用,以xfs_file_buffered_write
为例,使用funcgraph -d 10 -p $pid xfs_file_buffered_write
更进一步精准定位。
五 用户态
strace
指令strace -tt -T
可以跟踪每个系统调用的耗时,行尾的<>内即是时长。
六 scsi
SCSI层提供了一个简单的日志记录系统,不需要任何额外的工具。它将跟踪SCSI命令的执行并将数据转储到 dmesg。
该接口在/proc/sys/dev/scsi/logging_level
中,可以使用命令scsi_logging_level
来启用和配置沿Linux SCSI堆栈的多个跟踪点的日志级。
SCSI日志记录可以深入了解SCSI协议层,对于跟踪提交给SCSI设备的I/O请求很有用,但它显然不能处理其他类型的设备。