書き込み速度が大幅に異なる2つのノード(それぞれ3つの専用データドライブ)があります。それらの「hdparm」出力は同じように見え、「hdparm -t -T」出力は同等ですが、マウントされたファイルシステムで「dd」コマンドを実行すると、書き込み速度が大幅に異なります。 'dd'を使用して読み取り速度を再度テストすると、同様の結果が得られます。
サーバーとハードドライブはまったく同じモデルであり、どちらも同じソフトウェアパッケージを実行しています(chefを使用してクラスターにパッケージをプッシュします)。
パフォーマンスの不一致を整理するのに役立つ、チェックするパラメーターや実行するその他のテストのアイデアを探しています。 OS/FSレベルにあるように見えますが、他に何を見るべきかわかりません。マウントされたファイルシステムは両方とも、noatimeとuser_xattrが有効になっているEXT4です。
高速サーバー:
hdparm -t -T
出力:
/dev/sdb1:
Timing cached reads: 2138 MB in 2.00 seconds = 1070.08 MB/sec
Timing buffered disk reads: 232 MB in 3.02 seconds = 76.84 MB/sec
4GBのテストファイルを書き出す
$ dd bs=4K if=/dev/zero of=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 40.1102 s, 107 MB/s
0.20user 10.91system 0:40.14elapsed 27%CPU (0avgtext+0avgdata 3472maxresident)k
16inputs+8388608outputs (1major+263minor)pagefaults 0swaps
そのファイルをディスクから(および/ dev/nullに)読み取る
$ dd bs=4K of=/dev/null if=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 53.3914 s, 80.4 MB/s
0.19user 5.80system 0:53.53elapsed 11%CPU (0avgtext+0avgdata 3488maxresident)k
8389872inputs+0outputs (2major+264minor)pagefaults 0swaps
遅いノード:
hdparm -t -T
出力
/dev/sdc1:
Timing cached reads: 1982 MB in 2.00 seconds = 991.27 MB/sec
Timing buffered disk reads: 224 MB in 3.02 seconds = 74.16 MB/sec
$ dd bs=4K if=/dev/zero of=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 98.1583 s, 43.8 MB/s
0.35user 17.58system 1:38.17elapsed 18%CPU (0avgtext+0avgdata 3456maxresident)k
8inputs+8388608outputs (0major+263minor)pagefaults 0swaps
$ dd bs=4k of=/dev/null if=/mnt/vol1/test.file count=1M
1048576+0 records in
1048576+0 records out
4294967296 bytes (4.3 GB) copied, 54.7789 s, 78.4 MB/s
0.25user 10.84system 0:54.92elapsed 20%CPU (0avgtext+0avgdata 3488maxresident)k
8389864inputs+0outputs (2major+263minor)pagefaults 0swaps
試してみてください
hdparm -i -I /dev/sda
ドライブとdiffの両方の出力について、どちらかで異なるdmaまたは先読み設定があるかどうかが表示されます。
ディストリビューションによっては、hdparm設定を配置して同じであることを確認する場所があるはずです。
ケーブルも再確認します。 1台のドライブが悪いだけかもしれません。スマートECCレートなどを確認することをお勧めします。
/usr/sbin/smartctl -A -H /dev/sda
/usr/sbin/smartctl -a /dev/sda
ドライブのスマートチェックに使用するものです。
たぶんディスクが悪いです。エラーをチェックします。 (また、出力を調べて、それらが実際に同じであるかどうかを確認します:モデル、ファームウェア、サイズ、およびセクターサイズ)
smartctl -a/dev/sdb smartctl -a/dev/sdc
エラーがある場合は、短いテストを実行します(2分かかります)。
smartctl -t short/dev/sdb
テストがエラーなしで合格した場合は、「短い」ではなく「長い」で再実行します(数時間かかります)。
そして、それが完了したら、もう一度「-a」で確認し、そのセクターのディスクにゼロを書き込んで再配置します(これにより、データが破壊されます。of=に入力する内容は、で上書きされるため、十分に注意してください。ゼロの生レベル)。
例えば。セクターサイズが512で、LBA 555が不良の場合は、このコマンドを入力します(データを破棄します!)
dd if =/dev/zero of =/dev/sdb bs = 512 count = 1 seek = 555
私はより多くのカウントを行うので、不良セクタは通常互いに隣接しているため、テストとゼロの書き込みを頻繁に繰り返す必要はありません。 (はるかに多くのデータを破壊します!)
dd if =/dev/zero of =/dev/sdb bs = 512 count = 500 seek = 555
たぶんあなたの配置が間違っています。すべてのパーティションが63以降で開始することを確認し、論理セクターサイズが物理セクターサイズよりも小さい場合は、配置が物理サイズ/論理サイズで割り切れることを確認してください。これは書き込み速度に大きく影響するはずですが、読み取り速度はあまり変更しないか、まったく変更しません。
例えば。物理が4096で論理が512の場合、開始セクターは8(4096/512)で割り切れる必要があります。また、一部のディスクでは、開始が63よりはるかに大きい必要があります。これらのディスクでは、最初のパーティションの開始として252を使用します。
また、SSDを使用している場合は、消去ブロックにも揃える必要があります。調整するのに安全な数は、129024の倍数です(古いディスクの63要件、4096バイトセクター[ほとんどのSeagateおよびWD Greenディスクなどの高度なフォーマットディスク]、ほとんどのSSDで1024 MB、まれなSSDで2048 MB )
SSDでも、遅いと思われる場合は、使用する前にベンダー提供のツールで消去するか、TRIMを使用する必要があります。
適切なベンチマークを使用します。
Conv = fdatasyncまたは別のメソッドを使用しない限り、ddを使用して書き込みテストを実行することはできません。 David Schwartzは、「time dd ...」の使用を提案しましたが、conv = fdatasyncを使用すると、自分で再計算しなくても、ddの正しい時間と速度がわかります。 RAMまたは書き込みキャッシュがたくさんある場合、conv = fdatasyncのようなオプションを使用しないと、RAMプラスディスクを測定します。 http://romanrm.ru/en/dd-benchmark
例えば。
dd bs = 4K if =/dev/zero of =/mnt/vol1/test.file count = 1M conv = fdatasync
適切なベンチマークを使用します。 (パート2)
多くのファイルシステムまたはディスクは、ゼロを書き込むときに非常に異なるパフォーマンスを示します。最良の結果を得るには、ランダムファイルを使用する必要があります。
例えば。
rAMへの最初のコピー
cp /somewhere/with/big/files/bigfile.iso/dev/shm
テストを実行する
dd bs = 4K if =/dev/shm/bigfile.iso of =/mnt/vol1/test.file count = 1M conv = fdatasync
または
ランダムファイルを準備する
dd if =/dev/random of =/dev/shm/randfile bs = 1M count = 500
テストを実行する
dd bs = 4K if =/dev/shm/randfile of =/mnt/vol1/test.file count = 1M conv = fdatasync
また、ディスクが実際には同じでない場合、またはファイルシステムが異なる場合、4kブロックサイズではパフォーマンスが大きく異なります。 128kと1Mもテストします。