QNX6.5オペレーティングシステムに取り組んでいます。 QNX6.5はPOSIXAPIをサポートします。ハードディスクのパフォーマンスを評価するために使用されるアプリケーションを構築しようとしています。私のアプリケーションは、kBまたはMB単位のサイズのユーザー定義データバッファーを開始セクターから終了セクターまでハードディスクに連続的に書き込んだ後、読み取り/書き込み/読み取りを行います。実行される操作(読み取り、書き込み、書き込み後の読み取り)は、ユーザーの選択によって異なります。操作が実行されるたびに、アプリケーションはClockCycles()
を使用して時間を追跡し、各セクターの読み取り/書き込み操作の速度も計算します。
open()
呼び出しを使用して、_/dev/hd0
_のようなデバイスファイルを開きます。 read()
、write()
APIを使用して読み取り/書き込み操作を実行しています。私の問題は、実際のディスクの読み取り/書き込みの正しい速度が得られないことです。実際、アプリケーションはデータの読み取り/書き込み速度をキャッシュに頻繁に返しています。書き込み操作の直後に読み取りを実行しようとすると、問題がより明確になります。書き込み操作直後の読み取り操作の速度は、1000〜1200 MB/Sのオーダーの非常に高速です。一方、通常の読み取りには50〜60 MB/Sかかります。 _O_SYNC
_や_O_RDWR
_などのオープンフラグを使用しています。また、フラグを_O_DSYNC
_および_O_RSYNC
_に変更しようとしました。しかし、フラグはアプリケーションの出力に影響を与えないことがわかりました。 Linuxのように_O_DIRECT
_に相当するフラグはありません。
また、起動時にハードディスクドライバのキャッシュを無効にしようとしました。次に、MBのオーダーのデータサイズの読み取り/書き込み速度の精度が得られました。しかし、それでも、即時書き込みの後に小さいデータサイズが読み取られると、読み取り速度は再び非常に速くなります。 DMA転送が必要なドライバーで使用するための_CACHE_FLUSH
_、_CACHE_INVALIDATE
_などのマクロもいくつか見ました。しかし、これらのマクロをアプリケーションで使用する方法がわかりません。 。キャッシュをバイパスして、ハードディスクへの読み取り/書き込み操作の速度を上げる方法を誰かに教えてもらえますか?私のハードディスクはフォーマット済みまたはフォーマットなしのどちらでもかまいません。両方のケースでテストしました。
最後の段落に関して、ドライブへの読み取り/書き込みが1〜2M未満の場合、パフォーマンスはドライブ上のキャッシュの影響を受けると思います。これは、現在のHDでは通常2M〜16Mの範囲です。
OSレベルのファイルシステムキャッシュを正常に無効にしたと仮定します。 HDキャッシュの影響を最小限に抑えるには、HDキャッシュの少なくとも2倍のデータを書き込む必要があります。
HDに2Mのキャッシュがあると仮定します。
200kbファイルのデータ書き込みでテストします。それらのうち20個(個別ファイル)を書き込み、最初の10個のファイルの結果を破棄し、最後の10個を平均します。
200kbの読み取りテストの場合、20個のファイルが必要になります。内容は同じでもかまいませんが、個別のファイルである必要があります。同じ小さなファイル(<2M)を何度も読み取ると、HDキャッシュが使用されます。
あなたはチェックアウトする必要があります Bonnie ++ 。 QNXでコンパイルできる場合があります。