2016-10-01 40 views
2

我正在使用4.4.12-rt19 RTLinux內核補丁。如何在實時Linux應用程序中記錄數據?

我有寫在C,其具有在數據取從網絡中,計算分離芯上的數據,然後把結果存入運行單獨的處理的實時應用。我正在嘗試登錄每個ms數據記錄10KB的順序。

測井過程可以訪問所有在共享存儲器中的輸入數據的。現在,我正在使用sqlite3和sqlite3async將數據庫緩存到記錄過程的一個線程中的內存中,然後通過調用sqlite3async_run()將內存中的實例提交到文件中。

問題是在部分sqlite3async_run()執行期間,寫入內存數據庫緩衝區的sqlite3_step()命令掛起並違反了我的1ms時間保證。

我不知道如果錯誤是因爲線程進程中,因爲如何sqlite3async作品的實時環境或工作方式發生。據我所知,sqlite3async應該能夠使用sqlite3虛擬文件系統在內存中緩衝數據庫,然後用後臺線程處理實際的文件寫入(詳見here)。我試圖改變每個線程的調度優先級和好處無濟於事。

任何幫助或建議將不勝感激!

回答

1

使用sqlite3async不會刪除與寫作相關的延遲;它只是把它們推遲到以後,當你可以負擔得起的時候。

考慮使用WAL模式。在那裏,執行checkpoint時的延遲時間相同,但WAL存儲在磁盤上,因此您可以將檢查點推遲任意長時間而不會耗盡內存(代價是WAL變得任意大)。

如果書面WAL模式仍然太慢,你必須實現自己的FIFO,並讓另一個線程連續爲空的。 (如果這個線程實際寫之前移動數據從FIFO中,FIFO是永遠不會被鎖定很長一段時間。)

+0

WAL模式似乎過於緩慢,所以我設置日誌模式MEMORY這是速度不夠快。我的應用程序沒有問題,沒有將日誌寫入每次提交時的文件。謝謝您的幫助! – Sabar

相關問題