![快速回答](https://linux22.com/image/1510685/%E5%BF%AB%E9%80%9F%E5%9B%9E%E7%AD%94.png)
概括
- 从传统(旋转盘片)硬盘
- 读取一个大文件,获得良好的性能
- 同时读取另一个大文件,得到全部的吞吐量除以 5 到 10。性能下降相当大!
此外,可以用手听到和感觉到磁盘头每秒机械地来回移动几次。几个小时后,温度也升高了。
如果这种情况很少发生或持续时间很短,那就没问题。如果这种情况经常发生或持续时间很长,不仅性能不佳,而且还会缩短使用寿命。
例子
- 磁盘:2TB 西部数据磁盘。
- 读取一个大文件时的吞吐量可以达到50-100MB/s。
- 大文件的影响最为严重:视频文件(例如 1GB 到 13GB 大小)。读取原始照片(~25MB)文件时也会发生这种情况。
- 一旦另一个程序同时读取另一个文件,全部的吞吐量下降到5-10MB/s。
附加信息
这不是文件碎片的问题。如果文件碎片化,即使只读取一个文件,吞吐量也会很慢(比标称的 50-100MB/s 慢得多)。
问题
可以做些什么来获得全部的同时读取几个大文件时吞吐量是否合理地高?
答案1
快速回答
- (1)找出正确的块设备(例如
mount
)。 - (2)获取root权限。
- (3)调整
read_ahead_kb
设备。
在我的情况下,发出此命令:
echo 100000 > /sys/block/sdb/queue/read_ahead_kb
在几秒钟内就恢复了性能和机械缓解。
这个参数变化具体意味着什么呢?
TL;DR:它使内核一次性读取大文件,这意味着只需要一次来回的机械运动而不是多次,从而解决了问题。
更准确地说,这个参数告诉内核,当它打开一个文件时,您允许它预先读取大量数据(在本例中,从默认的 128kB 最多读取 100MB),甚至在知道请求读取的进程是否真的需要那么多数据之前。因此,举个例子,一个进程打开一个 30MB 的文件(典型的原始照片),而另一个进程已经尽可能多地读取了其他文件,那么内核知道您允许它一次读取所有文件,而不是保证机械头来回移动至少 (30000/128)=234 次,只需进行一次来回机械运动。
缺点是,如果您只需要文件的一部分(例如,30MB 文件中的 100kB 缩略图),内核可能会(或可能决定不)读取太多数据。此外,正在读取的数据将占用一些 RAM 页面,这会增加内存压力。Linux 是为通用目的而设计的,包括具有大量并行活动和内存压力的服务器,它当然有许多启发式方法来猜测要做什么。真相就在内核源代码中。
为什么是这个值?
默认值为 128。我观察到首先将其增加到其他值(例如 4096)会产生一些效果,然后在增加到 100000 时就满足了,但我猜测 (1) 大部分效果是在初始增加时获得的,(2) 大多数不良影响(如果有的话,取决于情况,例如内存压力)与该值成正比,并且 (3) 可能存在某个值,超过该值实际上不会改变任何东西。
但是关于你的情况?
细节
官方文档https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-bdi非常简短:“此块设备上的文件系统预读的最大千字节数。”
RedHat 文档6.4.3.诺普解释得更详细一些,并提示何时增加可能是好主意,何时可能不是好主意(提示:内存压力)。因此,看起来这个参数是由 Noop IO 调度程序使用的。
存储 – Linux – 真实世界的硬件 RAID 控制器调整(scsi 和 cciss) - 代码日志有关于案例(流媒体视频、数据库访问)以及如何做出有根据的猜测的提示。此外,不仅可以通过
/sys
树设置参数,还可以使用blockdev
命令设置参数。
或者你也可以使用来源,卢克:
答案2
剧透:帖子底部会有“是”的答案
简短回答:
不。
中等大小的答案:
没有为什么
有两个进程同时想要访问一个资源(硬盘)。每个进程将读取不同的数据,因此磁头需要跳转到进程需要从磁盘获取数据的位置。这种跳转需要花费大量时间,并会大大降低硬盘的总吞吐量!
长答案,
因为你似乎对硬盘的工作原理缺乏一些(基本的)了解:
没有为什么
你的旋转盘片硬盘就像一本书。
想象一下,您有一本只有空白页的书。那就是您购买时的硬盘。上面没有存储任何数据。
然后,您将它放入计算机中(假设为第二个驱动器,因此我们不必在这里处理操作系统)。
当您编写一个长文本文档(称为“文本 A”)并将其保存在磁盘上时,这就像在书中写入前 10 页(第 1 至 10 页)。然后,您将 jpg 图片复制到磁盘上,这就像在书中的接下来 5 个空白页上画出您的房子(第 11-15 页)。
您的书的目录现在有 2 个条目:
- 文本 A:第 1-10 页
- 房屋图片:第 11-15 页
硬盘上的所有数据都可以再次被删除,这就是为什么你用铅笔而不是圆珠笔来书写和绘制所有内容。
现在,你在书中写下一份购物清单:第 16-17 页。
接下来,你不再喜欢或需要那幅画,想将其擦除,所以你用橡皮擦掉它。第 11-15 页是空白的。
你的目录看起来像:
- 文本 A:第 1-10 页
- 购物清单:第 16-17 页
现在你想画一张当地超市的图片,它比你的房子还大。所以你需要 12 页。你可以从第 11 页开始,这意味着你没有足够的连续页面,你需要从第 18 页继续,或者你可以从第 18 页开始,这样就有足够的空间一次性画出来。
大多数或所有操作系统都足够聪明,可以选择一块足够大的可用空间来容纳整个数据,但如果没有足够大的可用空间,它将不得不将文件分成更小的部分,以适应现有的可用区域。这称为碎片化。
假设您也需要这样做。您的目录如下所示:
- 文本 A:第 1-10 页
- 超市图片,第 1 部分(共 2 部分):第 11-15 页
- 购物清单:第 16-17 页
- 超市图片,第 2 部分(共 2 部分):第 18-24 页
现在我们开始阅读这本书。
你想知道你的购物清单上的物品。目录告诉你转到第 16 页。你开始阅读,直到到达第 17 页的底部。完成。
下一步:你想看看你想去购物的超市是什么样子。目录告诉你转到第 11 页(你在第 18 页(=第 17 页的末尾)并且必须浏览回 7 页。在硬盘上,读写头需要跳转。然后你开始阅读,直到到达第 15 页的末尾,然后你浏览到第 18 页(读写头再次跳转)并继续。
浏览书籍比阅读花费的时间少,但在硬盘上却几乎相反。磁头不能直接移动到下一个磁道/磁柱,而必须“搜索”正确的磁柱(加速度、运动、减速度、稳定时间)。参见维基百科。因此,由于碎片化,读取文件所花的时间比连续存储文件所花的时间要长。
现在,我们做到了两人一起读书:
你想看超市图片,我想读你的文本 A。
你浏览到第 11 页并开始阅读。
当你读完第 11 页时,我浏览到第 1 页并开始阅读。当我读完第 1 页时 ,
你浏览到第 12 页并继续阅读。
当你读完第 12 页时,我浏览到第 2 页并继续阅读。... 你可以想象,由于多次浏览需要很长时间,因此阅读这些页面需要更长的时间。 你的硬盘也是一样。你对此别无选择,只能避免同时访问,因为这总是会使速度变慢。
现在,终于可以得到肯定的答案了:
是的:购买 SSD。
这是一个电子磁盘,它的运行方式与 RAM 类似,因此几乎没有寻道时间,并且总吞吐量始终接近最大可能的吞吐量(如果其他地方没有其他瓶颈)。