尝试了解 iostat 的简单顺序读取情况

尝试了解 iostat 的简单顺序读取情况

我正在查看网络托管 VPS(虚拟服务器)的磁盘 I/O 性能,我希望帮助您理解“iostat”给我的数据。

这是我使用“dd”对单个虚拟磁盘进行的非常简单的顺序读取:

# dd if=/dev/sda1 of=/dev/null bs=16k count=102400
6400+0 records in
6400+0 records out
104857600 bytes (105 MB) copied, 7.91767 s, 13.2 MB/s

(在我看来,13.2MB/s 并不算太热。)

该测试是在系统非常安静的情况下进行的,但是当我运行 dd 时仍然会有正常的“静态”负载。

我在测试期间运行了“iostat -ktxz 5”;这是命令的输出,其中 5 秒样本完全在“dd”运行的时间内:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda           12030.60     8.00  103.40    1.40 12135.20    36.00   232.27     2.60   23.77   9.54  99.96

这是我自己研究出来的:

  • 磁盘基本上 100% 忙于为磁盘的顺序读取提供服务;

  • rkB/s 非常接近 dd 报告的 13.2MB/s;

  • rkB/s 除以 r/s 为 117kB,与 avgrq-sz 数字相同(以扇区为单位);我敢说 iostat 只是做同样的计算。

  • “blockdev --getra /dev/sda”告诉我该设备有一组 256 个扇区的预读集;这非常接近 117kB 的平均请求大小。

所以我假设:

  • dd 以 16KB 为单位读取;

  • 但 Linux 会立即进行 128KB 的预读。

但我不明白的事情包括:

  • 1000 毫秒除以 23.77 毫秒的等待时间,得出每秒 42 个请求的数字;但 r/s 是 103.40?

  • 为什么 avgqu-sz 不是 1?我的 dd 是一个单线程进程,内核一次只会调用一个预读?

  • 另一方面,avgqu-sz * 1000ms / 23.77ms 给我 109 r/s,非常接近报告的 r/s。

  • 这些合并的请求是什么? rrqm/s 是 12,030?!?!我无法理解 dd 进行的 128kB 预读块或 16kB 用户级读取中的这一点。

我想有一些关于现代磁盘和 Linux 的基本知识我完全不知道。 :( avgqu-sz 可能是关键 - 为什么向前查找队列中任何时候都会有多个请求?

相关内容