我开始尝试做一些简单的性能测试。“这些磁盘中哪个更快,快多少”之类的事情。我不需要太精确,我只想要一个大概的想法。这变成了一次奇怪的尝试,深入探究事物内部的工作原理。实际上,这很有趣,但有点奇怪。
在进一步讨论之前,我要说的是,本文中的所有内容都是在运行 3.0 内核的 Arch Linux 系统上完成的,其中 Western Digital WD30EZRX 3TB SATA 磁盘驱动器从 MyBook Essential USB3 机箱中取出(这些机箱会对您的数据造成危害),并安装在 Sans Digital 单磁盘 USB3 机箱中,通过 Buffalo USB3 PCIe 1 通道卡连接。驱动器是该 USB 卡上的唯一设备,并且在测试期间系统处于空闲状态。
我编写了一个性能测试程序,这是一个简单的 C 程序,用于打开一个文件、向其中写入 4 GiB 数据、fsync() 并退出。我在空的全磁盘 ext4 文件系统上运行了 9 次测试(任意数字,因为我想要个位数,但忘记从零开始),每次运行耗时 58-59 秒,大约 73 MB/秒。虽然不是世界上最快的磁盘,但结果相当一致。
由于一些我不记得的原因,我以为不会有什么麻烦,几个小时后我回来做了完全相同的测试,拔下磁盘以测试另一个磁盘,重新插入原始磁盘,然后重新执行 mkfs。令我惊讶的是,我得到了非常不同的结果。这一次,我得到的结果在 51-52 秒(83 MB/秒)范围内,其中 2 更接近 48 秒。
几个小时后,在做了一些研究(包括在这里询问如何找出文件使用了哪些磁盘块)后,我在同一个磁盘上进行了另一次测试,没有重新初始化。我只是在与上一次测试相同的目录(文件系统的根目录)中创建了新文件。这一次,我得到的结果在 44-45 秒(96 MB/秒)左右。
后来,我又运行了三次测试(实际上是改进了我的测试程序),同样只是将文件放在现有文件旁边,并获得了 44 秒、45 秒和 50 秒的性能。这三组运行结果都恰好相邻。请记住,我仍然不是在谈论单个运行。我运行了测试程序 9 次,所有结果都是 44 秒,又运行了 9 次,所有结果都是 45 秒,又运行了 9 次,所有结果都是 50 秒。
这些是一些相当大的差异,并且分组非常奇怪。
我使用 debugfs 检查了文件正在使用哪些块,那里没有任何“奇怪”的事情发生。每个文件似乎都按顺序从磁盘开头开始获取下一个可用块。
我能想到的唯一可能解释这种情况的原因是,磁盘电路以某种方式从磁盘的不同部分分配块,并将它们作为连续块呈现给主机。对于我看到的结果,它必须注意到我的测试运行之间的延迟,并利用这个机会切换到磁盘的不同部分进行分配。
坦率地说,这对我来说听起来有点牵强,但我没有太多其他的想法。
有人能解释一下吗?为什么我会得到这种局部一致但全局可变的结果?
答案1
这是 Caviar Green 硬盘。我听说由于绿色电路,这些硬盘的性能有些不稳定。它们具有可变的 RPM 速度以节省电力,这绝对会影响传输速率。您看到的情况够了吗?我说不准,因为我没有亲自处理过它们。如果您追求的是一致的性能,我会选择它们的蓝色或黑色系列。
答案2
几个月后,我觉得这个尚未解决的问题值得继续追问。
遇到这个障碍后不久,由于有其他优先事项,我不得不暂时搁置该项目。最近,我终于可以重新开始这个项目了。
最令人沮丧的是(现在也是)我现在完全无法重现这个问题。我仍然拥有完全相同的硬件和相同的机器。但是,所有性能都相当一致,并且和我预期的一样快。为简单起见,我最初的问题没有包括我尝试过的所有不同设置(和硬件)。
具体来说,有一台机器出现了这个问题,我在测试这个问题的过程中把它关掉了。几个月后,它仍然处于关闭状态。我把它重新打开,继续尝试描述不一致的性能,结果发现问题已经消失了。
月相?年数?太阳黑子?我都不知道。我重新启动了那台机器,用两个不同的 USB 接口卡和两个不同的磁盘运行了无数次测试。结果都没有什么异常。我怀疑自己的理智,但我还有原始测试的剪切粘贴日志以及带时间戳的测试输出文件。毫无疑问,它们在那台机器上,在那张磁盘上,结果很奇怪。奇怪的结果,我现在无法重现,尽管尝试了几个小时。
我宣布这不值得我再浪费时间,并且我宣布该问题结束。
我向那些在我之后希望得到明确答案的人表示歉意。
答案3
对于具有恒定 RPM 的磁盘(几乎所有磁盘都是如此,因为改变转速会使寻道时间变得非常缓慢),这种情况非常典型。当磁头靠近驱动器中心时,线性速度较低,而当磁头靠近驱动器边缘时,线性速度较高。大多数驱动器将外轨道映射到更高的线性扇区编号,大多数文件系统都按照线性扇区向上工作。因此,随着您继续使用文件系统,它往往会变得更快。