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

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

  •  
  •   Immortal · 293 天前 · 1062 次点击
    这是一个创建于 293 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    所以, 如果不是数据库这样的底层软件, 没太多必要操心这个。 当然,把多次小数据汇总成一次写入, 效率上是有提升的。
        6
    billlee   293 天前
    LSM tree, 参见 leveldb.
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3265 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 16ms · UTC 01:32 · PVG 09:32 · LAX 17:32 · JFK 20:32
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1