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

2018-01-29 16:03:56 +08:00
 Immortal

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

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

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

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

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

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

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

所以, 如果不是数据库这样的底层软件, 没太多必要操心这个。 当然,把多次小数据汇总成一次写入, 效率上是有提升的。
billlee
2018-01-29 22:00:36 +08:00
LSM tree, 参见 leveldb.

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

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

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

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

© 2021 V2EX