同一台机器,多个程序读同一块硬盘上的数据,相比一个程序依次读,会慢吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
morefreeze
V2EX    Linux

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

  •  
  •   morefreeze 2016-08-15 19:20:33 +08:00 3962 次点击
    这是一个创建于 3375 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言    2016-08-16 13:29:24 +08:00
    补充下,文件行数是百万级,大小约百 M ,即每行几百字符。只考虑一行行读的情况。

    看了圈评论的意思,大致是说现代磁盘会有优化,即使来回寻道是存在的,并行的效率仍然是高于一个程序硬跑的是么。

    补充下我自己看到的一些事实,用 parallel -j 4 跑程序,用 time cmd 来计时, total 时间平均下来有 3 小时左右,也就是 0.75 小时每个程序。而单个程序跑一次平均时间约 1 小时。
    第 2 条附言    2016-08-16 14:16:26 +08:00
    mdzz, 文件大小应该是上 G
    13 条回复    2016-08-16 19:28:46 +08:00
    zhicheng
        1
    zhicheng  
       2016-08-15 19:56:36 +08:00 via Android
    文件大,无所谓。文件小,多个快。
    如果文件远小于内存,只有读请求,来回 seek 影响不大。
    文件名不影响文件读取数度,但我猜你的意思是文件是顺序创建的。
    singser123
        2
    singser123  
       2016-08-15 21:40:46 +08:00 via Android
    现在的硬盘都支持 ncq 了,会对队列顺序重新排序使磁头移动距离最少
    loading
        3
    loading  
       2016-08-15 21:45:11 +08:00 via Android
    只有一个磁头,文件碎片造成性能下降就是体现之一
    em70
        4
    em70  
       2016-08-15 22:08:24 +08:00
    如果文件不大,可以在内存虚拟一个硬盘出来放里面,就不考虑这些问题了
    shijingshijing
        5
    shijingshijing  
       2016-08-15 22:34:16 +08:00
    机械硬盘都要移动磁头寻道的然后读取的,底层理论上是顺序读写的, ncq 的意义就是把多个不同的请求尽量合并在一次寻道来读取。
    kaneg
        6
    kaneg &nbp;
       2016-08-15 23:34:35 +08:00
    多个程序读多个文件和一个程序读多个文件对操作系统的系统调用来说都是一样的,本质上不会有差异的。
    pubby
        7
    pubby  
       2016-08-15 23:42:51 +08:00
    @singser123
    @shijingshijing 这个场景中, ncq 需要多程序读才可能有作用吧,如果一个程序读没有太多队列信息用来排序啊。
    billlee
        8
    billlee  
       2016-08-16 00:17:58 +08:00
    不要把精力花费在无意义的优化上
    9hills
        9
    9hills  
       2016-08-16 08:05:22 +08:00 via iPhone
    @pubby 文件本身并不一定是连续存储的
    pubby
        10
    pubby  
       2016-08-16 08:19:26 +08:00 via Android
    @9hills 是的。但是一个程序总要按文件实际的存储位置依次顺序读下去,我的疑问是,我还没读到后面, ncq 怎能能知道我后续的磁头定位信息?
    murmur
        11
    murmur  
       2016-08-16 08:36:45 +08:00
    不要把操作系统当弱智好吧。。
    wizardoz
        12
    wizardoz  
       2016-08-16 09:34:42 +08:00
    你这个问题相当于这样:
    要读取磁盘上的多个文件,让操作系统优化读取过程相比于自己写一个程序来读,会慢吗?
    ryd994
        13
    ryd994  
       2016-08-16 19:28:46 +08:00 via Android
    如果你需要更多性能, Linux 下可以调大 readahead 以及用 deadline scheduler ,据说 deadline 对某些情况有奇效
    Windows 不知道有什么可调整
    另外………上 SSD ,解
    @pubby 用 fadvise 或者异步 IO
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3441 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 04:46 PVG 12:46 LAX 20:46 JFK 23:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86