2011-04-23 36 views
2

我们希望尽力避免在断电期间丢失数据。所以我决定使用O_DIRECT标志打开一个文件在磁盘中写入数据。 O_DIRECT是否意味着数据完全绕过OS缓存?如果请求向应用程序返回成功,是否意味着数据必须已刷新到磁盘?如果我在一个文件系统中打开常规文件,那么FS元数据如何?它是否也会立即刷新,还是被缓存?我是否可以使用O_DIRECT进行写入请求以避免在电源故障期间丢失数据?

顺便说一下,O_DIRECT可以在Windows中使用吗?或者在Windows中有没有相应的方法?

回答

1

CreateFile可以做到这一点。

HANDLE WINAPI CreateFile(
    __in  LPCTSTR lpFileName, 
    __in  DWORD dwDesiredAccess, 
    __in  DWORD dwShareMode, 
    __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
    __in  DWORD dwCreationDisposition, 
    __in  DWORD dwFlagsAndAttributes, 
    __in_opt HANDLE hTemplateFile 
); 

对于dwFlagsAndAttributes您可以指定FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING

如果FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING同时指定 ,使系统缓存 没有效果,那么数据是 立即刷新到磁盘而不 经历Windows系统 缓存。操作系统也请求 将硬盘的本地硬件高速缓存的直写写入 持久性媒体。

2

O_DIRECT可能会做你想做的,但它会大大减慢你的I/O。
我想只是调用fsync()或fflush(),具体取决于您使用直接文件描述符操作还是FILE *应该足够。
至于元数据问题,它取决于底层文件系统,甚至在硬件上,如果你想成为额外的偏执狂。硬盘(尤其是SSD)可能会报告操作已完成,但可能需要一段时间才能真正写入数据。

+0

这里是如何在OS X上执行它:) http://stackoverflow.com/questions/2299402/how-does-one-do-raw-io-on-mac-os-x-ie-equivalent- to-linuxs-o-direct-flag – Torp 2011-04-23 13:24:08

+1

而这个线程说使用O_DIRECT并不像看起来那么简单:http://www.gossamer-threads.com/lists/linux/kernel/350610 – Torp 2011-04-23 13:28:01

2

您可以使用O_DIRECT,但对于许多应用程序来说,调用fdatasync()更方便。 O_DIRECT强加了很多限制,因为IO完全绕过了OS缓存。它绕过读取缓存以及写入缓存。

对于文件系统元数据,您可以在写入文件之后执行fsync()文件。 fsync会刷新文件元数据,因此如果电源在之后立即丢失,您可以确保该文件不会消失(或更改其属性等)。

任何这些机制依赖于你的IO子系统不卧到OS大约具有持续的数据存储,并且在许多情况下,其他依赖于硬件的东西(如RAID控制器电池不电源恢复之前用完)

0

警告 - O_DIRECT绕过你OS的缓存,但它绕过磁盘的缓存。如果您的磁盘具有非易失性写入缓存,则在突然关闭电源期间仍可能丢失磁盘缓存中的数据!

请问O_DIRECT是否表示数据完全绕过OS缓存?

一般但一些Linux文件系统可以与O_DIRECT(所述Ext4 Wiki Clarifying Direct IO's Semantics page warns this can happen with allocating writes)回落到缓冲I/O。

如果请求向应用程序返回成功,是否意味着数据必须已刷新到磁盘?

通常,但请参阅上述注意事项(例如,数据可能已经到缓冲区缓存/可能在磁盘的非易失性缓存中)。

如果我打开一个文件系统中的常规文件,如何对FS的元数据?它是否也会立即刷新,还是被缓存?

优秀的问题!即使请求成功完成,元数据仍可能在缓存中滚动并且尚未同步到磁盘。

以上所有意思是您必须在正确的位置执行相应的fsync()命令(并检查其结果!),以确定操作是否已达到非易失性存储。有关详细信息,请参阅https://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/LWN article "Ensuring data reaches disk"

相关问题