装着したディスクの問題を先に確認する。まずはディスクのブロックサイズを確認。
# fdisk -l /dev/sde Disk /dev/sde: 372.6 GiB, 400088457216 bytes, 781422768 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes # cat /sys/block/sde/queue/physical_block_size 512 # cat /sys/block/sde/queue/hw_sector_size 512
badblocks のテストの速度はブロックサイズをうまく設定することで高速になる。以下の様なシェルスクリプトを書いてテスト。傾向としては、badblocks のブロックサイズオプション -b に与える数が大きくなるほど高速で、ある程度大きい数値だと速度は飽和する。
#!/bin/sh set -eux; readonly BYTES="$(echo "4096 * 8" | bc)"; readonly BYTES_LAST="$(echo "32768 * 4096" | bc)"; for i in $(seq 0 10); do BLOCK_SIZE="$(echo "1024 * 2 ^ ${i}" | bc)" BLOCK_LAST="$(echo "${BYTES_LAST} / ${BLOCK_SIZE}" | bc)" time \ badblocks \ -v \ -b "${BLOCK_SIZE}" \ -X \ -s \ -w \ /dev/sdz \ "${BLOCK_LAST}" \ ; done
ということで、適当なサイズを与える。ここでは 4MB のブロックサイズを使う。
# time badblocks -v -b 4194304 -X -s -w -o badblocks_sdz.txt /dev/sdz
メモリ不足でエラーが出る場合は適宜サイズを減らす。以下の1番目の例のように起動直後にエラー終了する場合はいいけど、Reading and comparing に入ったあとに終了するケースも有る。どちらもメモリ不足で打ち切りになった例。
# badblocks -v -b 33554432 -X -s -w -o badblocks_sdd.txt /dev/sdd Checking for bad blocks in read-write mode From block 0 to 14903 Segmentation fault # badblocks -v -b 16777216 -X -s -w -o badblocks_sdz.txt /dev/sdz Cannot allocate memory while allocating buffers # badblocks -v -b 16777216 -X -s -w -o badblocks_sdz.txt /dev/sdz Checking for bad blocks in read-write mode From block 0 to 59615 Testing with pattern 0xaa: done Reading and comparing:
ps で見ると、Testing with pattern の状態だと 4MBの場合 VSZ が 526528 KiB 程度 、RSS が 263796 KB 程度
# ps -o %mem,vsz,rss,args -C badblocks %MEM VSZ RSS COMMAND 6.7 526528 263796 badblocks -v -b 4194304 -X -s -w -o badblocks_sda.txt /dev/sda 6.7 526528 263808 badblocks -v -b 4194304 -X -s -w -o badblocks_sdb.txt /dev/sdb 6.7 526528 263804 badblocks -v -b 4194304 -X -s -w -o badblocks_sdc.txt /dev/sdc 6.7 526528 263820 badblocks -v -b 4194304 -X -s -w -o badblocks_sdd.txt /dev/sdd 6.7 526528 263796 badblocks -v -b 4194304 -X -s -w -o badblocks_sde.txt /dev/sde # vmstat 1000 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st (snip) 0 5 0 1941248 24908 567712 0 0 0 532677 200 80 0 3 13 84 0 0 5 0 1941592 24908 567500 0 0 0 510657 190 68 0 3 14 83 0 (snip)
Reading and comparing に進んだ sda, sdb, sdc に対するプロセスのメモリ使用量は倍に増加していることがわかる。この時のメモリ使用量が badblocks の1 インスタンスが消費するメモリ量。要するに、起動直後の VSZ から推定できる。メモリ使用量は cat /proc/(PID)/status などで見ても良い。
% ps -o %mem,vsz,rss,args -C badblocks %MEM VSZ RSS COMMAND 13.4 526528 526008 badblocks -v -b 4194304 -X -s -w -o badblocks_sda.txt /dev/sda 13.4 526528 525696 badblocks -v -b 4194304 -X -s -w -o badblocks_sdb.txt /dev/sdb 13.4 526528 525956 badblocks -v -b 4194304 -X -s -w -o badblocks_sdc.txt /dev/sdc 6.7 526528 263820 badblocks -v -b 4194304 -X -s -w -o badblocks_sdd.txt /dev/sdd 6.7 526528 263796 badblocks -v -b 4194304 -X -s -w -o badblocks_sde.txt /dev/sde
VSZ と badblocks に渡したブロック数の対応関係は以下。
badblocks -b XXX (bytes) | VSZ (KiB) | ${2} / ${1} |
---|---|---|
(undefined) | 2,368 | (undefined) |
1,024 | 2,368 | 2368.00000000000000000000 |
262,144 | 35,008 | 136.75000000000000000000 |
524,288 | 67,776 | 132.37500000000000000000 |
1,048,576 | 133,312 | 130.18750000000000000000 |
2,097,152 | 264,384 | 129.09375000000000000000 |
4,194,304 | 526,528 | 128.54687500000000000000 |
16,777,216 | 2,099,392 | 128.13671875000000000000 |
ps で見ると、badblocks のブロック数を指定しない場合、1024B になる。その時の vmstat は以下。ブロック数を適当に設定すると、適当にメモリが割り当てられ、コンテキストスイッチの切り替えも抑制されている (実行時間の短縮に役立っている) ことがわかる。
# vmstat 1000 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st (snip) 0 5 0 3274272 21864 553216 0 0 0 34301 1035 2022 0 4 0 96 0 0 5 0 3274424 21904 553188 0 0 0 34295 1036 2024 0 4 0 96 0 (snip)
ポートマルチプライヤの比較
HP ProLiant MicroServer
HP N54LのminiSASポートで接続した4台のHDD (Toshiba MD05ACA800) に並列でbadblocks testを行う。Testing, Reading, Comparing の1セットで約24時間、0xaa, 0x55, 0xff, 0x00 の4セットで約4日。読み書き速度比較
# /sbin/badblocks -v -b 524288 -X -s -w -o badblocks_sdb.txt /dev/sdb & # /sbin/badblocks -v -b 524288 -X -s -w -o badblocks_sdc.txt /dev/sdc & # /sbin/badblocks -v -b 524288 -X -s -w -o badblocks_sdd.txt /dev/sdd & # /sbin/badblocks -v -b 524288 -X -s -w -o badblocks_sde.txt /dev/sde &
$ iostat -x -m -j ID 100 (snip) avg-cpu: %user %nice %system %iowait %steal %idle 0.03 0.00 93.28 4.72 0.00 1.97 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 0.00 164.29 0.00 164.30 0.00 0.00 0.00 0.00 0.00 203.80 20.47 0.00 1024.02 6.01 98.68 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 0.00 163.04 0.00 163.04 0.00 0.00 0.00 0.00 0.00 198.18 19.65 0.00 1024.00 6.03 98.37 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 0.00 163.91 0.00 163.92 0.00 0.00 0.00 0.00 0.00 214.45 20.79 0.00 1024.02 6.00 98.34 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 0.00 166.41 0.00 166.42 0.00 0.00 0.00 0.00 0.00 213.80 21.33 0.00 1024.02 5.93 98.68 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 26.97 0.00 3.51 61.13 0.00 8.40 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 168.35 0.00 168.35 0.00 0.00 0.00 0.00 0.00 280.16 0.00 26.50 1024.02 0.00 5.25 88.30 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 169.37 0.00 169.37 0.00 0.00 0.00 0.00 0.00 278.02 0.00 26.41 1024.02 0.00 5.19 87.92 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 164.86 0.00 164.86 0.00 0.00 0.00 0.00 0.00 277.86 0.00 25.68 1024.00 0.00 5.18 85.34 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX 163.36 0.00 163.36 0.00 0.00 0.00 0.00 0.00 279.54 0.00 25.66 1024.00 0.00 5.22 85.21 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX (snip)
玄人志向 SATA3I10-PCIe
玄人志向 SATA3I10-PCIeに接続した8台のHDDに並列でbadblocks testを行う。本製品はPCIe x2、SATAコントローラにASMedia ASM1062、ポートマルチプライヤ(PMP)コントローラにJMicorn JMB575を2つ使用。PMP経由の場合、各hddへの帯域はPMPにぶら下げたhddの個数で割り算。今回のような並列でbadblocks testしてテストにかかる時間を減らしたい場合には、PMPにぶら下がるhddの数を2台のPMPで同数にする(本製品の場合ブラケットに近い側と遠い側のポートを交互に配線する)ほうがよい。
ASMedia ASM1062 | JMicorn JMB575 | シルク印刷 | ポート位置 | 型番 |
---|---|---|---|---|
#0 | #0 | 0-T | ブラケット近い側、基盤遠い側 | 無 |
#0 | #0 | 1-B | ブラケット近い側、基盤近い側 | Toshiba MN06ACA800 |
#0 | #0 | 2-T | ブラケット近い側、基盤遠い側 | 無 |
#0 | #0 | 3-B | ブラケット近い側、基盤近い側 | Toshiba MN06ACA800 |
#0 | #0 | 4-T | ブラケット近い側、基盤遠い側 | Seagate ST8000DM004 |
#0 | #1 | 5-B | ブラケット遠い側、基盤近い側 | Seagate ST8000DM004 |
#0 | #1 | 6-T | ブラケット遠い側、基盤遠い側 | Seagate ST8000DM004 |
#0 | #1 | 7-B | ブラケット遠い側、基盤近い側 | Seagate ST8000DM004 |
#0 | #1 | 8-T | ブラケット遠い側、基盤遠い側 | Seagate ST8000DM004 |
#0 | #1 | 9-B | ブラケット遠い側、基盤近い側 | Seagate ST8000DM004 |
iostatを用いて上記接続状態で書き込み性能を見ると、PMPコントローラに毎に210MB/sec程度の帯域があり、PMPコントローラに接続されたもの同士で帯域が共有されていること、hddプラッタの内周に行くにつれて performance regression が大きいことがわかる。Testing, Reading, Comparing の1セットは書き込みと読み込み1回づつで約21時間(=2*8TB/210MB/sec)、0xaa, 0x55, 0xff, 0x00 の4セットで約4日。3台をぶら下げている#0のPMPは3倍して12日、5台をぶら下げている#1のPMPは5倍して20日。
$ iostat 100 -j ID (snip) avg-cpu: %user %nice %system %iowait %steal %idle 0.01 0.00 0.94 30.25 0.00 68.80 tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device 73.91 0.00 75681.28 0 7568128 ata-TOSHIBA_MN06ACA800_XXXXXXXXXXXX 73.88 0.00 75653.12 0 7565312 ata-TOSHIBA_MN06ACA800_XXXXXXXXXXXX 74.08 0.00 75563.52 0 7556352 ata-ST8000DM004-2CX188_XXXXXXXX 40.96 0.00 41779.20 0 4177920 ata-ST8000DM004-2CX188_XXXXXXXX 41.12 0.00 41943.04 0 4194304 ata-ST8000DM004-2CX188_XXXXXXXX 40.96 0.00 41943.04 0 4194304 ata-ST8000DM004-2CX188_XXXXXXXX 40.96 0.00 41943.04 0 4194304 ata-ST8000DM004-2CX188_XXXXXXXX 41.12 0.00 41943.04 0 4194304 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 54.70 0.00 6.46 14.00 0.00 24.84 tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device 56.62 0.00 56227.33 0 56227328 ata-TOSHIBA_MN06ACA800_XXXXXXXXXXXX 56.38 0.00 56199.17 0 56199168 ata-TOSHIBA_MN06ACA800_XXXXXXXXXXXX 55.52 0.00 56188.46 0 56188460 ata-ST8000DM004-2CX188_XXXXXXXX 35.70 0.00 34667.26 0 34667264 ata-ST8000DM004-2CX188_XXXXXXXX 37.00 0.00 36599.07 0 36599072 ata-ST8000DM004-2CX188_XXXXXXXX 38.76 0.00 38932.48 0 38932480 ata-ST8000DM004-2CX188_XXXXXXXX 38.81 0.00 34603.01 0 34603008 ata-ST8000DM004-2CX188_XXXXXXXX 36.40 0.00 34571.01 0 34571008 ata-ST8000DM004-2CX188_XXXXXXXX (snip)
AREA V6 NA
AREA V6 NAに接続した6台のHDDに並列でbadblocks testを行う。本製品はPCIe x4に6ポートのSATA、ASMedia ASM1166を使用。ポートマルチプライヤではないのでポート間で帯域を取り合うことはない。16時間で1セット。4セットするのに64時間=3日
$ iostat 1000 -j ID (snip) avg-cpu: %user %nice %system %iowait %steal %idle 9.36 0.00 2.80 36.63 0.00 51.21 tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device 173.20 0.00 177356.03 0 177356032 ata-ST8000DM004-2CX188_XXXXXXXX 174.55 0.00 178743.30 0 178743296 ata-ST8000DM004-2CX188_XXXXXXXX 172.19 0.00 176321.79 0 176321792 ata-ST8000DM004-2CX188_XXXXXXXX 174.22 0.00 178403.33 0 178403328 ata-ST8000DM004-2CX188_XXXXXXXX 168.78 0.00 172826.62 0 172826624 ata-ST8000DM004-2CX188_XXXXXXXX 175.67 0.00 179186.94 0 179186944 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 96.51 0.00 3.39 0.08 0.00 0.01 tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device 103.52 0.00 106007.30 0 106007296 ata-ST8000DM004-2CX188_XXXXXXXX 106.39 0.00 108947.46 0 108947456 ata-ST8000DM004-2CX188_XXXXXXXX 105.97 0.00 108509.18 0 108509184 ata-ST8000DM004-2CX188_XXXXXXXX 103.60 0.00 106085.12 0 106085120 ata-ST8000DM004-2CX188_XXXXXXXX 103.66 0.00 106143.74 0 106143744 ata-ST8000DM004-2CX188_XXXXXXXX 104.75 0.00 106849.54 0 106849536 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 96.89 0.00 2.74 0.36 0.00 0.01 tps kB_read/s kB_wrtn/s kB_read kB_wrtn Device 166.64 170638.59 0.00 170638592 0 ata-ST8000DM004-2CX188_XXXXXXXX 163.96 167891.71 0.00 167891712 0 ata-ST8000DM004-2CX188_XXXXXXXX 165.19 169158.66 0.00 169158656 0 ata-ST8000DM004-2CX188_XXXXXXXX 166.96 170965.76 0.00 170965760 0 ata-ST8000DM004-2CX188_XXXXXXXX 160.84 164704.26 0.00 164704256 0 ata-ST8000DM004-2CX188_XXXXXXXX 167.58 171606.02 0.00 171606016 0 ata-ST8000DM004-2CX188_XXXXXXXX (snip)
Adaptec 78165 (HBA モード)
utilがほぼ100%なので、これ以上は早くならないか。以降はiostat -xでテストせよ。AREA V6 NAよりも遅いのはちょっと残念(これはボード側でsecure eraseのタスクが走っていたことが原因。さらにそれが原因でbadblocksが失敗する)。タスクが走っていなければ、おおむね170MB/sec程度の速度が出る。
$ iostat -x -m -j ID 100 (snip) avg-cpu: %user %nice %system %iowait %steal %idle 0.09 0.00 1.49 10.16 0.00 88.27 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 0.00 705.43 0.00 176.36 0.00 0.00 0.00 0.00 0.00 314.09 31.51 0.00 256.00 1.42 99.98 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 711.41 0.00 177.85 0.00 0.00 0.00 0.00 0.00 311.35 31.52 0.00 256.00 1.41 99.98 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 725.49 0.00 181.37 0.00 0.00 0.00 0.00 0.00 305.24 31.49 0.00 256.00 1.38 99.99 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 699.65 0.00 174.91 0.00 0.00 0.00 0.00 0.00 315.91 31.50 0.00 256.00 1.43 99.99 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 707.46 0.00 176.87 0.00 0.00 0.00 0.00 0.00 313.15 31.49 0.00 256.00 1.41 100.00 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 731.55 0.00 182.89 0.00 0.00 0.00 0.00 0.00 300.89 31.44 0.00 256.00 1.37 99.98 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 0.07 0.00 1.09 16.73 0.00 82.11 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 0.00 307.89 0.00 76.97 0.00 0.00 0.00 0.00 0.00 723.74 31.45 0.00 256.00 3.25 99.98 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 308.33 0.00 77.08 0.00 0.00 0.00 0.00 0.00 723.33 31.52 0.00 256.00 3.24 100.00 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 308.75 0.00 77.19 0.00 0.00 0.00 0.00 0.00 718.66 31.48 0.00 256.00 3.24 100.00 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 303.12 0.00 75.78 0.00 0.00 0.00 0.00 0.00 731.40 31.49 0.00 256.00 3.30 99.99 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 303.68 0.00 75.92 0.00 0.00 0.00 0.00 0.00 732.07 31.41 0.00 256.00 3.29 100.00 ata-ST8000DM004-2CX188_XXXXXXXX 0.00 303.59 0.00 75.90 0.00 0.00 0.00 0.00 0.00 733.91 31.52 0.00 256.00 3.29 100.00 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 1.13 0.00 1.02 8.48 0.00 89.38 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 727.80 0.00 181.95 0.00 0.00 0.00 0.00 0.00 297.20 0.00 30.80 256.00 0.00 1.34 97.81 ata-ST8000DM004-2CX188_XXXXXXXX 709.00 0.00 177.25 0.00 0.00 0.00 0.00 0.00 304.36 0.00 30.68 256.00 0.00 1.38 97.49 ata-ST8000DM004-2CX188_XXXXXXXX 701.90 0.00 175.47 0.00 0.00 0.00 0.00 0.00 309.57 0.00 30.90 256.00 0.00 1.40 98.10 ata-ST8000DM004-2CX188_XXXXXXXX 699.87 0.00 174.97 0.00 0.00 0.00 0.00 0.00 309.77 0.00 30.82 256.00 0.00 1.40 97.89 ata-ST8000DM004-2CX188_XXXXXXXX 722.68 0.00 180.67 0.00 0.00 0.00 0.00 0.00 299.11 0.00 30.81 256.00 0.00 1.35 97.91 ata-ST8000DM004-2CX188_XXXXXXXX 714.84 0.00 178.71 0.00 0.00 0.00 0.00 0.00 302.91 0.00 30.76 256.00 0.00 1.37 97.66 ata-ST8000DM004-2CX188_XXXXXXXX (snip) avg-cpu: %user %nice %system %iowait %steal %idle 0.62 0.00 1.20 11.07 0.00 87.11 r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util Device 344.29 0.00 86.07 0.00 0.00 0.00 0.00 0.00 635.51 0.00 31.15 256.00 0.00 2.88 99.01 ata-ST8000DM004-2CX188_XXXXXXXX 354.17 0.00 88.54 0.00 0.00 0.00 0.00 0.00 617.63 0.00 31.13 256.00 0.00 2.80 99.02 ata-ST8000DM004-2CX188_XXXXXXXX 375.11 0.00 93.78 0.00 0.00 0.00 0.00 0.00 582.90 0.00 31.16 256.00 0.00 2.64 99.05 ata-ST8000DM004-2CX188_XXXXXXXX 325.11 0.00 81.28 0.00 0.00 0.00 0.00 0.00 676.28 0.00 31.17 256.00 0.00 3.05 99.10 ata-ST8000DM004-2CX188_XXXXXXXX 325.58 0.00 81.39 0.00 0.00 0.00 0.00 0.00 672.71 0.00 31.18 256.00 0.00 3.04 99.11 ata-ST8000DM004-2CX188_XXXXXXXX 322.49 0.00 80.62 0.00 0.00 0.00 0.00 0.00 675.54 0.00 31.02 256.00 0.00 3.06 98.58 ata-ST8000DM004-2CX188_XXXXXXXX (snip)
HP ProLiant MicroServer | |
---|---|
玄人志向 SATA3I10-PCIe | |
AREA V6 NA | PCIe Gen3 x2 |
Adaptec 78165 | PCIe Gen3 x8 |