IO 性能、顺序访问和随机访问

在硬盘上能够看到两个指标,响应时间(Response Time)和数据传输速率(Date Transfer Rate)。

首先看传输速率:我们现在常用的硬盘有两种。一种是 HDD 硬盘,也就是我们常说的机械硬盘。另一种是 SSD 硬盘,一般也被叫作固态硬盘。现在的 HDD 硬盘,用的是 SATA 3.0 的接口。而 SSD 硬盘呢,通常会用两种接口,一部分用的也是 SATA 3.0 的接口;另一部分呢,用的是 PCI Express 的接口。

现在我们常用的 SATA 3.0 的接口,带宽是 6Gb/s。这里的“b”是比特。这个带宽相当于每秒可以传输 768MB 的数据。而我们日常用的 HDD 硬盘的数据传输率,差不多在 200MB/s 左右。

SATA 接口的硬盘,因为 SATA 接口的限制,读写速度受限制,实际 SSD 硬盘能够更快,所以我们可以换用 PCI Express 的接口。

响应时间:程序发起一个硬盘的写入请求,直到这个请求返回的时间。

57443821861f73e4d04ab4d64e6908a4.webp
上图中 4K 指标代表的是计算机上的程序去随机读取磁盘上的某一个 4K 大小的数据,一秒之内可以读到多少数据。在这个指标上,接口类型已经不是影响访问速度的因素了,在随机读写的时候,数据传输率也只能到 40MB/s 左右,是顺序读写情况下的几十分之一。

我们拿这个 40MB/s 和一次读取 4KB 的数据算一下。

I/O 性能 - 图2

也就是说,一秒之内该硬盘可以随机读取一万次 4KB 的数据,写入的话,大概是两万次左右。这个每秒读写的速度称为 IOPS 即每秒输入输出操作的次数。

4K-Thrd:随机64队列深度测试,软件则会生成64个16MB大小的测试文件(共计1GB),然后同时以4KB的单位尺寸,同时在这64个文件中进行写入和读取测试,最后依然以平均成绩为结果。

IO_WAIT

我们看到,即使是用上了 PCI Express 接口的 SSD 硬盘,IOPS 也就是在 2 万左右。而我们的 CPU 的主频通常在 2GHz 以上,也就是每秒可以做 20 亿次操作。

即使 CPU 向硬盘发起一条读写指令,需要很多个时钟周期,一秒钟 CPU 能够执行的指令数,和我们硬盘能够进行的操作数,也有好几个数量级的差异。这也是为什么,我们在应用开发的时候往往会说“性能瓶颈在 I/O 上”。因为很多时候,CPU 指令发出去之后,不得不去“等”我们的 I/O 操作完成,才能进行下一步的操作。

IO_WAIT 也就是 CPU 等待 IO 完成操作花费的时间占 CPU 的百分比。

  1. root@Wangying:~# iostat
  2. Linux 5.10.102.1-microsoft-standard-WSL2 (Wangying) 04/26/22 _x86_64_ (8 CPU)
  3. avg-cpu: %user %nice %system %iowait %steal %idle
  4. 0.15 0.07 0.14 0.01 0.00 99.63
  5. .
  6. Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
  7. sda 27.29 0.74 13819.60 0.00 225 4194800 0
  8. sdb 2.35 152.09 0.00 0.00 46165 0 0
  9. sdc 19.91 836.72 74.59 24.21 253977 22640 7348