查看原文
其他

关于 O_DIRECT 的正确答案!

破产码农 InsideMySQL 2022-10-13

        

破产码农

IT圈最会讲故事的网红 · 南山彭于晏
上篇文章PostgreSQL 不支持的 O_DIRECT,MySQL 和 Oracle 都有 ,发文时就知道过于干货,阅读量不会太高。
果不其然的没有超过基本盘 2000 阅读量(亲,你们不打赏,影响后续广告投放啊)。
反复阅读了几遍自己写的文章,觉得已然通俗易懂,能将内核代码缩减成这么精简的几行代码,纵古论今,自认为也没多少码农可以办到。
难得自己有些小小的成就感,谁知阅读量就大大地扑街了。
接着,少见地同学们踊跃回复最后的三道思考题,定睛一看,答案也全部扑街。
所以,当今之世,有多少人真正懂数据库呢?
本号的思考题本不给答案,但鉴于这次摸底考,大家都挂科了,姜老师这次额外给出标准答案(BTW,请各位小伙伴点赞 + 在看,分享本篇干货)。

Q1:MySQL InnoDB 存储引擎刷新磁盘使用 O_DIRECT,他是根据多少大小进行字节对齐的呢?
A:InnoDB的页大小默认是 16K ,缓冲池初始化会根据 16K 对齐内存地址,因此每个页肯定是扇区(512 字节或 4K)对齐的,所以 O_DIRECT 不会有任何问题。
Q2:为什么重做日志文件写入却不需要启用 O_DIRECT 选项呢?
A:本题几乎全局覆灭,同学们对于脏页刷新和 redo 日志的理解还是太表面。
脏页刷新,要求一定要落盘,尽快要落盘,因此使用 O_DIRECT 可以避免操作系统再做一次缓存,从而提升性能。
但对于 redo 日志来说,每次写日志并不要求一定要落盘。比如一个事务执行了1分钟,只要最后事务提交时确保日志文件落盘即可,为什么需要每个页发生更新,就强制 redo 日志文件落盘呢?这样效率并不高。
因此,redo 日志使用缓存写,每次提交时才做一次fsync刷盘(还有后台线程每秒固定的 fsync ),确保数据落盘,同时可将多个事务的重做日志用一次fsync刷盘,提升了redo日志的group commit。
Q3:RAW 格式是否还有性能优势呢?
A:说 RAW 格式对比 O_DIRECT 有性能优势的全部是 Oracle DBA,无他。Oracle DBA的弱是全方位的弱。 Please show me your result on SSD. 

直播预告


每周五、六,不定期直播,分享技术干货


IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。
IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)
仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群
-----------------------
公众号:破产码农
视频号:破产码农
抖音号:破产码农
B站号:姜老师带你飞
长按下图二维码关注,将感受到一个有趣的灵魂,每篇文章都会有新惊喜。

          

往期推荐

PostgreSQL 不支持的 O_DIRECT,MySQL 和 Oracle 都有


一个参数,MySQL 8.0 性能飙升180%!!!


全网首测,MySQL Router来了,不容错过!!!


MySQL 8.0,二进制日志的一大改进!


02集| MySQL崛起:起飞


01集 | MySQL崛起:缘起


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存