我们学习了Linux磁盘IO的工作原理,了解了由文件系统层,通用块层,设备层构成的Linux系统IO栈
通用块层是整个Linux磁盘IO的核心,向上,为文件系统和应用程序,提供了统一的接口,向下,讲不同的磁盘设备,抽象为了统一块设备,并对文件系统和应用程序发来的IO,进行了重新排序和请求合并
那么我们如何衡量磁盘的IO性能
对于磁盘性能的衡量标准,我们有几个常见的指标,使用率,饱和度,IOPS,吞吐量,响应时间等
使用率,指的是磁盘处理IO的时间百分比,过高的使用率,意味着磁盘IO存在瓶颈
饱和度,是指的IO的繁忙程度,过高的饱和度,意味着磁盘存在严重的性能瓶颈,饱和度为100%的时候,磁盘无法接受新的IO
IOPS,是每秒的IO请求次数
吞吐量,每秒的IO大小
响应时间,IO请求发出到收到回复的耗时
不过使用率并没有考虑IO的大小,即使使用率为100%的时候,磁盘仍然可能接受新的IO请求
对于这些指标,仍然要结合的去理解
比如,在数据库,大量小文件这种随机读写较多的场景中,IOPS则是能反映系统的整体性能,多媒体等顺序读写较多的场景中,吞吐量才能反映系统的整体性能
所以,在选择磁盘的时候,要根据我们面对的实际场景,来选择合适的磁盘,性能是否可以满足应用程序的需求
所以我们如何观测对应的IO性能呢?
对于磁盘的使用情况,我们可以选择使用iostat进行观测
iostat提供了每个磁盘的使用率,IOPS,吞吐量等常见的性能指标,基本上都来自 /proc/diskstats
iostat的输出如下
iostat提供了非常多的性能指标,Device说明了对应的磁盘设备名称,其他不同的指标有
在其中 uitl是 IO使用率
r/s+w/s 是IOPS
rkB/s + wkB/s 即为吞吐量
r_await + w_await,就是响应时间
观测指标的时候,别忘了结合请求的大小来一起分析
这样,从iowait中,并不能直接得到磁盘饱和度,饱和度一般也没有其他的观测手段
如果想要知道对应的进程的响应,可以使用pidstat和iotop这两个工具
pidstat中加上-d 就可以查看进程的IO情况了
其中有着
用户ID 进程ID
每秒读取的数据大小 kB_rd/s 单位是KB
每秒发出的写请求 kB_wr/s 单位是KB
块IO延迟,等待同步块IO和换入块IO结束的时间
除了pidstat查看实时数据外,还可以利用iotop这个工具,进行进程的排序,利用其,可以找到IO比较大的进程
iotop的输出如下
$ iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 7.85 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 15055 be/3 root 0.00 B/s 7.85 K/s 0.00 % 0.00 % systemd-journald |
前几行的数据表示,进程的磁盘读写大小总数和磁盘真实的读写大小总数,因为缓存 缓冲区 IO合并等因素,可能并不相等
剩下的则是,进程相关的参数,包括线程ID,IO优先级,每秒的读磁盘大小,写磁盘大小,换入和等待IO的时钟百分比等
这就是我们分析磁盘IO性能时常用到的,可以先了解其功能和指标含义
总结一下,我们梳理了Linux磁盘I/O性能指标和性能工具,我们通常使用IOPS 吞吐量 使用率 饱和度等几个指标,来进行磁盘IO的性能评估
我们为了获取到这几个指标,可以使用pidstat iotop等观察进程的IO情况,不过在分析这些性能指标的时候,需要注意读写比例 IO类型和IO 大小,进行综合分析