背景及概念
1.Block I/O stack
读写请求经过文件系统转换为IO请求,进入block层。IO在block层可能会被转发,拆分,合并,排序等一系列处理,最终提交给物理驱动层。
2.I/O elevator & schedulers
电梯算法负责将IO合并及排序,目的是为了适配rotation disk的IO特性以提高其性能。后续又加入了各种调度器,用于平衡IO吞吐量和IO延时,并提供了针对进程的IO优先级设置,以及均衡策略。
3.Disk I/O performance
系统统计的IO延时主要可分为两部分,Wait Time表示IO在block层调度队列等待处理的时间,Service Time表示驱动层及磁盘处理IO请求的时间。分析IO性能时可优先确认这两者比例,以定位性瓶颈的范围,blktrace+btt工具可方便测得该数据。
4.IOwait
一个比较点迷的参数,表示CPU idle时并且有进程在等待IO的时间,CPU压力也会严重影响IOwait。可参考IOwait 到底在wait什么
分析方法及策略
1.USE 分析
利用率:设备在处理IO的时间百分比
checklist:
iostat -xz 1,sar -d 1 //%util
/proc/PID/sched //se.statistics.iowait_sum
饱和度:IO在队列里等待时间
checklist:
iostat -xz 1,sar -d 1 //avgqu-sz > 1 , wait 过高
biolatency //bpf tool, io延时分布
fileslower //bpf tool, vfs_read vfs_write 延时统计
2.负载/性能描述
checklist:
iostat -xz 1,sar -d 1 //iops , bandwidth , io size ,await ,read/write 比例
bitesize //bpf tool, 各进程 io size 分布
seeksize //bpf tool, 提交io 的随机程度
biopattern //bpf tool, 完成io 的随机程度
biostacks //bpf tool, io调用栈及延时
3.延时分析
利用blktrace、内核跟踪等手段,对IO延时进行drill-down分析, 定位延时主因,调度器,controller,驱动,磁盘等等。
4.是否存在IO放大
应用请求的数据,与磁盘实际IO的差异,可利用动态跟踪工具同时统计应用进程在fs层与block层的IO带宽,对比差异。
监测工具
1.传统工具
iostat ,iotop, blktrace
2.BPF 工具
biolatency
统计IO延时的分布,(BCC 支持-Q -D ,单独统计IOqueue 和disk 延时)
biosnoop
列出运行期间每次IO的对应进程及延时,(BCC 支持-Q -D ,单独统计IOqueue 和disk 延时)
bitsize
统计各进程提交IO的size分布
seeksize
统计各进程提交IO需要seek的size分布,可反映各进程IO请求的随机程度
biopattern
统计磁盘实际IO随机/连续程度,与seeksize区别是biopattern统计IO完成时的数据,加入调度器电梯算法排序的效果。
biostack
统计每种IO调用stack 的延时分布,可用于定位哪种IO操作延时最大。
bioerr
列出运行期间发生的IO错误
mdflush
列出software RAID flush调用
iosched
统计IO请求在调度器queue内的延时分布
scsilatency
统计scsi 各cmd的执行延时
scsiresult
统计scsi 个cmd的执行结果
nvmelatency
统计nvme 设备各CMD的执行延时
调整方法
1. IO优先级(bfq/cfq)
只有在调度器选择bfq或者cfq时配置进程的IO优先级才有效,配置方法有两种
- ionice 命令
- cgroup io.weight , cgroup中的进程可使用io.weight参数配置IO优先级,ionice命令对cgroup内的进程不生效。
2.调度器选择及参数调整
3.block 设备参数
queue_len,block_size , readahead ....
4.Cgroup资源限制