同一台机器,多个程序读同一块硬盘上的数据,相比一个程序依次读,会慢吗?

2016-08-15 19:20:33 +08:00
 morefreeze

比如 4 个程序(和 CPU 数相同)读同一块硬盘上的文件(文件名连续),文件都不相同,和一个程序依次读这些文件,最后时间谁多谁少呢?同时读的总时间为各程序的执行时间之和。假设内存足够。

对硬盘底层并不了解,我想如果来回切读取的位置,那读头应该会频繁移动,反而将时间耗在随机寻址上,相比单个程序顺序读,要慢不少,是这样吗?如果是这样的话,那一台机器难免会多个程序同时运行,难免会同时读取(这就更不说写入了),那这很难协调让效率最大化了?

3542 次点击
所在节点    Linux
13 条回复
zhicheng
2016-08-15 19:56:36 +08:00
文件大,无所谓。文件小,多个快。
如果文件远小于内存,只有读请求,来回 seek 影响不大。
文件名不影响文件读取数度,但我猜你的意思是文件是顺序创建的。
singser123
2016-08-15 21:40:46 +08:00
现在的硬盘都支持 ncq 了,会对队列顺序重新排序使磁头移动距离最少
loading
2016-08-15 21:45:11 +08:00
只有一个磁头,文件碎片造成性能下降就是体现之一
em70
2016-08-15 22:08:24 +08:00
如果文件不大,可以在内存虚拟一个硬盘出来放里面,就不考虑这些问题了
shijingshijing
2016-08-15 22:34:16 +08:00
机械硬盘都要移动磁头寻道的然后读取的,底层理论上是顺序读写的, ncq 的意义就是把多个不同的请求尽量合并在一次寻道来读取。
kaneg
2016-08-15 23:34:35 +08:00
多个程序读多个文件和一个程序读多个文件对操作系统的系统调用来说都是一样的,本质上不会有差异的。
pubby
2016-08-15 23:42:51 +08:00
@singser123
@shijingshijing 这个场景中, ncq 需要多程序读才可能有作用吧,如果一个程序读没有太多队列信息用来排序啊。
billlee
2016-08-16 00:17:58 +08:00
不要把精力花费在无意义的优化上
9hills
2016-08-16 08:05:22 +08:00
@pubby 文件本身并不一定是连续存储的
pubby
2016-08-16 08:19:26 +08:00
@9hills 是的。但是一个程序总要按文件实际的存储位置依次顺序读下去,我的疑问是,我还没读到后面, ncq 怎能能知道我后续的磁头定位信息?
murmur
2016-08-16 08:36:45 +08:00
不要把操作系统当弱智好吧。。
wizardoz
2016-08-16 09:34:42 +08:00
你这个问题相当于这样:
要读取磁盘上的多个文件,让操作系统优化读取过程相比于自己写一个程序来读,会慢吗?
ryd994
2016-08-16 19:28:46 +08:00
如果你需要更多性能, Linux 下可以调大 readahead 以及用 deadline scheduler ,据说 deadline 对某些情况有奇效
Windows 不知道有什么可调整
另外………上 SSD ,卍解
@pubby 用 fadvise 或者异步 IO

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/299474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX