5

SDカードに一定の速度でjpeg画像を書き込む小さなアプリケーションを書いています。EXT3 ファイルシステムを選択しましたが、EXT2 ファイルシステムでも同じ動作が観察されました。

私の書き込みループは次のようになります。

get_image()
fwrite()
fsync()

またはこのように:

get_image()
fopen() 
fwrite()
fsync()
fclose()

また、いくつかのタイミング統計を表示すると、プログラムが数秒間ブロックされていることがわかります。受信画像を fifo に保持すると、そのようなストールの後に短時間で多くの画像を書き込むため、平均レートはまだ良好です。OSの問題なのかSDカード自体の問題なのか分かりますか?どうすればリアルタイムに近づくことができますか? 強力なリアルタイムは必要ありませんが、数秒間停止することは受け入れられません。

ある程度の精度:はい、すべてのファイルの後にfsyncする必要があります。これは、イメージをユーザーまたはカーネルバッファーではなくディスクに配置したいためです。fsync を使用しないと、スルー出力が大幅に改善されますが、それでも許容できないほどのストールが発生します。最初のストールは 50M バイトが書き込まれた後に発生するため、バッファの問題ではないと思います。また、man ページによると、fsync は正確にここにあり、データがバッファリングされていないことを確認します。

平均書き込み速度に関する精度 : 使用しているカードで維持できる速度で書き込みを行っています。fsync が完了するのを待っている間に着信イメージをパイルすると、この失速後に書き込み転送速度が上昇し、すぐに平均速度に戻ります。平均転送速度は約 1.4 MBytes/s です。

システムは、ストックキー(2.6.24.19)を備えたubuntu 8.04を実行する最新のラップトップです

4

7 に答える 7

4

でファイルを開き、O_DIRECTアプリケーション レベルでキャッシュを実行してみてください。

STB Box に PVR (Personal Video Record) 機能を実装していたときに、同様の問題に遭遇しました。O_DIRECTトリックは私たちのニーズを最終的に満たしました.(* )

なしO_DIRECT。のデータは、write()まずカーネル バッファにキャッシュされ、呼び出しfsync時またはカーネル キャッシュ バッファがいっぱいになったときにメディアにフラッシュされます (**)。

.ThO_DIRECTカーネルを使用すると、syscall にパラメーターとして渡されたユーザー空間バッファーが指す物理メモリーに直接 DMA を実行しますwrite。そのため、ユーザー空間メモリとカーネル キャッシュ間のコピーに CPU とメモリ帯域幅が費やされることはなく、キャッシュの管理 (キャッシュ ルックアップ、ページごとのロックなど) でカーネルで費やされる CPU 時間もありません。 (ここからコピペ)

問題を解決できるかどうかはわかりませんが、試してみてください。

*Linus の批判にもかかわらずそれO_DIRECTは私たちの問題を解決しました。

O_DSYNC**またはでファイルを開かなかったとします。O_SYNC

于 2010-01-20T02:09:38.760 に答える
3

fsync()すべてのファイルの後にする必要がありますか?エンキューされたすべてのイメージをSDカードに書き出すのが適切な時期をOSに決定させるほうが幸運かもしれません(すべてのイメージに対して発生するのではなく、多くのイメージに対してSDカードファイルシステムを操作するための起動コストを償却します)。

プラットフォームについてもう少し詳しく教えていただけますか?遅いI/O時間は、システム上の他のプロセス、遅いI/Oコントローラーなどに関係している可能性があります。

また、フラッシュメモリの動作により適したファイルシステムの使用を検討することもできます。FAT32はより一般的ですextNが、SD用に特別に構築されたファイルシステムも適切な場合があります。 JFFSはこの良い例です。(磁気メディアを回転させるのではなく)フラッシュ用に設計されたファイルシステムを使用すると、おそらくパフォーマンスが向上し、ウェアレベリング(したがってデバイスの寿命/信頼性)特性も向上します。

于 2008-10-10T16:18:14.623 に答える
2

私の知る限り、一部のフラッシュディスクは書き込みパフォーマンスが非常に悪いです(特に安価なブランド)。では、アプリケーションの書き込み速度 (fsync に必要な時間を含む) を測定すると、何が得られるでしょうか? ハードウェアのパフォーマンスが向上しないという理由だけで、1 秒あたり数メガバイト程度になる可能性があります。

また、1 つの大きなブロックではなく、多数の小さなブロックを書き込むと、明らかに書き込みが大幅に遅くなる可能性があります (フラッシュ ディスクは、悪いケースでは 1 秒あたり約 10 回の書き込みしかできない場合があります)。これはおそらくカーネル バッファによって軽減できるものなので、fsync を頻繁に使用すると書き込みが遅くなる可能性があります...

ところで。FAT32 での書き込みパフォーマンスを測定しましたか? ほぼ同じだと思いますが、そうでない場合は、まだ最適化が利用できるのでしょうか?

于 2008-10-13T20:34:05.603 に答える
1

私はこの分野についてあまり知識がありませんが、あなたが説明する症状は、バッファがいっぱいになるようなものです。ファイルライターまたはSDカード自体と通信しているI/Oデバイスのバッファーがいっぱいになっている可能性があります。次に、実際にデータがカードに書き込まれるまで(つまり、バッファが空になるまで)待ってから、さらに書き込む必要があります。SDカードは特に高速なライターではありません。これらの一時停止中にデータが実際にカードに書き込まれているかどうかを確認する方法を見つけることができれば、それは私の理論を検証するでしょう。一部のカードリーダーには、データにアクセスしているときに点滅するLEDがあります。これはおそらく良い指標になります。

ちょっとした予感...塩と一緒に飲んでください:)

于 2008-10-10T16:17:23.533 に答える
1

これが役立つかもしれません-ファイルシステムのベンチマーク

...多くのディストリビューションがこのファイルシステムをデフォルトのファイルシステムとして使用しているため、ext3 が全体的にどれほど遅いかには非常に驚きました...

そして「ext3 fsync バッチ処理」 :

...このパッチは、トランザクションをディスクにコミットするのにかかる時間を測定し、基になるディスクの速度に基づいてスリープします。

于 2009-01-12T02:16:55.643 に答える
0

これを読んで 2.6.28 以上のカーネルを使用している場合は、ext3 の代わりに ext4 を使用することをお勧めします。これは、パフォーマンスを向上させるために調整できるファイルシステムです。最高のパフォーマンスは、データがジャーナル処理されない data=writeback モードで得られます。https://www.kernel.org/doc/Documentation/filesystems/ext4.txtのData Modeセクションを読んでください。

たとえば、パーティションがすでに作成されている場合、/dev/sdb1ジャーナリングなしで ext4 でフォーマットするために使用できるいくつかの手順を次に示します。

mkfs.ext4 /dev/sdb1 -L jp  # Creates the ext4 filesystem
tune2fs -o journal_data_writeback /dev/sdb1 # Set to writeback mode
tune2fs -O ^has_journal /dev/sdb1 # Disable journaling
sudo e2fsck -f /dev/sdb1 # Filesystem check is required

次に、対応するフラグを使用して、このパーティションをマウントします (または、/etc/fstab何をしているのかわかっている場合はエントリを設定します)。

mount -t ext4 -O noatime,nodirame,data=writeback /dev/mmcblk0p1 /mnt/sd

ext3 から最適化された ext4 ファイルシステムへの移行は、劇的な違いになるはずです。そしてもちろん、SD カードの速度が速ければ、それが役立つはずです (つまり、クラス 10)。

https://developer.ridgerun.com/wiki/index.php/High_performance_SD_card_tuning_using_the_EXT4_file_systemも参照してください

于 2014-02-13T22:26:44.373 に答える
-1

SDカードも検討するかもしれませんが、それはNORですか、それともNANDですか? このページでは、SD カード間の大きさの順序を示しています (2M/s 対 20M/s)。
http://www.robgalbraith.com/bins/camera_multi_page.asp?cid=6007-9597
ZFS はフラッシュ メモリ用に最適化されていると思います。

于 2009-02-12T20:30:41.330 に答える