open标志位
O_DIRECT绕过page_cache
O_APPEND目前nfs4不支持原子追加写入,本地文件系统通过inode锁可以实现原子写入。
java的write只是系统调用成功,写入page_cache,不代表写入到硬件存储上。
操作系统提供fsync,fdatasyn两个方法,满足用户同步数据到持久化设备,fdatasync尽可能不同步文件元数据以减少磁盘IO来提高性能。
RandomAccessFile
打开文件的4中模式中rws会在open
文件时传入O_SYNC
标志位,rwd传入O_DSYNC已区分调用fsync还是fdatasync。
FileDescription类的sync方法在UNIX系统上底层调用是fsync,保证数据保存到持久化存储设备后返回。但是如果系统使用了硬盘本身的缓存,一般系统定时调用硬盘flush接口,即时fsync调用成功突然断电也有可能丢失数据。
对于写操作,有write back和write through两种机制,前者将数据写至缓存就会返回,而后者则会将数据写到磁盘介质上再返回。
如果想要保证调用fsync或fdatasync后数据一定能写到磁盘上,可以开启linux的write barrier,它可以控制在IO操作之前和之后刷新缓存来达到一定能写入磁盘的目的。Ext4 文件系统默认启用 barrier机制,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。类似java的happen-before原则