传统unix系统实现内核利用高速缓存或页面高速缓存写文件方式,在缓冲区满或者系统需要重用缓冲区时,才把写操作排入队列,IO操作从队首开始逐个刷入磁盘,属于延迟写(delayed write),虽然降低了写IO的次数但是降低了文件更新速度。
后来为了保证同步,防止OS崩溃时数据丢失,产生了三个函数:
sync:将所有修改过的块缓冲区推入写队列,但不会等待磁盘写入结束
fsync: 同sync,但会等待磁盘写入结束后再返回,适用于强事务性操作,比如数据库事务日志
fdatasync: fsync实际上进行了两次IO操作,文件data一次,metadata一次,fdatasync可以在必要时再更新metadata优化性能
Berkeley DB运用fdatasync的例子:
1.每个log文件固定为10MB大小,从1开始编号,名称格式为“log.%010d"
2.每次log文件创建时,先写文件的最后1个page,将log文件扩展为10MB大小
3.向log文件中追加记录时,由于文件的尺寸不发生变化,使用fdatasync可以大大优化写log的效率
4.如果一个log文件写满了,则新建一个log文件,也只有一次同步metadata的开销
展开
1