MySQL innodb_log_write_ahead_size参数及Linux落盘机制的疑问

mysql innodb_log_write_ahead_size:
表示redo log写前的块大小。InnoDB以512字节一个block的方式对齐写入ib_logfile文件,但文件系统一般以4096字节为一个block单位。如果即将写入的日志文件块不在OS Cache时,就需要将对应的4096字节的block读入内存,修改其中的512字节,然后再把该block写回磁盘。该参数解决这个问题,当前写入文件的偏移量不能整除该值时,则补0,多写一部分数据。这样当写入的数据是以磁盘block size对齐时,就可以直接write磁盘,而无需read-modify-write这三步了。

Question:
1.为什么补0对齐之后就可以直接write,不用read-modify-write了呢?
有说法是说:第一次写,该页不在page cache里面,下次再修改的时候就可以直接修改page cache,不会引起缺页异常。那么我不补0,他还不是在cache里面么,有什么区别?
2.Linux的IO机制是先写cache,再刷到磁盘。那如果我是写一个新文件,磁盘都是空白的,也需要读取空的到cache中,再修改,再落盘么?

阅读 3k
1 个回答

1.当修改的内容不足一个blocl时,需要将整个block读进内存,修改对应的位置,再把block写回去;如果用0补齐,使得需要写入的内容刚好是block的倍数,那么就直接覆盖写入即可。
2.这个不清楚

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题