我正在尝试估算在 32 位 CentOS 6.2 上运行的应用程序的 IOPS 要求。我开始在装有 SATA 磁盘的机器上进行一些测量,但对 sar 测量的 IOPS 和 tps 之间的差异感到困惑。
根据维基百科SATA 磁盘应执行 75-100 IOPS。ioping 实用程序对于随机存取测试似乎证实了这一点:
# ./ioping -R /dev/sda
--- /dev/sda (device 931.0 Gb) ioping statistics ---
279 requests completed in 3.0 s, 92 iops, 371.3 kb/s
min/avg/max/mdev = 2.7 ms / 10.8 ms / 130.8 ms / 7.9 ms
但是 sar 产生的 tps 值要高得多 (/dev/sda):
# iostat 1
avg-cpu: %user %nice %system %iowait %steal %idle
0.17 0.00 2.02 14.86 0.00 82.96
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 559.00 0.00 142600.00 0 142600
dm-0 18433.00 0.00 147464.00 0 147464
dm-1 0.00 0.00 0.00 0 0
dm-2 0.00 0.00 0.00 0 0
它并不介意此加载是顺序加载(dd 具有各种块大小)还是随机访问(ioping),值仍然相同。我认为 tps 实际上是 IOPS,并且我预计它会随着传输的块数增加而下降。
那么 tps 值到底是什么意思?它和 IOPS 有什么关系?
答案1
事务是写入 RAW 磁盘(在您的示例中为 dm-0)的单个 IO 命令(获取块/写入块)。Linux 内核会尝试将这些命令排序为更好的顺序,或尝试将它们压缩为更高效的命令(例如:一次获取两个块,而不是获取一个块并在获取一个块之后立即获取另一个块)。这些是发送到磁盘控制器(sda 的 tps)的事务。
好的控制器可能有自己的逻辑,可以进一步减少实际交易数量。
事务可能是 SCSI 命令“从扇区 22 开始将 2 GB 写入 crontoller 1 target 2 lun 3”。如您所见,这不能与吞吐量数字直接关联。
您追求的是持续的写入率。这里有几个限制因素:
- 客户端连接:如果网络是千兆的,输入永远不会超过 100 MB/s
- 磁盘控制器:如果这是一个 3 Gb 控制器,则吞吐量永远不会超过 300 MB/s
- 磁盘:查找制造商的持续写入性能值
- 文件系统:由于操作系统需要处理数据,因此会产生一些开销 - 在 RAM 磁盘中测试...
我对您的系统的猜测是:获得一个能够执行 raid 10 或 5 的良好硬件 raid 控制器并获得至少 6 个快速(15k)磁盘。
对于专业用途,请使用 SAS 而不是 SATA。
答案2
还请注意,TPS
值代表读取和写入,您可以使用-x
开关来扩展视图,其中读取和写入是分开的(r/s = 读取 IOPS,w/s = 写入 IOPS):
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
vda 0.07 24.65 0.30 18.95 30.65 330.22 18.74 0.07 3.61 0.98 1.89
答案3
iostat/sysstat 是一个非常强大的工具。通常最好查阅相关的手册页,以免您最终等待 6 年零 10 个月才得到真正正确的答案。您的问题的答案取自手册页:
iostat 命令生成的第一个报告提供了自系统启动以来的统计信息。每个后续报告都涵盖了自上一个报告以来的时间。
如果您运行类似 的程序iostat 1 2
,第二个报告块将包含一秒钟的 IO 统计数据,而第一个报告块将包含一组累积的先前数据。在 cron 中运行 sar 通常会有所帮助,这样您就可以以轻量级但一致的方式收集有意义的统计数据。
在您的示例中,您看到的是累积的先前统计数据,而不是某些压力测试期间捕获的 IOPS。