时间:2021-07-31 07:21:12
那么,该怎么办呢? 许多人会考虑许多方法,例如使用fflush ()、fsync )、fdatasync )、sync )、open )、O_DIRECT和O_SYNC标志。 嗯,这些手段(或几种组合)确实可以保证数据安全性的持续化,但它们的区别是什么呢? fflush (和fsync )的区别是什么? O_DIRECT是什么意思? 你能保证数据的安全性持续化吗? O_DIRECT和O_SYNC的区别是什么? O_SYNC和fsync ()是什么? fsync能完成msync的功能吗? 本文试图理解和解释这些概念的作用和差异。
下面将重点介绍O_DIRECT和O_SYNC。 首先,O_DIRECT将数据直接提交到块设备层,而不通过page cache (通常用于用户状态下自己管理buffer ),但必须同步等待数据被安全写入磁盘例如,数据可能仍在数据块级别排队,也可能在磁盘本身的cache中。O_SYNC标志会将数据写入page cache中,但在这种情况下,请采用write through策略因此,如果同时使用O_DIRECT和O_SYNC,则需要同步等待数据不通过page cache安全写入磁盘。 当然,IO的性能会非常差。
O_DIRECT将成为bypass page cache,因此也需要注意这一点,因为其他进程以普通方式读取文件可能会导致数据不一致。
为了做辅助说明,我在这里贴一些我在讨论中看到的资料。 首先,我们引用open系统调用、http://man7. org/Linux/man-pages/man2/open.2.html相关参数的说明。
和innodb相关文档: https://lwn.net/Articles/457667/
fsync和fdatasync的区别: http://man7. org/Linux/man-pages/man2/fsync.2.html
msync :3358主7.org/Linux /主页/主2 /主2 /主同步2.html
最后,附加常见场景中的Linux路径跟踪。 3359 my.oschina.net /文件选项/博客/3061822
参见