关于磁盘IO的那些事儿

在本文中我将引用五篇有关disk io 的好文章来与读者一起学习探讨关于磁盘IO的事。我大概会提取一些关键点,如果你不太理解或想要深入,不要错过那些链接哦。当然任何文章都不要盲信,不肯定时就要多方论证。

on disk io, part 1

network io 被关注得多,disk io关注得少,部分原因在于network io 有许多特性和不同的实现,而disk(或file system) io只是很少一部分工具子集

sector是块设备的最小传输单元;文件系统最小可寻址单元是block,block是相邻的sector的组合;IO是虚拟内存来操作,它会缓存block在buffer中,虚拟内存操作的是page,它会被映射到block (https://superuser.com/a/350499 这个答案解释得不错,文件系统的block理解为logical block)

读时先查看page cache,如果没有则page in;写时先写到page cache,等合适时再flush

关于DIRECT IO

有些时候不想通过page cache写disk,可能出于效率原因,可以通过指定O_DIRECT来绕过page cache直接写块设备。设计合理的话可以提供更加细粒度的IO控制,应用端常需有自己的cache layer

我详细查看了作者引用的关于Linus在linux kernel新闻组的回复,他说:

  • O_DIRECT特别适用于诸如database的应用,若能支持异步则会更好
  • Linus认为O_DIRECT接口设计很糟糕,提供了一种比它更好的two-phases way(顺便吐槽了一下database设计者没有好的设计品味)
  • 使用AIO是非常好的,但它只是为了掩盖糟糕的设计;倘若接口设计良好不用AIO也是可以的

像mysql, postgresql也是使用了O_DIRECT的,比如pg用于写WAL;同时开启O_DIRECT和page cache当然是不推荐的;

如果要进行direct IO,则需保证io starting address 和io size必须与block大小保持对齐; 无论是否使用direct IO,保持读写时的地址和大小对齐是个好习惯,减少kernel的额外工作

底下有评论说:

对于压缩和序列化操作,用direct io 和user caching要比OS本身的page cache要好
buffer cache和page cache不是一回事 ? 这还有待资料验证

关于nonblock

O_NONBLOCK选项不适用于regular filesNon-blocking I/O with regular files,因为文件系统操作本身就是非阻塞的,所以像select,poll也不适合监控普通文件状态

其它参考

Ensuring data reaches disk

fflush是针对于FILE*,将数据从用户层推到OS层,fsync是针对于fd的,将数据推到持久设备上
/dev/raw设备的访问默认是O_DIRECT
O_SYNC/O_DSYNC还会同步写文件的metadata ?
对于新创建的文件,fsync不仅仅是针对于文件还针对于存放这个文件的目录;
为避免覆盖旧数据系统故障导致数据丢失,可以先写temp file,fsync后,再rename,再fsync directory
write/fflush等调用可能并不报IO error,因为数据还在page cache,但fsync,msync,close时则会出现io error,此时对这些调用的返回值是有必要的;
一些文件系统支持在mount指定是否要flush的选项;

**评论值得一看**

part 2, more flavours of io

mmap

文件内容不是立即调入内存的,采用的是延迟加载的形式,因此第一次访问时会有page fault. 使用MAP_POPULATE可强制read ahead
内存映射是通过page cache来实现;
对mmapped 文件的随机访问就和普通指针一样,只不过没有lseek操作
mmap的缺陷:

  • 内核要维护相应的数据结构
  • mapped files大小有限制

此答案建议何时用mmap何时用read

如果要随机访问,有保留很长时间,用mmap,如果是顺序读取,读完了丢弃使用read;最后谁用起来简单用谁

page cache优化

fadvise可提供kernel合适的建议,以提高性能。比如如果要顺序读取文件,可以在真正读取之前用它告诉kernel 提前预读;
mlock可以锁住page,但要慎用以防耗尽内存

aio

glibc并未shipped,需单独安装libaio才能使用;
与O_DIRECT配合使用,不支持buffered io
与posix aio不是一回事,后者是user space aio;

linux aio example

vectored io

可以读small chunks, 减少了系统调用数,且保持了读写原子性;
很少通用型数据库使用vectored io,毕竟它们要处理很多文件,关注延时,cache block-wise,而分析型或列式数据库比较适合使用vectored io,可以并行读入大量数据

目前的方式都有其内在的模式,比如使用O_DIRECT你可能要创建buffer cache,使用page cache需要用到fadvise,使用aio需要用到future-like的接口(指的就是epoll 的回调函数在事件ready后被调用)

On Disk IO, Part 3: LSM Trees
immutable的好处在于不用为数据保留额外空间以防更新成更大的数据;减少了竞争与锁;
immutable/mutable都需要做housekeeping,immutable需要跟踪生成的文件定期做merge,mutable需要减少碎片化

各种DB在LSM的实现上有相似点,都有sorted string table;
sstable就是一个持久化的、有序的、不可变的数据结构,分为data区和索引区;
写都先到内存中的数据结构如skiplist/b-tree,到了一定大小或一定时间就flush到磁盘上成为sstable;
前面的值被后面的update所删除或者写入了新值,称old value is shadowed by new value;

LSM这种设计,在高写负载情况下是可能有高延时的;CPU和磁盘IO可能被Flush,compaction所占满;
有写放大现象;

part 4, b-tree

关于b-tree笔者已经比较熟悉了,但这篇文章还是贴出来,人家都讲得挺好,就不多说了。可以看这篇论文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容