QNX 6.5オペレーティングシステムを使用しています。 QNX 6.5はPOSIX APIをサポートしています。ハードドライブのパフォーマンスを評価するためのアプリケーションを構築しようとしています。私のアプリケーションは、カスタムデータバッファ(kBまたはMB)を開始セクタから終了セクタまで継続的にハードディスクに読み書きします。実行される操作(読み取り、書き込み、書き込み後の読み取り)は、ユーザーの選択によって異なります。タスクが実行されるたびに、アプリケーションは使用時間を追跡ClockCycles()
し、各セクターの読み取り/書き込み操作の速度を計算します。
私はopen()
デバイスファイルを開くために呼び出しを使用しています。たとえば、読み取り/書き込み操作を実行するためにAPIを使用/dev/hd0
しています。私の問題は、実際のディスクの読み書きに正しい速度が得られないことです。実際、アプリケーションはデータの読み書き速度をキャッシュに返すことがよくあります。書き込み操作の直後に読み取りを実行しようとすると、問題がより明確になります。書き込み後の読み取り動作速度は約1000〜1200 MB / Sと非常に高いですが、通常の読み取りには50〜60 MB / Sが必要です。私はとのようなオープンシンボルを使用しています。またフラグを と に変更してみました。しかし、私はこれらのフラグがアプリケーションの出力に影響を与えないことを発見しました。 Linuxには同様のフラグはありません。read()
write()
O_SYNC
O_RDWR
O_DSYNC
O_RSYNC
O_DIRECT
また、起動中にハードドライブのキャッシュを無効にしてみました。その後、データサイズに応じてMB単位の読み書き速度の精度を得ました。しかし、それにもかかわらず、書き込み直後に小さいデータサイズを読み取ると、読み取り速度は依然として非常に高いです。たとえば、DMA転送を必要とするドライバに使用されるCACHE_FLUSH
いくつかのマクロもあります。CACHE_INVALIDATE
しかし、私のアプリケーションでこれらのマクロを使用する方法がわかりません。キャッシュをバイパスし、ハードディスクの読み取り/書き込み操作を高速化する方法を教えてくれる人はいますか?私のハードドライブはフォーマットまたはフォーマットされていない可能性があります。両方のシナリオをテストしました。
答え1
HDキャッシュ
最後の段落に関して、ドライブに1〜2M未満のデータを読み書きする場合、パフォーマンスはドライブのキャッシュの影響を受けると考えられます。今日、HDのキャッシュ範囲は通常2Mから16Mです。
HDキャッシュの影響を最小限に抑える
オペレーティングシステムレベルのファイルシステムキャッシュを正常に無効にしたと仮定します。 HDキャッシュの影響を最小限に抑えるには、HDキャッシュより少なくとも2倍のデータを書き込む必要があります。
ハードディスクに2Mキャッシュがあるとします。
200kbファイルにデータを記録してテストしました。 20個(単一ファイル)を書き、最初の10個のファイルの結果を削除し、最後の10個の平均を計算します。
200kb読み取りテストには20個のファイルが必要です。内容は同じかもしれませんが、別々のファイルでなければなりません。同じ小さなファイル(<2M)を複数回読み取ると、HDキャッシュが使用されます。
同様のプログラム
あなたはそれを確認する必要がありますボニー++。 QNXでコンパイルすることもできます。