2012-09-27 27 views
0

我正在錄製音頻並將其寫入SD卡,數據速率約爲1.5 MB/s。我正在使用帶有ext4文件系統的Class 4 SD卡。linux:smart fsync()?

經過一定的時間間隔後,內核自動同步文件。這樣做的缺點是,我的應用程序緩衝區堆積如山,等待寫入磁盤。

我認爲,如果內核頻繁同步的是它現在正在做,它可能解決問題。

我在應用程序中使用fsync()一定間隔後進行同步。但是這並不能解決問題,因爲在應用程序調用fsync()之前內核已經同步了一段時間,所以從應用程序調用的fsync()是浪費時間。

我需要一個同步機制(比如說,smart_fsync()),這樣當應用程序調用smart_fsync()時,內核只會在同步時才同步,否則它會返回。

由於smart_fsync()沒有功能。什麼可能是一種可能的解決方法?

+0

我真的不相信內核會同步任何東西,如果你沒有超過文件緩衝區。通過手動同步(並且經常),您可以減少每次同步的時間,但總體而言 - 所花費的時間將保持幾乎相同。你也可以使用非阻塞I/O或寫入線程,但它會有點棘手。順便說一句,對於4級1.5Mb是相當低的。禁用FS日誌可能會有所幫助。 – keltar

回答

3

的第一個問題要問的是,究竟是什麼您遇到的問題?內核將定期刷新髒(未寫入的緩存)緩衝區 - 這是因爲這樣做往往比同步刷新更快(應用程序的延遲更少)。不足之處在於,如果達到內核對髒數據的限制(並且在不正常關閉後可能會丟失更多數據),這意味着延遲更大。

如果你想確保數據命中磁盤儘快,那麼你應該簡單地打開與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,將會過期。

這有可能是調整這些參數可能會有點幫助,但你可能關閉弄清楚爲什麼默認跟不上的更好。

相關問題