fsync性能问题

简介:

最近在测试种发现程序里调用fsync刷文件到磁盘时,开销只有几百微秒,于是对fsync相关机制进行了一番调查。

磁盘(或RAID卡)自身通常会有硬件缓存机制,对于写操作,有write back和write through两种机制,前者将数据写至缓存就会返回,而后者则会将数据写到磁盘介质上。当使用write back机制时,fsync刷的文件数据可能只是写到磁盘缓存就返回了,导致从应用看来,写数据到磁盘的开销很小(实际上并未执行磁盘写操作);所以,使用write back机制时,即使上层应用显式fsync成功,数据也是可能丢失的,比如缓存里的数据还未刷到磁盘时掉电了,有些存储设备会使用备用电池(BBU,Battery backup unit)来避免掉电时缓存数据丢失。

如果要保证fsync调用成功后,数据一定持久化到磁盘,则要使用内核的write barrier机制。该机制通过在IO操作之前和之后显式刷新存储设备的缓存来达到目的,在文件系统mount的时候可以指定是否开启barrier机制,ext4默认启用barrier机制。

对于内存映射(mmap)的文件数据,msync的功能与fsync类似,将内存映射数据刷到磁盘,msync使用时有3个标志。

  • MS_SYNC,数据同步刷到磁盘后返回(可能只是写到磁盘缓存)
  • MS_ASYNC, 对于更新的文件数据会提交IO操作到底层,但不会等IO操作执行完成,而是立即返回
  • MS_INVALIDATE,更新文件对应的其它映射数据(如内存区域M1、M2都映射了文件F的数据,如果在msync M1的时候指定了该标记,则M2内存区域里的数据也会被更新)。

要想映射内存msync后被持久化到磁盘,需要使用MS_SYNC标记;而msync调用后数据是否一定持久化,则要看存储设备使用的缓存机制以及内核write barrier是否启用。










本文转自 jiu~ 博客园博客,原文链接:http://www.cnblogs.com/jiu0821/p/7682015.html,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
缓存 固态存储 关系型数据库
MySQL性能优化指南:深入分析重做日志刷新到磁盘的机制
MySQL性能优化指南:深入分析重做日志刷新到磁盘的机制
|
2天前
|
消息中间件 存储 Java
AutoMQ 如何基于裸设备实现高性能的 WAL
AutoMQ是基于S3 Stream的Apache Kafka云原生解决方案,利用云盘和对象存储实现低延迟、高吞吐、低成本流式存储。Delta WAL是其核心组件,作为持久化写入缓冲区,先在云盘上做高效持久化,再上传至对象存储。Delta WAL采用Direct IO在裸设备上读写,避免Page Cache污染,提高写入性能,加快宕机恢复速度。设计目标包括轮转写入、充分利用云盘性能和快速恢复。其写入和恢复流程涉及WALHeader、RecordHeader和SlidingWindow数据结构。基准测试显示,Delta WAL能充分利用云盘资源,实现高吞吐和低延迟。
8 0
AutoMQ 如何基于裸设备实现高性能的 WAL
|
28天前
|
消息中间件 缓存 安全
有关磁盘I/O的调优(二)
【4月更文挑战第5天】有关磁盘I/O的调优的命令,
41 6
|
5月前
|
存储 Java C#
C# | 使用Memory<T>高效地读写内存数据
Memory<T>是什么? 它是一种可变大小、可读写的内存块,可以安全地暴露给用户代码进行操作。 为什么要使用Memory<T>? 使用它有许多好处。最主要的是善用它可以提高代码的性能。因为Memory<T>是可变的,所以我们可以直接在内存中操作数据,而不需要进行额外的拷贝操作。 使用Memory<T>还可以减少垃圾回收的压力,因为我们不需要创建新的对象来存储数据。 Memory<T>还可以与Span<T>和ReadOnlySpan<T>类型一起使用,这些类型可以方便地对数据进行访问和操作。
38 0
|
运维 NoSQL 大数据
持久化-RDB与AOF方案对比|学习笔记
快速学习持久化-RDB 与 AOF 方案对比
61 0
持久化-RDB与AOF方案对比|学习笔记
|
关系型数据库 MySQL Unix
一分钟了解 sync、fsync、fdatasync 系统调用
Hi,大家好!我是白日梦。 今天我要跟你分享的话题是:“了解fsync这个系统调用嘛?谈谈看!”
612 0
|
存储 监控 关系型数据库
MySQL探秘(四):InnoDB的磁盘文件及落盘机制
任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其他技术的关键技术,学习这些底层技术,就可以一通百通,让你很快的掌握其他技术。如何在磁盘上存储数据,如何使用日志文件保证数据不丢失以及如何落盘,不仅是MySQL等数据库的关键技术,也是MQ消息队列或者其他中间件的关键技术之一
|
SQL 关系型数据库 MySQL
用了并行复制居然还有延迟
用了并行复制居然还有延迟
2446 0