我正在查看网络托管 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 可能是关键 - 为什么向前查找队列中任何时候都会有多个请求?