linux下的write file一般有这么几种:write、write_sync、write_odirect、aio_write。这里仅仅说前面的三种。我要表达的意思是这三种write方式返回时代表什么,要写的数据在内核的什么层次上。是不是按照字面理解的那样:write_sync和write_odirect返回表示数据写到磁盘上。
首先简单描述下与数据相关的各个层次:
appplication(write + user_data)
||
page cache/buffer(fs 相关)
||
block layer(request、io scheduler)
||
driver layer(scsi command、ata command)
||
device cache(SCSI SATA IDE内部的write cache)
||
device media(存储介质)
generic-write
这是默认使用的write,当write返回时表示数据已经在page cache/buffer这一层,属于第二层次。
write-sync
sync操作按照man 帮助的理解,保证将数据写到硬盘上,才返回。关于写到硬盘上有个问题:是写到硬盘的write cache还是写到硬盘 media上?或者可以这么说
sync操作要一直等到scsi/ata命令返回,才能表示结束。而scsi/ata命令的返回,是表示什么意思。这个就需要设备或者命令本身来解释。
对于没有write cache或者关闭 write cache(hdparm 有这个功能,所谓关闭就是先写到write cache而后在刷到media上),命令的结束表示确实写到media。断电后数据不丢失,对于scsi或者目前ATA中的命令有FUA这个命令,属于write命令的参数,表示数据要写到media才算结束。据说目前好多阵列为了保证数据的integrality,关闭硬盘的write cache。
如果有write cache且开启工作,命令中没有类似于FUA这样的参数,那么scsi/ata command 返回表示数据写到write cache中,就表示成功。这会带来两个问题
A:如果此时硬盘掉电,数据很可能丢失,但是application却认为成功
B:如果要写的扇区出问题?(ATA会尝试备用,如果仍然出现那么上层如何知道?这里我也不知道,作个遗留问题以后处理)
write-odirect
write-odirect类似于write-sync,也是等待scsi/ata command命令结束返回才返回用户空间。唯一区别是write-odirect不用将user-data 拷贝到内核,仅仅是将user-data所在的物理page,能让kernel访问即可。
效率问题
貌似generic-write最好,write-odirect次之,而write-sync最差。但是是否是这样,也需要做专门研究。
如果以上内容有什么错误,而且您有时间,请及时