私は8ドライブのRAID10セットアップをAdaptec5805Zに接続し、Centos5.5と期限スケジューラーを実行しています。
基本的なdd
読み取りテストは400mb /秒を示し、基本的なdd
書き込みテストはほぼ同じことを示します。
2つを同時に実行すると、読み取り速度が約5mb /秒に低下し、書き込み速度はほぼ同じ400mb /秒のままになります。予想どおり、iostat -x
の出力は、ディスクが書き込みで攻撃されている間、実行されている読み取りトランザクションが非常に少ないことを示しています。
コントローラのライトバックキャッシュをオフにすると、50:50の分割は表示されませんが、読み取りが100mb/s、書き込みが300mb/s程度という顕著な改善が見られます。ドライブのキューのnr_requests設定を下げると(約8が最適と思われる)、150mb /秒の読み取りと150mb /秒の書き込みになる可能性があることもわかりました。すなわち。総スループットの低下ですが、確かに私のワークロードにより適しています。
これは本当の現象ですか?それとも、私の合成テストは単純すぎますか?
これが発生する理由は十分に明らかです。スケジューラーが読み取りから書き込みに切り替えると、書き込み要求のヒープを実行できます。これらはすべてコントローラーのキャッシュに格納されるだけですが、ある時点で実行する必要があるためです。実際のディスク書き込みは、スケジューラーが読み取りの実行を再試行し始めたときに発生していると思います。その結果、実行される読み取り要求はほとんどありません。
これは合理的な説明のように思われますが、重要な書き込み負荷のあるシステムでライトバックキャッシュを使用することには大きな欠点のようにも思われます。私は午後中ずっと議論を探していましたが、何も見つかりませんでした。何が足りないのですか?
基本的なddは、ドライブのスループットを測定するための最良の方法ではない可能性があります。現実的な負荷ではありません。ただし、dd
を実行する場合は、ファイルシステムキャッシュの影響を排除するために、コマンドラインでoflag=direct
フラグを渡してください。ワークロードの測定方法の提案については、 ディスクスループットの測定方法? も参照してください。
スケジューラーの選択は、他の何よりも結果に大きな影響を与えていると思います。バッテリーまたはフラッシュバックキャッシュ(書き込みキャッシュ)を備えたRAIDコントローラーの場合、以前はdeadline
スケジューラーで実行していましたが、キャッシュが512MBまたは1GBの場合は、noop
スケジューラーを使用するようになりました。スケジューラーはその場で交換できるので、noop
アルゴリズムとoflag=direct
を使用してテストを試して、結果がどのように表示されるかを確認してください。
bonnie++
またはiozone
を実行しましたか?
iozone
の使用を計画している場合は、パフォーマンスを確認するいくつかの方法があります。これらは、探している種類のテストを可能にするため、dd
よりも優れています。
iozone -s 4G -a -i 0 -i 1 -i 2
これにより、可変レコードサイズを使用して4GBデータセット(-s 4G
)でテストが実行され、書き込みテスト(-i 0
)、読み取りテスト(-i 1
)、およびランダムが実行されます。読み取り/書き込みテスト(-i 2
)。ファイルサイズの選択は重要です。 RAMに適合するものを選択すると、結果は実際のストレージパフォーマンスよりもファイルキャッシュに基づいて計算されます。したがって、4 GBのRAMを搭載したサーバーがある場合は、それよりも大きいファイルサイズでテストしてください。 。
ただし、わいせつな量のRAM(12GBのサーバーが1つあります))があり、テストを数時間以内に終了させたい場合は、-I
オプションを指定できます。 iozoneを使用してO_DIRECTを設定し、ファイルシステムキャッシュをバイパスします。そこで真のストレージサブシステムのパフォーマンスが得られます。
同時アクセスをチェックするテストを実行することもできます。
iozone -s 128M -r 4k -t 32 -i 0 -i 1 -i 2
これにより、前のコマンドと同じテストを実行する32の同時128MBスレッドが実行されますが、レコードサイズは4K(-r 4k
)です。ワーキングセットは4GBですが、一部のファイルはファイルキャッシュに収まります。このストレージで何をしているかによっては、これは予想されるパフォーマンスのより正確なテストになる場合があります。以前と同様に、-I
パラメーターはO_DIRECTを設定します。
iozone -s 128M -r 4k -l 16 -u 32 -i 0 -i 1 -i 2
これは上記のコマンドと同じですが、16スレッドから始まり、32スレッドまで増加する一連のテストを実行します。