问题标签 [fsync]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
google-cloud-platform - GCP:区域磁盘的写入是否在操作系统 fsync 之前跨区域复制?
https://cloud.google.com/compute/docs/disks#repds
区域永久性磁盘为可能没有应用程序级复制的工作负载提供同步复制。
如果 VM 在磁盘写入之后但在 之前崩溃fsync
,那么该数据是否会丢失?
何时将磁盘写入复制到另一个区域中的副本磁盘?
注意:VM 操作系统是默认的 Ubuntu,具有默认的文件系统。
apache-kafka - Kafka 消费者是否收到已刷新(fsynched)到磁盘的消息?
我在 Kafka 上阅读了一个过时的 pdf,其中指出消费者将收到已经提交到持久存储(磁盘)的消息。
然而,最近的搜索结果并没有明确说明这样的规范。
谁能确认现代 Kafka 和消费者是否收到已同步的消息?或者他们是否收到仅复制的消息(不暗示 fsync)。
c - 如何确保将数据写入物理介质?
我有一个由脚本调用的程序。该程序将大量数据写入磁盘上的文件,然后终止。一旦完成运行,脚本就会切断整个系统的电源。
我遇到的问题是文件没有被完整写入。如果它是一个 4GiB 的文件,当我稍后查看它时,实际上只有大约 2GiB 会在磁盘上。我能够可靠地确保写入所有数据的唯一方法是在程序完成后在退出前让程序休眠一小段时间,但这是一个非常糟糕且不可靠的黑客,我不想使用。这是我最近尝试的一些示例代码:
我最初尝试使用文件描述符构建我的FILE ,并在使用的描述符(/logs/data)上调用fsync(),但是这产生了同样的问题。根据fsync(2)的规范:
调用 fsync() 不一定确保包含该文件的目录中的条目也已到达磁盘。为此,还需要在目录的文件描述符上显式 fsync()。
这导致我使用上面的代码,仅为包含我的数据文件的目录创建一个特定的文件描述符并在其上调用fsync()。然而结果是一样的。我真的不明白为什么会这样,因为fsync()应该是阻塞的:
呼叫阻塞,直到设备报告传输已完成。
另外,如您所见,我在FILE上添加了一个fflush() ,认为fsync()可能只是同步先前已刷新的数据,但这对情况没有任何影响。
在结束程序之前,我需要以某种方式验证数据实际上是否已写入物理介质,但我不知道该怎么做。我看到有一些文件,例如 /sys/block/[device]/[partition]/stat 可以告诉我还有多少脏块要写入,我可以等待该值达到 0 但这不会似乎是解决应该是一个简单问题的好方法,此外,如果磁盘上正在运行任何其他程序,那么我也不想等待他们同步数据,因为我只关心完整性此特定文件和 stat 文件不区分。
编辑 根据建议,我尝试fsync()两次,首先在文件上,然后在目录上:
这产生了一些有趣的输出。对于一个 4GiB(4294967296 字节)的文件,磁盘上的实际数据大小为 4294963200,恰好与总值相差 1 个页面文件(4096 字节)。它似乎非常接近一个可行的解决方案,但它仍然不能保证每一个数据字节。
c - `O_DIRECT | 有什么区别?O_SYNC` + write() 和 `O_DIRECT` + write() + fsync()
我想知道两者的区别
和
上面代码的性能比下面的要慢得多。
file - 在 ext4 中使用 O_DIRECT open() 时 fsync() 做了什么
我知道即使正在写入的文件已打开O_DIRECT
并且文件的元数据已更改,XFS 也不会同步元数据。但是对于 ext4,我注意到 MySQL 支持O_DIRECT_NO_FSYNC
,这意味着 MySQL 不会调用fsync()
并让文件系统自行同步元数据。
所以问题来了:如果我在 ext4 中open
有一个文件O_DIRECT
(比如 linux 内核版本 5.8.0),然后调用fsync()
after write()
,会fsync()
做什么?
要遵循的另一个问题:fsync()
如果open()
文件包含O_DIRECT | O_SYNC
在 ext4 中会怎样?
谢谢!
io - 如果我使用 libaio + fsync() 会怎样?
我知道当我使用write()
+ fsync()
(或O_SYNC
+ write()
,我认为它们是相同的ref #1 ref #2)编写文件时,这意味着我正在使用阻塞同步 I/O,如果write()
(with O_SYNC
) 或fsync()
返回,则意味着数据安全地保存在设备介质上(例如,用于 SSD 的 TLC NAND)而不是设备缓存(例如,SSD 中的 DDRAM)。
而如果我使用libaio
呢?(因为我想确保libaio发出的写入是在存储介质上而不是在设备缓存上。也就是说,我想io_getevents()
返回时,它可能不确定写入在存储介质上,可能只是在设备上缓存)
- 问题 1:是否
fsync()
专门用于同步 I/O? - 问题2:是
fsync()
在io_submit()
未定义行为之后? - 问题 3:如何使异步写入安全地持久化到设备介质而不是设备缓存(没有电池支持的缓存)。
c - libaio 和同步文件输出
我之前也问过类似的问题,但是我得到的评论让我觉得我表达得不好什么的,所以我把它删除了,再试一次。我有使用libaio
异步 I/O 线程写入文件的 C 代码。稍后在代码中,正在写入的内存位置被重新填充。不用说,在重新填充开始之前,我必须确保编写完成。如果我fsync()
在重新填充开始之前调用,这是否会导致主线程阻塞,直到所有线程的写入完成?手册页似乎暗示了这fsync
一点,但我找不到明确的说法。还有aio_fsync
函数,但它的手册页说“请注意,这只是一个请求;它不等待 I/O 完成。” 但等待 I/O 完成正是我所需要的。
我知道我可以一个一个地检查写入该文件的所有线程,然后等待它们完成。但我希望有一个像 call 一样的单行代码fsync()
。有这样的事吗?