【问题标题】:linux: smart fsync()?linux:智能 fsync()?
【发布时间】:2012-09-27 06:33:59
【问题描述】:

我正在录制音频并将其写入 SD 卡,数据速率约为 1.5 MB/s。我正在使用带有 ext4 文件系统的 4 类 SD 卡。

在一定的时间间隔后,内核会自动同步文件。这样做的缺点是,我的应用程序缓冲区堆积起来等待写入磁盘。

我认为,如果内核经常同步它现在正在做的事情,它可能会解决问题。

我在应用程序中使用fsync() 在一定间隔后进行同步。但这并不能解决问题,因为在调用 fsync() 的应用程序之前内核已经同步了某些时间,所以从应用程序调用 fsync() 是浪费时间。

我需要一个同步机制(例如,smart_fsync()),这样当应用程序调用 smart_fsync() 时,内核将仅在一段时间未同步时才会同步,否则它将返回。

由于没有smart_fsync() 的功能。有什么可能的解决方法?

【问题讨论】:

  • 如果你没有超过文件缓冲区,我真的不相信内核会同步任何东西。通过手动同步(并且经常同步),您可以减少每次同步的时间,但总体而言 - 花费的时间几乎保持不变。您也可以使用非阻塞 i/o 或编写线程,但这会有点棘手。顺便说一句,4 类的 1.5Mb 相当低。禁用 FS 日志可能会有所帮助。

标签: linux sd-card fsync


【解决方案1】:

要问的第一个问题是,您遇到的问题到底是什么? 内核会定期刷新脏(未写入缓存)缓冲区 - 这是因为这样做往往比刷新更快同步(减少应用程序的延迟)。不利的一面是,如果您达到内核对脏数据的限制,这意味着更大的延迟会受到影响(并且在不正常关机后可能会丢失更多的数据)。

如果您想确保数据尽快到达磁盘,那么您只需使用O_SYNC 选项打开文件。这将在write() 时立即将数据刷新到磁盘。当然,这意味着显着的性能损失,但另一方面,您可以完全控制何时刷新数据。

如果在同步进行时吞吐量下降,很可能是因为您尝试写入的速度超过了磁盘的支持速度,并且达到了脏页内存限制。不幸的是,这意味着硬件根本达不到你试图推动它的写入速率——你需要写得更慢,或者在更快的媒体上缓冲数据(或者添加更多的 RAM!)。

还请注意,您的“智能 fsync”正是内核实现的 - 当以下情况之一为真时,它将刷新页面: * 内存中有太多脏数据。当脏数据总量超过/proc/sys/vm/dirty_background_bytes,或者总内存百分比超过/proc/sys/vm/dirty_background_ratio时异步触发(不阻塞写入)。当数据总量超过/proc/sys/vm/dirty_bytes,或者总内存的百分比超过/proc/sys/vm/dirty_ratio时同步触发(长时间阻塞你的应用程序的write())。 * 脏数据在内存中的等待时间过长。 pdflush 守护进程每/proc/sys/vm/dirty_writeback_centisecs 厘秒(1/100 秒)检查旧的脏块,如果块在内存中的时间超过/proc/sys/vm/dirty_expire_centisecs,则它们将过期。

调整这些参数可能会有所帮助,但您最好弄清楚为什么默认值不能保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2013-08-19
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多