磁盘
按照存储介质来来分类:
- 机械硬盘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类似在文件系统到驱动程序之间实现了通用块层,俩个作用:
- 向上为程序和文件系统提供统一的访问接口,向下屏蔽个文件系统程序之间的差异,提供统一框架管理各系统的驱动程序
- 实现IO的调度一般有:NONE、NOOP、CFQ、DeadLine
- NONE ,更确切来说,并不能算 I/O 调度算法。因为它完全不使用任何 I/O 调度器,对文件系统和应用程序的 I/O 其实不做任何处理,常用在虚拟机中(此时磁盘 I/O 调度完全由物理机负责)。
- NOOP ,是最简单的一种 I/O 调度算法。它实际上是一个先入先出的队列,只做一些最基本的请求合并,常用于 SSD 磁盘。、
- CFQ(Completely Fair Scheduler),也被称为完全公平调度器,是现在很多发行版的默认 I/O 调度器,它为每个进程维护了一个 I/O 调度队列,并按照时间片来均匀分布每个进程的 I/O 请求。类似于进程 CPU 调度,CFQ 还支持进程 I/O 的优先级调度,所以它适用于运行大量进程的系统,像是桌面环境、多媒体应用等。、
- DeadLine 调度算法,分别为读、写请求创建了不同的 I/O 队列,可以提高机械磁盘的吞吐量,并确保达到最终期限(deadline)的请求被优先处理。DeadLine 调度算法,多用在 I/O 压力比较重的场景,比如数据库等。
I/O栈
如图:
- 文件系统层:对上为程序提供统一访问接口,对下会通过通用块层,来存储和管理磁盘数据。
- 通用块层:包括块设备I/O队列和I/O调度器,负责I/O请求的排队、合并等调度工作
- 设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。
常用的查看工具
我们主要关注的几个指标
- 使用率:如果io的使用率过高,表示系统存在瓶颈。
- 饱和度:是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
- 请求数/S:是指每秒的 I/O 请求数。
- 吞吐:是指每秒的 I/O 请求大小。
- 响应时间:是指 I/O 请求从发出到收到响应的间隔时间。
iostat
1 | # -d -x表示显示所有磁盘I/O的指标 |
图内指标如下:
这些指标中,你要注意:
- %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 | # pidstat -d |