问题标签 [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.

0 投票
7 回答
11199 浏览

linux - SD卡写入性能

我正在编写一个小应用程序,它以恒定速率在 SD 卡上写入 jpeg 图像。我选择了 EXT3 文件系统,但使用 EXT2 文件系统观察到了相同的行为。

我的写作循环如下所示:

或者像这样:

我还显示了一些计时统计信息,我可以看到我的程序有时被阻塞了几秒钟。平均速率还是不错的,因为如果我将传入的图像保持在一个 fifo 中,那么我会在这样的停顿后的短时间内写入很多图像。你知道这是操作系统的问题还是与SD卡本身有关?我怎样才能更接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的。

一些精度:是的,有必要在每个文件之后进行 fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中。没有 fsyncing,我的直通输出要好得多,但仍然是不可接受的停顿。我认为这不是缓冲区问题,因为第一次停顿发生在写入 50 MB 之后。根据手册页, fsync 正是为了确保没有缓冲数据。

关于平均写入速率的精度:我正在以我正在使用的卡可持续的速率写入。如果我在等待 fsync 完成时堆积传入的图像,那么在这个停顿之后,写入传输速率会增加,我会很快回到平均速率。平均传输速率约为 1.4 MBytes / s。

systeme 是运行 ubuntu 8.04 和 stock kee (2.6.24.19) 的现代笔记本电脑

0 投票
4 回答
12318 浏览

c++ - 如何在 ofstream 上进行 fsync?

我想确保已将 ofstream 写入磁盘设备。这样做的可移植方式(在 POSIX 系统上可移植)是什么?

open如果我在只读附加模式下单独文件以获取文件描述符并使用它调用,这是否解决了问题fsync?像这样:

0 投票
6 回答
52577 浏览

fflush - fflush 和 fsync 的区别

我认为fsync()fflush()内部进行,所以fsync()在流上使用是可以的。但是在网络 I/O 下执行时,我得到了意想不到的结果。

我的代码片段:

但似乎_commit()没有刷新数据(我在 Windows 上尝试过,数据写在 Linux 导出的文件系统上)。

当我将代码更改为:

它刷新数据。

我想知道是否_commit()fflush(). 有什么输入吗?

0 投票
1 回答
112 浏览

file - 是否有一种 posix 方式来确保按顺序刷新两个文件而不会阻塞?

在我的程序中,我打开了两个文件以供写入,一个包含数据块的内容文件和一个包含迄今为止已写入数据块的映射的索引文件。

我想将它们都刷新到磁盘上,尽可能提高性能,唯一的限制是数据文件中的块必须在映射文件中的相应块之前写入(自然)。

问题是,出于延迟和吞吐量原因,我想避免阻止 IE 执行 fsync。

有任何想法吗?

0 投票
4 回答
8786 浏览

directory - 如何在 POSIX 中持久地重命名文件?

在 POSIX 文件系统中持久重命名文件的正确方法是什么?特别想知道目录上的fsyncs。(如果这取决于 OS/FS,我问的是 Linux 和 ext3/ext4)。

注意:StackOverflow 上还有其他关于持久重命名的问题,但是 AFAICT 他们没有解决对目录进行 fsync 的问题(这对我来说很重要——我什至没有修改文件数据)。

我目前有(在 Python 中):

具体问题

  • 这是否也隐式地 fsync 源目录?或者我可能会在电源循环后最终在两个目录中显示文件(这意味着我必须检查硬链接计数并手动执行恢复),即不可能保证持久的原子移动操作?
  • 如果我 fsync 源目录而不是目标目录,那是否也会隐式 fsync 目标目录?
  • 是否有任何有用的相关测试/调试/学习工具(故障注入器、自省工具、模拟文件系统等)?

提前致谢。

0 投票
2 回答
1203 浏览

linux - 每次提交可以用一个 fsync 实现日志吗?

假设您正在构建一个日志/预写日志存储系统。您可以通过(对于每个事务)附加数据(使用 write(2))、附加提交标记然后 fsync-ing 来简单地实现这一点吗?

要考虑的场景是,如果您对此日志进行大量写入,然后对其进行 fsync,并且在 fsync 期间出现故障。是否仅在刷新所有数据块后才刷新 inode 直接/间接块指针,还是不能保证按顺序刷新块?如果是后者,那么在恢复过程中,如果您在文件末尾看到一个提交标记,则您不能相信它与前一个提交标记之间的数据是有意义的。因此,您必须依赖另一种机制(至少涉及另一个 fsync)来确定日志文件的一致程度(例如,写入/fsync 数据,然后写入/fsync 提交标记)。

如果它有所作为,主要是想知道 ext3/ext4 作为上下文。

0 投票
1 回答
3574 浏览

database - PostgreSQL 9:无法 fsync 文件“base/16386”:参数无效

我正在尝试测试一个小型 PostgreSQL 设置,所以我拼凑了一个快速的本地安装。但是,当我尝试使用 createdb 创建我的个人数据库时,它会因此类错误而窒息(特别是,它第一次从 base/16384 开始,每次运行时都会递增)。任何人都知道这里发生了什么,或者是否有一些我错过的琐碎配置会导致这种情况?谢谢,这有点时间紧迫,所以如果您知道任何事情,请回复。谢谢!

更新:
我在 CentOS 5 服务器上运行它,抱歉我没有太多详细信息(它是该服务器上的共享帐户)。uname -a 有以下输出:

Linux {OMITTED} 2.6.18-194.11.4.el5 #1 SMP Tue Sep 21 05:04:09 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

我从以下来源安装了 PostgreSQL:

http://wwwmaster.postgresql.org/download/mirrors-ftp/source/v9.0.1/postgresql-9.0.1.tar.bz2

在我的主目录中构建并安装到 prefix=$HOME/local/pgsql。

这是我尝试在新数据设置上创建用户数据库的终端读数:

[htung@{OMITTED}:~]$ killall postgres
LOG: autovacuum 启动器正在关闭
LOG: 收到智能关闭请求
LOG: 正在关闭
LOG: 数据库系统已关闭
[htung@{OMITTED}:~]$ rm -r tmp
mk [1]+ 完成 ../local/pgsql/bin/postgres -D $HOME/tmp (wd: ~/tmp)
(wd now: ~)
[htung@{OMITTED}:~]$ mkdir tmp
[htung@{省略}:~]$ local/pgsql/bin/initdb -D $HOME/tmp
属于这个数据库系统的文件将归用户“htung”所有。
该用户还必须拥有服务器进程。

数据库集群将使用语言环境 en_US.UTF-8 进行初始化。
因此,默认数据库编码已设置为 UTF8。
默认文本搜索配置将设置为“英语”。

修复现有目录 /afs/{OMITTED}/htung/tmp 的权限 ... ok
创建子目录 ... ok
选择默认 max_connections ... 100
选择默认 shared_buffers ... 32MB
创建配置文件 ... ok
创建 template1 数据库/afs/{OMITTED}/htung/tmp/base/1 ... ok
初始化 pg_authid ... ok
初始化依赖关系 ... ok
创建系统视图 ... ok
加载系统对象的描述 ... ok
创建转换 .. . ok
创建字典 ... ok
设置内置对象的权限 ... ok
创建信息模式 ... ok
加载 PL/pgSQL 服务器端语言 ... ok
清理数据库模板1 ... ok
将模板 1 复制到模板 0 ... 好的
将模板 1 复制到 postgres ... 好的

警告:为本地连接启用“信任”身份验证您可以通过编辑 pg_hba.conf 或在 下次运行 initdb 时
使用 -A 选项来更改此设置。

成功。您现在可以使用以下命令启动数据库服务器:


local/pgsql/bin/pg_ctl -D /afs/{OMITTED}/htung/tmp -l logfile start

[htung@{OMITTED}:~]$ local/pgsql/bin/postgres -D $HOME/tmp
LOG: 数据库系统于 2010-11-15 13:47:25 PST
LOG: autovacuum launcher 启动
LOG: database系统已准备好接受连接

[1]+ 停止 local/pgsql/bin/postgres -D $HOME/tmp
[htung@{OMITTED}:~]$ bg
[1]+ local/pgsql/bin/postgres -D $HOME/tmp &
[htung@ {OMITTED}:~]$ local/pgsql/bin/createdb
错误:无法 fsync 文件“base/16384”:无效参数
声明:CREATE DATABASE htung;

createdb:数据库创建失败:错误:无法 fsync 文件“base/16384”:无效参数
[htung@{OMITTED}:~]$

0 投票
2 回答
4675 浏览

java - Android (Java) 中的 ext4/fsync 情况不清楚

Tim Bray 的文章“安全地保存数据”给我留下了一些悬而未决的问题。今天,它已经一个多月了,我还没有看到任何后续,所以我决定在这里讨论这个话题。

文章的一个观点是,在使用 FileOutputStream 时应该调用 FileDescriptor.sync() 以确保安全。起初,我很生气,因为在我做 Java 的 12 年里,我从未见过任何 Java 代码进行同步。特别是因为处理文件是一件非常基本的事情。此外,FileOutputStream 的标准 JavaDoc 从未暗示同步 (Java 1.0 - 6)。经过一番研究,我认为 ext4 实际上可能是第一个需要同步的主流文件系统。(是否存在建议显式同步的其他文件系统?)

我很欣赏对此事的一些一般性想法,但我也有一些具体问题:

  1. Android 何时会同步到文件系统?这可以是周期性的并且另外基于生命周期事件(例如,应用程序的进程进入后台)。
  2. FileDescriptor.sync() 是否负责同步元数据?那就是同步更改文件的目录。与 FileChannel.force() 进行比较。
  3. 通常,不直接写入 FileOutputStream。这是我的解决方案(你同意吗?): /code>
0 投票
1 回答
323 浏览

objective-c - 我应该如何处理来自 libSystem.B.dylib 的 fsync 异常?

我收到了一份包含此堆栈跟踪的崩溃报告:

很遗憾得到一个 fsync 异常,但是事情发生了,对吧?我的问题是,我应该如何最好地处理这个异常?把它包成一个@try/@catch块?


更新:崩溃发生在线程 1 中。这是线程 1 的完整跟踪:

我只能说,WTF?这里可能有某种奇怪的系统问题吗?因为在那条跟踪中我没有看到任何我自己的代码。

0 投票
2 回答
1086 浏览

python - 在 stdout/stderr 文件描述符上调用 os.fsync 会杀死一个子进程

在使用 Pythonsubprocess库生成子进程后,我使用stderr将消息从子进程传递到包含一些序列化数据的父进程。然后,我希望父级返回(通过stdin)应用于此数据的函数的结果。

本质上,我在子进程中有一个函数,它执行以下操作:

但是,这会在等待stderr输入时完成锁定父级,所以我尝试调用:

但是,这不起作用。执行后什么都没有os.fsync。另外,当我proc.poll()在父进程中调用时,出现,子进程的返回码是1。

我能做些什么来防止这种情况发生?我应该考虑另一种方法吗?