V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Immortal
V2EX  ›  程序员

关于磁盘顺序写入和随机写入问题

  •  
  •   Immortal · 2018-01-29 16:03:56 +08:00 · 3938 次点击
    这是一个创建于 2494 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看了大佬的博客,关于磁盘原理的文章,有一个问题:

    如果想最大化文件的写入和读取速度,对系统影响达到最小,比如写日志,是否可以这样:
    我想写入的日志文件每个是固定大小 100M,是否可以提前申请 100M 的磁盘大小,然后使用 iobuffer 之类的 io 缓冲方式,10M/次来写入提前申请的磁盘位置(前面的 100M )。
    想问下是否可以实现,还有实现的关键系统函数,关键字,想 google 学习下,谢谢大佬们

    注:google 到一个逼乎的相关讨论,说这个写入之类应用程序没有磁盘写入的控制权,都是文件系统自己优化,意思好像就是没办法,不知道对不地,链接

    6 条回复    2018-01-29 22:00:36 +08:00
    framlog
        1
    framlog  
       2018-01-29 16:10:29 +08:00
    可以那样做的。不过一般都是 os 自己管理 buffer,不是存储系统也没必要用 direct io
    Mirana
        2
    Mirana  
       2018-01-29 16:26:06 +08:00
    每个文件 fd 都关联一个当前的 offset,每次写入 offset 都会更新,顺序写入就是所有的写都是写当前的 offset,随机写就是你 offset 会从[0~max]里随机取值写,这些随机的 offset 最后都可能会导致磁头的移动

    对于磁盘性能优化当然是顺序写比随机写要好,不过文件系统层和块设备层,每层都会对写入做优化,这些优化对于上层来说是不可见的

    优化当然要做,因为你并不能确定你的程序跑在什么环境下,比如什么文件系统,什么磁盘上

    所以我的结论就是做自己的优化,让别人逼逼把
    fcten
        3
    fcten  
       2018-01-29 16:32:05 +08:00
    没有必要。
    一次性写入大量数据会导致 IO 阻塞,引入不必要的复杂逻辑。
    应用程序自己做 IO 缓存,一旦程序崩溃,缓存里的数据都会丢失。
    操作系统本身就对磁盘读写有缓存,并且只要机器不断电就不会丢失。
    写日志这种场景,有了数据就写,无需优化。不存在随机写入问题。
    即使真的遇到了随机写入的问题,上个 SSD 就好了……
    roychan
        4
    roychan  
       2018-01-29 17:17:10 +08:00 via iPhone
    可以看看 log-structured file system 相关的东西。
    enenaaa
        5
    enenaaa  
       2018-01-29 17:19:27 +08:00
    os 的文件系统有自己的管理方式,按页管理的,如果磁盘容量紧张,你提前申请 100M 在物理上也不一定是连续的一块。如果磁盘容量剩余较多,那多次写入也可能在同一块。

    所以, 如果不是数据库这样的底层软件, 没太多必要操心这个。 当然,把多次小数据汇总成一次写入, 效率上是有提升的。
    billlee
        6
    billlee  
       2018-01-29 22:00:36 +08:00
    LSM tree, 参见 leveldb.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.