2016-10-01 7 views
2

私は4.4.12-rt19 RTLinuxカーネルパッチを扱っています。リアルタイムLinuxアプリケーションでデータを記録する方法は?

私は、ネットワークからデータを取り込み、そのデータを計算し、結果を記録する別々のコアで動作する別々のプロセスを持つ、Cで書かれたリアルタイムアプリケーションを持っています。私は、データのmsティックごとに10KBのオーダーをファイルに記録しようとしています。

ロギングプロセスは、共有メモリ内のすべての着信データにアクセスできます。今は、sqlite3とsqlite3asyncを使用して、データベースをロギングプロセスの1つのスレッドのメモリにバッファリングし、sqlite3async_run()の呼び出しで1秒ごとにファイルにメモリ内インスタンスをコミットします。

sqlite3async_run()の実行中に、メモリ内のデータベースバッファに書き込むsqlite3_step()コマンドがハングし、1msのタイミング保証に違反するという問題があります。

リアルタイムプロセス環境でスレッドプロセスがどのように動作するのか、sqlite3asyncがどのように動作するのかによってエラーが発生するのかどうかはわかりません。 sqlite3asyncは、sqlite3仮想ファイルシステムを使用してメモリ内のデータベースをバッファし、実際のファイル書き込みをバックグラウンドスレッド(詳細はhere)で処理できるようになっています。私はスケジューリングの優先順位と各スレッドのニーネスを無駄に変更しようとしました。

ご意見やご提案は大変ありがとうございます。

答えて

1

sqlite3asyncを使用すると、書き込みに伴う遅延はなくなりません。あなたがそれらを買う余裕があるときに、それが後になるまでそれを守ります。

WALモードの使用を検討してください。 checkpointを実行しても同じ遅延がありますが、WALはディスクに保存されていますので、メモリを使い果たすことなく任意の長時間チェックポイントを延期することができます(WALが任意に大きくなる)。

WALモードでの書き込みがまだ遅すぎる場合は、独自のFIFOを実装し、別のスレッドで連続して空にする必要があります。 (実際に書き込む前にそのスレッドがFIFOからデータを移動すると、FIFOは決して長い間ロックされません。)

+0

WALモードは遅すぎると思われたので、ジャーナリングモードをMEMORYに設定しました。ジャーナルがコミットごとにファイルに書き込まれることなく、私のアプリケーションは問題ありません。助けてくれてありがとう! – Sabar

関連する問題