两个进程操作同一个文件,一个在尾部追加写,一个从头开始读,对磁盘有什么影响呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
kakaxi9394
V2EX    Linux

两个进程操作同一个文件,一个在尾部追加写,一个从头开始读,对磁盘有什么影响呢

  •  2
     
  •   kakaxi9394 2020-10-10 15:24:14 +08:00 3700 次点击
    这是一个创建于 1857 天前的主题,其中的信息可能已经有所发展或是发生改变。

    磁盘头是不是会一会儿 seek 到文件头部,一会儿 seek 到文件尾部?

    最近在看 kafka 的存储设计,想到 broker 一般追加新消息到日志文件,一边读日志文件给 consumer 发消息。如果读写进度有很大差别,磁盘 seek 的开销是不是会变大?

    即使 linux 内核有 page cache,是不是也会出现这个问题?

    11 条回复    2020-10-10 23:24:24 +08:00
    zhusngqz
        1
    zhusngqz  
       2020-10-10 16:08:42 +08:00
    同时的话应该是一个进程失败,或者阻塞吧!!! 我是怎么猜的
    luckyrayyy
        2
    luckyrayyy  
       2020-10-10 16:09:54 +08:00
    哈哈,很有意思的问题,直觉上感觉应该有个 cache 避免频繁切换吧。等个大佬的回答。
    zhgg0
        3
    zhgg0  
       2020-10-10 16:20:12 +08:00
    不会,应用层调用了写入,操作系统并不少马上就写磁盘,有 pagecache 。
    bleoo
        4
    bleoo  
       2020-10-10 16:21:06 +08:00
    你忘了 system-file-cache 这层
    nekoyaki
        5
    nekoyaki  
       2020-10-10 16:24:21 +08:00
    在看 kafka 的设计还能问出这种这个问题说明你没看懂,回去重看
    sujin190
        6
    sujin190  
       2020-10-10 16:36:16 +08:00   1
    磁盘头是不是会一会儿 seek 到文件头部??这是个啥操作! seek 只是切换了文件描述符内记录的文件当前读写文件位置罢了,和磁头也没啥关系吧,更不要说两个进程文件描述符信息都是独立的,有啥关系,实际读写触发磁头寻到的话,磁头始终在高速旋转在磁盘上,你不操作也有其他进程会触发磁头寻道的吧,而且 kafka 这种连续读写的方式来说,文件头和文件尾大概率在同已磁道上,消耗很小的吧,更不要说操作系统还有文件缓存
    kakaxi9394
        7
    kakaxi9394  
    OP
       2020-10-10 18:00:07 +08:00
    @zhusngqz 不至于
    kakaxi9394
        8
    kakaxi9394  
    OP
       2020-10-10 18:18:35 +08:00
    我知道内核文件对象有 read/write buffer,所以读写肯定是先经过内核 buffer,再到磁盘文件。
    也知道 kafka 是线性读写,利用两种 buffer 已经极大程度上解决了问题。

    我这里就只是好奇,是不是有极端情况: 一个日志文件同时读写,又恰好触发了内核 buffer 和磁盘文件的同步,就会出现“一会儿 seek 到文件头部,一会儿 seek 到文件尾部”的情况。

    感觉是有可能的。我自己钻牛角尖罢了,纯粹好奇
    gotonull
        9
    gotonull  
       2020-10-10 18:26:56 +08:00
    2 个进程同时对一个文件操作,一个拿到写锁了,另一个应该不能读了吧
    ryd994
        10
    ryd994  
       2020-10-10 18:27:56 +08:00
    @kakaxi9394 Linux 默认是 CFQ 或者 deadline 磁盘调度器。读比写优先级高。所以会优先执行读操作。
    写会延迟,然后多个连续的操作会被合并。
    读实际上会有 readahead 机制参与。预读下一部分到缓存。所以可以说读操作也被合并了。

    刚写入的文件内容就在 cache 里,不需要读。硬要做成 write trough cache 的话,可能会来回 seek,但不会非常频繁。硬要禁用 cache 和调度器的话才会来回 seek (但是硬盘本身还有 buffer )
    jones2000
        11
    jones2000  
       2020-10-10 23:24:24 +08:00
    用 SSD 不存在什么磁头问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2986 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:29 PVG 08:29 LAX 16:29 JFK 19:29
    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