R. Ayanokouzi 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 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 1000 -j ID sdb sdc sdd sde
(snip)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.05    0.00   84.92   14.89    0.00    0.14

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
   164.44         0.00    168381.51          0  168386560 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   164.16         0.00    168096.85          0  168101888 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   164.28         0.00    168223.82          0  168228864 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   164.34         0.00    168279.88          0  168284928 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX

(snip)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          27.41    0.00    1.02   70.71    0.00    0.85

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
   160.36    164209.41         0.00  164209408          0 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   161.37    165244.16         0.00  165244160          0 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   160.72    164582.14         0.00  164582144          0 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
   164.61    163456.26         0.00  163456256          0 ata-TOSHIBA_MD05ACA800_XXXXXXXXXXXX
(snip)

玄人志向 SATA3I10-PCIeに接続した8台のHDDに並列でbadblocks testを行う。本製品は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)

リファレンス

  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: 2021-03-31T07:51:34+09:00