0

オーディオを録音して SD カードに書き込んでいます。データ レートは約 1.5 MB/s です。ext4 ファイル システムのクラス 4 SD カードを使用しています。

一定の間隔の後、カーネルはファイルを自動同期します。これの欠点は、アプリケーションのバッファがディスクに書き込まれるのを待って山積みになることです。

カーネルが現在行っていることを頻繁に同期すると、問題が解決する可能性があると思います。

fsync()特定の間隔で同期するためにアプリケーションで使用しました。しかし、これでは問題は解決しません。アプリケーションが を呼び出す直前にカーネルが同期している場合があるfsync()ため、アプリケーションから fsync() を呼び出すのは時間の無駄でした。

smart_fsync()アプリケーションが smart_fsync() を呼び出すと、しばらく同期していない場合にのみカーネルが同期し、それ以外の場合は単に戻るように、同期メカニズム (たとえば、) が必要です。

としての機能はありませんのでsmart_fsync()。可能な回避策は何ですか?

4

1 に答える 1

3

最初に尋ねる質問は、あなたが経験している問題は正確には何ですか? カーネルはダーティ (未書き込みのキャッシュ) バッファーを定期的にフラッシュします。これは、同期的にフラッシュするよりも高速になる傾向があるためです (アプリケーションのレイテンシーヒットが少なくなります)。欠点は、ダーティ データに対するカーネルの制限に達した場合に、レイテンシ ヒットが大きくなることを意味することです (また、クリーンでないシャットダウンの後により多くのデータ損失が発生する可能性があります)。

データができるだけ早くディスクにヒットするようにしたい場合は、O_SYNCオプションを使用してファイルを開くだけです。これにより、すぐにデータがディスクにフラッシュされますwrite()。もちろん、これはパフォーマンスが大幅に低下することを意味しますが、一方で、データがフラッシュされるタイミングを完全に制御できます。

同期中にスループットが低下する場合は、ディスクがサポートできる速度よりも速く書き込もうとしており、ダーティ ページ メモリの制限に達している可能性があります。残念ながら、これは、ハードウェアがプッシュしようとしている書き込み速度に達していないことを意味します.書き込み速度を遅くするか、より高速なメディアにデータをバッファリングする必要があります(またはRAMを追加してください!)。

また、'smart 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 に答える