web-dev-qa-db-ja.com

2台のハードドライブ:同じスペック、異なる速度。構成の問題を見つける必要があります

書き込み速度が大幅に異なる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
4
Buck

試してみてください

hdparm -i -I /dev/sda

ドライブとdiffの両方の出力について、どちらかで異なるdmaまたは先読み設定があるかどうかが表示されます。

ディストリビューションによっては、hdparm設定を配置して同じであることを確認する場所があるはずです。

ケーブルも再確認します。 1台のドライブが悪いだけかもしれません。スマートECCレートなどを確認することをお勧めします。

/usr/sbin/smartctl -A -H /dev/sda
/usr/sbin/smartctl -a /dev/sda

ドライブのスマートチェックに使用するものです。

1
RLZaleski
  1. たぶんディスクが悪いです。エラーをチェックします。 (また、出力を調べて、それらが実際に同じであるかどうかを確認します:モデル、ファームウェア、サイズ、およびセクターサイズ)

    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

  2. たぶんあなたの配置が間違っています。すべてのパーティションが63以降で開始することを確認し、論理セクターサイズが物理セクターサイズよりも小さい場合は、配置が物理サイズ/論理サイズで割り切れることを確認してください。これは書き込み速度に大きく影響するはずですが、読み取り速度はあまり変更しないか、まったく変更しません。

    例えば。物理が4096で論理が512の場合、開始セクターは8(4096/512)で割り切れる必要があります。また、一部のディスクでは、開始が63よりはるかに大きい必要があります。これらのディスクでは、最初のパーティションの開始として252を使用します。

    また、SSDを使用している場合は、消去ブロックにも揃える必要があります。調整するのに安全な数は、129024の倍数です(古いディスクの63要件、4096バイトセクター[ほとんどのSeagateおよびWD Greenディスクなどの高度なフォーマットディスク]、ほとんどのSSDで1024 MB、まれなSSDで2048 MB )

    SSDでも、遅いと思われる場合は、使用する前にベンダー提供のツールで消去するか、TRIMを使用する必要があります。

  3. 適切なベンチマークを使用します。

    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

  4. 適切なベンチマークを使用します。 (パート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

  5. また、ディスクが実際には同じでない場合、またはファイルシステムが異なる場合、4kブロックサイズではパフォーマンスが大きく異なります。 128kと1Mもテストします。

0
Peter