0

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

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

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

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

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

由于没有函数 as smart_fsync()。什么是可能的解决方法?

4

1 回答 1

3

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

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

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

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

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

于 2012-10-04T06:33:11.043 回答