2011-01-25 10 views
8

私は、ログファイルを読み込み、派生した結果をディスクに書き込むのに非常に集中的なC++アプリケーション(Linuxボックスで動作しています)を開発しています。これらのアプリケーションを最適化するベストプラクティスを知りたいのですが:データ集約型のHDでの読み書きのベストプラクティスはどれですか?

  • パフォーマンスを改善するOSはどれですか?
  • IOスループットを向上させるプログラミングパターンはどれですか?
  • データを前処理していますか(バイナリに変換する、データを圧縮する、など...)役立つ措置ですか?
  • データのチャンク/バッファリングはパフォーマンスに役立ちますか?
  • どのハードウェア機能を知っておく必要がありますか?
  • これらのアプリケーションのパフォーマンスのプロファイリングと測定にはどのプラクティスが最適ですか?
  • (ここでは、私が欠けている懸念を表明)

私はこれの基本はので、私は私の問題への既存のノウハウを適応させることができ得ることができる優れた読み取りはありますか?

ありがとうございました

+0

にフラッシュするのを待ちますできるだけ少なく、それはとても遅いです。 – BlackBear

答えて

6

圧縮は確かに多くの助けとなり、OSを調整するよりはるかに簡単です。 Boost.IOStreamsライブラリのgzipbzip2のサポートを確認してください。しかし、これはプロセッサーに大きな負担をかける。

これらの種類のジョブを測定するには、timeコマンドを使用します。システム時間がユーザ時間に比べて非常に高い場合、プログラムはシステムコールを行うのに多くの時間を費やします。ウォールクロック(「本当の」)時間がシステムおよびユーザ時間に比べて高い場合、それはディスクまたはネットワークを待っている。プログラムのCPU使用率が100%を大きく下回っているtopコマンドは、I/Oボトルネックの兆候でもあります。

+0

私たちは 'zcat bigfile.gz | ourprogram'と 'ourprorogram nos

2

ボリュームの特性に一致する書き込み/読み出しのボリュームに関する情報を取得し、バッファを作成します。例えば10 * clusterSize。

バッファリングは、行う必要がある書き込みの量を最小限に抑えるように、多くのことを助けます。

3

1)ディスクのセクタサイズを確認してください。
2)ディスクがデフラグされていることを確認します。
3)キャッシュのローカリティを向上させるために行った最後の読み込みに「ローカル」なデータを読み込みます(キャッシュはオペレーティングシステムによって実行され、多くのハードドライブにもキャッシュが組み込まれています)。
4)データを連続して書き込みます。

書き込みパフォーマンスでは、セクタサイズの倍数に達するまでメモリ内のデータブロックをキャッシュし、ディスクへの非同期書き込みを開始します。データが書き込まれている(つまり、書き込みを同期する)まで、現在書き込まれているデータを上書きしないでください。ここでダブルバッファリングやトリプルバッファリングが役立ちます。

最高の読み取りパフォーマンスを得るには、バッファ読み取りを倍増させることができます。つまり、読み込み時に16Kブロックをキャッシュするとします。最初の16Kをディスクからブロック1に読み込みます。ブロック2に2番目の16Kの非同期読み取りを開始します。ブロック1で作業を開始します。ブロック1で処理を終了すると、ブロック2の読み取りを同期させ、ブロック1への非同期読み取りを開始します。第3の16Kブロックをブロック1に同期させます。第3の16Kブロックの同期を終了すると、第4の16Kのブロック2への非同期読み出しを開始し、ブロック1で動作します。すべてのデータを処理するまで、すすぎ洗いを繰り返します。

すでに述べたように、読み込む必要のあるデータが少ないほど、ディスクからの読み込みに失われます。圧縮されたデータを読み込み、読み込み時に各ブロックを展開するCPU時間を費やす価値があります。書き込み前にブロックを均等に圧縮すると、ディスクの時間が節約されます。これが勝利かどうかは、データの処理がどのようにCPUに集中しているかによって大きく左右されます。

また、ブロックの処理が非対称である(つまり、処理ブロック1が処理ブロック2の3倍の時間を要する可能性がある)場合、読み取りのために3回以上のバッファリングを考慮する。

2

ここで述べたように、ブロックのサイズを確認する必要があります。これはstatファミリー関数で行います。 struct statでは、この情報はst_blksizeフィールドにあります。

第2の機能はposix_fadvise()です。これはOSにページングについてのアドバイスを提供します。ファイル(またはファイルの断片)をどのように使用するかをシステムに指示します。マニュアルページで詳細を見つけることができます。 FILE_FLAG_SEQUENTIAL_SCANおよび/またはFILE_FLAG_NO_BUFFERINGではなく、fopenを持つWindows上で

+0

posix_fadvise()私はこれについて知りませんでした - ありがとう男! :D –

0

、のCreateFile()を使用します() - 少なくともこれを書くために、すぐに返すのではなく、データがバッファ内のデータを保持して書き込み、ディスク

関連する問題