Linux 磁盘 I/O 工作分三层: 设备层、通用块层 和 文件系统层
一、设备层
也就是 磁盘。磁盘可以分为两类:机械磁盘和固态磁盘。
1. 机械磁盘:缩写为 HDD。
I/O 请求连续,就不需要磁道寻址,可以获得最佳性能。
随机 I/O,需要不停地移动磁头,读写速度就会比较慢。
最小读写单位是扇区,一般大小为 512 字节。
2. 固态磁盘:缩写为 SSD。
由固态电子元器件组成。不需要磁道寻址,所以,不管是连续 I/O,还是随机 I/O 的性能,都比机械磁盘要好得多。
最小读写单位是页,通常大小是 4KB、8KB 等。
3. 磁盘架构:把磁盘接入后,按照不同的使用方式,又可以分为多种架构。
(1) 独立磁盘 /dev/sda
(2) 分成两个分区:/dev/sda1 和 /dev/sda2
(3) 多块磁盘组合成一个逻辑磁盘,也就是 RAID。
根据容量、性能和可靠性需求的不同,RAID 一般可以划分为多个级别,如 RAID0、RAID1、RAID5、RAID10 等。
RAID0 有最优的读写性能,但不提供数据冗余的功能。
4. Linux 中,磁盘实际上是作为一个块设备来管理的。也就是以块为单位读写数据,并且支持随机读写。
二、通用块层
在文件系统和磁盘驱动中间的一个块设备抽象层 (减小不同块设备的差异带来的影响)。主要有两个功能:
1. 向上,为文件系统和应用程序,提供访问块设备的标准接口;
向下,把各种异构的磁盘设备抽象为统一的块设备
2. 给文件系统和应用程序发来的 I/O 请求排队,并通过排序、合并等方式,提高效率。
三、文件系统层
包括虚拟文件系统和其他各种文件系统的具体实现。
它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
四、磁盘性能指标
1. 使用率:处理 I/O 的时间百分比。过高的使用率,意味着磁盘 I/O 存在性能瓶颈。
2. 饱和度:处理 I/O 的繁忙程度。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
3. IOPS:每秒的 I/O 请求数。
4. 吞吐量:每秒的 I/O 请求大小。
5. 响应时间: I/O 请求从发出到收到响应的间隔时间。
五、磁盘 I/O 观测
iostat 是最常用的磁盘 I/O 性能观测工具,它提供了每个磁盘的使用率(%util)、IOPS(r/s+w/s)、吞吐量(rkB/s+wkB/s),响应时间(r_await+w_await)等各种常见的性能指标。
六、进程 I/O 观测
观察进程的 I/O 情况,你还可以使用 pidstat 和 iotop 这两个工具。
1. pidstat
每秒读取的数据大小(kB_rd/s) ,单位是 KB
每秒发出的写请求数据大小(kB_wr/s) ,单位是 KB
2. iotop
前两行分别表示,进程的磁盘读写大小总数 和 磁盘真实的读写大小总数。
因为缓存、缓冲区、I/O 合并等因素的影响,它们可能并不相等。