最近、新しいサーバーで(ddを使用して)いくつかのパフォーマンステストを実行しましたが、読み取りパフォーマンスが書き込みパフォーマンスよりもはるかに悪いのはなぜですか?それは別の方法ではないでしょうか?
ファイルサイズは両方のテストで550GB、読み取り:秒単位:3704 MB /秒単位:148
書き込み:秒単位:1539 MB /秒単位:357
書き込みコマンド:
time sh -c "dd if=/dev/zero of=/local/postgresql/bigfile
bs=8k count=67108864 && sync"
読み取りコマンド:
time dd if=/local/postgresql/bigfile of=/dev/null bs=8k
bash timeコマンドの出力:
real: 61m44.335s
user: 0m12.721s
sys: 10m35.884s
Bonnie ++結果コマンド:
bonnie++ -f -D -n 0 -u root -d /local/postgresql/
結果は、RAMサイズの2倍の大きさのファイルの場合です。
書く:
419918K /秒
読んだ:
〜187 000K /秒
書き込み同期フラグを使用してパフォーマンスをテストし、実際にキャッシュではなくディスクに書き込んでいることを確認する必要があります。使用する conv=fdatasync
書き込みが終了した後、バッファの同期を強制します。詳細については、 ここ を参照してください。
time dd .... conv=fdatasync
読み取りテストの場合、テストする前にキャッシュを破棄します。
flush
echo 3 | Sudo tee /proc/sys/vm/drop_caches
time dd ....
使用したコマンドは何でしたか? dd
はveryオプションに応じてpercormanceに関連するさまざまなことを行います。
しかし、あなたが書いたものから、
大まかに言って、あなたが小さなブロックを読んでいたと思います。それはあなたがそれらを要求するとディスクから読み取られます。
そして、小さなブロックを書き込む場合、カーネルがそれを実行する時間があると感じたときにディスクに書き込まれます。dd
がそれらを書き出すときではありません。
それはすでに違いを説明しているでしょう?
dd
から意味のあるベンチマークを取得できるかどうかは非常に疑わしいです。 dd
は、さまざまなデバイス間で大規模な順次読み取りまたは大規模な順次非同期書き込みがどのように実行されるかを示しています。ワークロードが主にこれらのファイルシステム間で大きなファイルをコピーすることで構成されている限り、問題ありません。しかし、それがあなたの仕事量ではないかと思います。
最善の策は、ディスクの使用状況をプロファイリングし、実際のI/Oベンチマークスイート(リンクbonnie++
など)を使用して、さまざまなチューナブルの変更がどの程度の影響を与えるかをテストすることです。データベースの場合、ランダムな読み取りがたくさんあると思います。メインデータファイルでnoatime
を設定してdata=writeback
を実行すると(定期的なバックアップが作成されます)、これまでの情報で実行できる最善の方法です。
あなたのより大きな質問に答えるために、それは非同期書き込み(dd
によって行われたもののような)がメモリにバッファリングされてディスクにコミットされる可能性があるためです。それらは種類キューとバッファがいっぱいになる限りI/Oバウンドであり、さらにスタックする前に(ディスクにコミットすることによって)それらが再び利用可能になるのを待つ必要があります。
一方、読み取りは定義上I/Oバウンドであるため、通常、同じ非同期アクションが実行されることはありません。 read_ahead_kb
などを試して、近い将来のワークロードからの要求を見越して、より多くのシーケンシャルデータがメモリに読み込まれるようにすることができます。
これまでのところ、私たちが知っていることで答えることができるのはこれだけです。ご不明な点がございましたらお知らせください。