我正在对我编写的数据处理程序进行性能分析,我想了解我所用机器的理论吞吐量。具体来说,我想测量我的 g4dn EC2 实例为我的应用程序提供的磁盘读取速度。这个特定实例有一个临时 NVMe 驱动器,这就是我想要进行基准测试的。
我注意到,它需要运行多次,hdparm
直到报告的吞吐量停止增加。我的问题是,为什么hdparm
需要多次运行才能获得完整的读取吞吐量?Linux 内核/磁盘驱动程序/驱动器控制器/实际硬件中需要多次运行才能获得准确结果的是什么hdparm
?
我知道手册页上说要运行几次,但根据我的经验,要达到吞吐量最大值,需要的次数远远超过建议的 3 次。
-t Perform timings of device reads for benchmark and
comparison purposes. For meaningful results, this
operation should be repeated 2-3 times on an otherwise
inactive system (no other active processes) with at least
a couple of megabytes of free memory. This displays the
speed of reading through the buffer cache to the disk
without any prior caching of data. This measurement is an
indication of how fast the drive can sustain sequential
data reads under Linux, without any filesystem overhead.
To ensure accurate measurements, the buffer cache is
flushed during the processing of -t using the BLKFLSBUF
ioctl.
我运行以下命令来收集读取速度:
#!/usr/bin/env bash
while true; do
sudo hdparm -t /dev/nvme0n1p1;
sleep 1;
done
并得到以下输出:
$ while true; do sudo hdparm -t /dev/nvme0n1p1; sleep 1; done
/dev/nvme0n1p1:
Timing buffered disk reads: 470 MB in 3.09 seconds = 152.30 MB/sec
/dev/nvme0n1p1:
Timing buffered disk reads: 490 MB in 3.10 seconds = 158.21 MB/sec
/dev/nvme0n1p1:
Timing buffered disk reads: 526 MB in 3.02 seconds = 174.43 MB/sec
可能需要运行 20 次才能稳定在 330MB/秒左右。
请注意,我正在使用具有正确 NVMe 驱动程序的 AMI。
答案1
事实证明,某些 EC2 实例上默认可用的本地 nvme 驱动器尚未准备好使用,而“准备使用”的 nvme 设备实际上是作为 nvme 驱动器安装的 EBS 卷。这解释了吞吐量低(300MB/s)和预热时间慢(20 次运行)。
供将来参考,hdparm
当我格式化并安装我的真实的nvme 驱动器。它们将从 可见lsblk
。