我正在录制音频和写入SD卡,数据速率约为1.5MB/s,我使用的是带有ext4文件系统的4级SD卡。
在一定的时间间隔后,内核自动同步文件。这样做的缺点是,我的应用程序缓冲区堆积如山,等待写入磁盘。
我认为,如果内核经常同步它现在正在做的事情,它可能会解决这个问题。
我在应用程序中使用fsync()在特定间隔后进行同步。但是这并不能解决这个问题,因为内核在应用程序名为fsync()之前进行了同步,所以从应用程序调用的fsync()是浪费时间。
我需要一个同步机制(例如,smart_fsync() ),以便当应用程序调用smart_fsync()时,内核只有在有一段时间没有同步的情况下才会同步,否则它就会返回。
因为没有作为smart_fsync()的函数。什么是可能的解决办法?
发布于 2012-10-04 06:33:11
首先要问的是,你到底遇到了什么问题?内核将周期性地刷新脏的(未写的缓存)缓冲区--这是因为这样做比同步刷新更快(应用程序的延迟较少)。缺点是,如果达到内核对脏数据的限制(以及在不干净的关闭之后可能会有更多的数据丢失),这意味着延迟会更大。
如果希望确保数据尽快到达磁盘,则只需使用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时,同步触发(阻塞应用程序的/proc/sys/vm/dirty_bytes延长一段时间)。*污秽数据已在内存中待了太久。pdflush守护进程每隔1/100秒检查一次旧的脏块,如果它们在内存中的时间比/proc/sys/vm/dirty_expire_centisecs长,就会过期。
调优这些参数可能会有所帮助,但您最好弄清楚为什么缺省值不能保持原样。
https://stackoverflow.com/questions/12615444
复制相似问题