我们学习了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 大小,进行综合分析

发表评论

邮箱地址不会被公开。 必填项已用*标注