R.A. Epigonos et al.

[linux] badblocks を使ったディスクの破壊的チェック

badblocks の実行時間を短縮するには、適切なブロック数を指定すること、SATAのポートマルチプライヤ(PMP)機能を使わないこと。

装着したディスクの問題を先に確認する。まずはディスクのブロックサイズを確認。

# 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 ASM1062JMicorn JMB575シルク印刷ポート位置型番
#0#00-Tブラケット近い側、基盤遠い側
#0#01-Bブラケット近い側、基盤近い側Toshiba MN06ACA800
#0#02-Tブラケット近い側、基盤遠い側
#0#03-Bブラケット近い側、基盤近い側Toshiba MN06ACA800
#0#04-Tブラケット近い側、基盤遠い側Seagate ST8000DM004
#0#15-Bブラケット遠い側、基盤近い側Seagate ST8000DM004
#0#16-Tブラケット遠い側、基盤遠い側Seagate ST8000DM004
#0#17-Bブラケット遠い側、基盤近い側Seagate ST8000DM004
#0#18-Tブラケット遠い側、基盤遠い側Seagate ST8000DM004
#0#19-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 NAPCIe Gen3 x2
Adaptec 78165PCIe Gen3 x8

リファレンス

  1. ASM1062|ASMedia Technology Inc.
  2. SATA-SATA-SATA Bridge Controller-Products-JMicron-Leading the storage revolution!
  3. ASM1166|ASMedia Technology Inc.
  4. https://www.seagate.com/www-content/datasheets/pdfs/3-5-barracudaDS1900-14-2007JP-ja_JP.pdf

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-12-08T00:04:32+09:00
  2. Modified: 2007-12-08T00:04:32+09:00
  3. Generated: 2023-08-27T23:09:12+09:00