定位磁盘IO问题
*
1 磁盘write吞吐饱和的表现
磁盘write会先写page cache,page cache标记为Dirty(不可直接回收),然后由kswapd进程把page cache写入磁盘,page cache标记为Clean(可回收)。
如果write吞吐饱和,Dirty page的数量(大小)会较大,或持续上升。
# 物理机查看 for ((i=0; i<100; i++)); do echo $(date +%T) $(cat /proc/meminfo | grep Dirty); done # 容器查看 for ((i=0; i<100; i++)); do echo $(date +%T) $(cat /sys/fs/cgroup/memory/memory.stat | grep "^dirty"); done
磁盘通常是读优先,可以通过wbt配置,调整写的优先级。
# sdb 是相应的磁盘,可用通过df查看 cat /sys/block/sdb/queue/wbt_lat_usec 75000 echo 0 | sudo tee /sys/block/sdb/queue/wbt_lat_usec
下面两个参数,控制dirty page的写入
# dirty page 存在超过30S,会写入磁盘 vm.dirty_expire_centisecs = 3000 # dirty page的大小超过available内存的20%,开始写入磁盘 vm.dirty_ratio = 20
2 找到IO高的进程
- BCC的filetop查看机器的IO,可以找到高IO的线程(
ps -eLf | grep <tid>
查找进程),以及对应的文件; - iotop也可以完成类似的工作。
3 查看IO的延迟情况
- BCC的fileshower、ext4shower、xfsshower可以查看IO延迟低于某个阈值的操作;
- BCC的funclatency可用跟踪
vfs_read、vfs_write
查看IO延迟的分布。
4 查看IO设备的延迟情况
- BCC的biolatency可以查看设备的延迟情况;
- blktrace -d <device> 可以跟踪设备的操作。
5 定位IO延迟高的根因
IO延迟高通常有如下原因:
- 内存不足,pagecache的命中率低,可以使用BCC的cachestat查看;
- 磁盘IO到瓶颈了(可能由业务异常导致高IO),dirty page的大小可以用于判断写是否饱和;
- 硬件BUG,可能是固件的BUG,例如ssd硬盘的gc算法等;
- 软件BUG,软件非预期的行为,例如:用fadvise64清除了文件的缓存。
使用fio压测,看硬件的性能是否和标注的性能差异较大。
6 其它指标
- cpu的iowait衡量因为io处于idle的时间,但没有明确的阈值;
- iostat的IO数量、IO大小、IO排队,但也没有明确的阈值。