系统优化-IO-运行原理和重要的指标

磁盘

按照存储介质来来分类:

  • 机械硬盘HDD:包含磁头和磁片,读取数据通过改变磁头和磁道来进行数据的读取,随机IO因为寻址和改变磁道性能很差,在IO压力比较大的场景要尽量避免随机IO。
  • 固态硬盘SSD:由电子元件组成,不需要磁道读取,所以随机IO和顺序IO性能都要比机械硬盘好得多。

    但是,固态硬盘的随机IO因为也遵循擦除、写入所以随机IO会引起大量的垃圾回收,并且无法用到预读性能也不高。、

    此外,机械磁盘和固态磁盘还分别有一个最小的读写单位。机械磁盘的最小读写单位是扇区,一般大小为 512 字节。而固态磁盘的最小读写单位是页,通常大小是 4KB、8KB 等。

    按照接口来分类:比如可以把硬盘分为 IDE(Integrated Drive Electronics)、SCSI(Small Computer System Interface) 、SAS(Serial Attached SCSI) 、SATA(Serial ATA) 、FC(Fibre Channel) 等。

    IDE:后缀一般为hd
    SCSI或者SATA:后缀一般为sd

    根据设备编号后面一般跟小写字母a、b、c,我们在设备上还可以分区用0~9数字表示比如:/dev/sda1

通用块层

和VFS类似在文件系统到驱动程序之间实现了通用块层,俩个作用:

  1. 向上为程序和文件系统提供统一的访问接口,向下屏蔽个文件系统程序之间的差异,提供统一框架管理各系统的驱动程序
  2. 实现IO的调度一般有:NONE、NOOP、CFQ、DeadLine
    1. NONE ,更确切来说,并不能算 I/O 调度算法。因为它完全不使用任何 I/O 调度器,对文件系统和应用程序的 I/O 其实不做任何处理,常用在虚拟机中(此时磁盘 I/O 调度完全由物理机负责)。
    2. NOOP ,是最简单的一种 I/O 调度算法。它实际上是一个先入先出的队列,只做一些最基本的请求合并,常用于 SSD 磁盘。、
    3. CFQ(Completely Fair Scheduler),也被称为完全公平调度器,是现在很多发行版的默认 I/O 调度器,它为每个进程维护了一个 I/O 调度队列,并按照时间片来均匀分布每个进程的 I/O 请求。类似于进程 CPU 调度,CFQ 还支持进程 I/O 的优先级调度,所以它适用于运行大量进程的系统,像是桌面环境、多媒体应用等。、
    4. DeadLine 调度算法,分别为读、写请求创建了不同的 I/O 队列,可以提高机械磁盘的吞吐量,并确保达到最终期限(deadline)的请求被优先处理。DeadLine 调度算法,多用在 I/O 压力比较重的场景,比如数据库等。

I/O栈

如图:

avator

  • 文件系统层:对上为程序提供统一访问接口,对下会通过通用块层,来存储和管理磁盘数据。
  • 通用块层:包括块设备I/O队列和I/O调度器,负责I/O请求的排队、合并等调度工作
  • 设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。

常用的查看工具

我们主要关注的几个指标

  • 使用率:如果io的使用率过高,表示系统存在瓶颈。
  • 饱和度:是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
  • 请求数/S:是指每秒的 I/O 请求数。
  • 吞吐:是指每秒的 I/O 请求大小。
  • 响应时间:是指 I/O 请求从发出到收到响应的间隔时间。

iostat

1
2
3
4
5
# -d -x表示显示所有磁盘I/O的指标
$ iostat -d -x 1
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 0.04 0.56 1.74 29.28 50.93 69.51 0.00 1.28 0.21 1.63 0.04 0.01
sda 0.00 0.67 0.03 1.74 0.25 28.85 32.91 0.00 0.04 0.13 0.04 0.02 0.00

图内指标如下:

avator

这些指标中,你要注意:

  • %util ,就是我们前面提到的磁盘 I/O 使用率;
  • r/s+ w/s ,就是 IOPS;
  • rkB/s+wkB/s ,就是吞吐量;
  • r_await+w_await ,就是响应时间。

    在观测指标时,也别忘了结合请求的大小( rareq-sz 和 wareq-sz)一起分析。你可能注意到,从 iostat 并不能直接得到磁盘饱和度。事实上,饱和度通常也没有其他简单的观测方法,不过,你可以把观测到的,平均请求队列长度或者读写请求完成的等待时间,跟基准测试的结果(比如通过 fio)进行对比,综合评估磁盘的饱和情况。

iotop

类似于top可以查看整体的io情况

pidstat

如果想查看进程的io情况我们要用pidstat加参数-d

1
2
3
4
5
6
# pidstat -d
03:02:23 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:02:23 PM 0 1 145.77 25.49 0.72 systemd
03:02:23 PM 0 30 0.00 0.00 0.00 kswapd0

# kB_ccwr/s 是每秒取消的写请求