shred が遅いのは /dev/urandom が遅いからだ

いらない PC を捨てるとき、shred で HDD 内のデータをひっかきまわしてから捨ててたのですがこの shred がとにかく遅いのです。

Knoppix 5.3 の Live CD を準備しておき、こいつでブートして shred を使っておりました。こんなもんかなぁと思っていたのですが、市販のHDD消去ソフトはランダムパターンを書き込んでいるというのに断然速いじゃないですか。市販のは数時間で終わるのに shred は1日がかり。この速度差はいくらなんでもおかしい。

と思ってググってみました。Knoppix 5 には coreutils-6 付属の shred が入っています。こいつは乱数のソースに非常に遅いもの ( /dev/urandom ) を使っているらしくとにかく時間がかかってます。

最近のものを使えばよいというので Ubuntu 11.04 の Live CD でやってみると、こいつは shred が新しくなっており乱数の発生も高速になっておりました。手元の 5年ほど前の PC で実測 8倍くらいの速度差がありました。こんなにも違うのか。

HDD全体で実験すると時間かかるので小さめなファイルで実験してみました。まず空っぽの 1GB のファイルを準備します。こいつをぐちゃぐちゃにします。

$ dd if=/dev/zero of=/media/new/test001 count=1000 bs=1MB
1000+0 records in
1000+0 records out
1000000000 bytes (1.0 GB) copied, 27.7607 s, 36.0 MB/s
  
$ time shred --random-source=/dev/urandom /media/new/test001 
real	12m14.324s
user	0m0.152s
sys	12m10.754s
  
$ time shred /media/new/test001 
real	1m27.681s
user	0m4.964s
sys	0m3.412s

/dev/urandom を使ったものと使ってないもの、この差ですわ。/dev/urandom がネックになってたみたい。CPUもフル稼働してたし。ちょうどこれを実行してた時の vmstat 10 の結果がコレ。

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 131140  42060 1382724    0    0     0  4916  652  599  0 51 49  0
 1  0      0 131140  42076 1382724    0    0     0  6146  648  597  0 50 49  0
 1  0      0 131140  42092 1382724    0    0     0  1231  639  607  1 50 49  0
 2  0      0 131140  42108 1382724    0    0     0  4918  646  599  0 50 49  0
 0  1      0 130396  42124 1382724    0    0     0 13123  590  543  1 40 50  9 ←切り替わり
 0  1      0 129908  42140 1382724    0    0     0 35443  451  336  3  3 48 47
 0  1      0 129660  42156 1382724    0    0     0 34408  397  288  3  2 48 47
 0  1      0 129536  42172 1382724    0    0     0 32927  357  264  2  3 48 47
 0  1      0 129784  42188 1382724    0    0     0 34660  397  300  3  2 47 49

/dev/urandom は、CPUブン回して頑張って乱数生成してたんやね…かわいそうな子…乱数生成が間に合わなくて Disk IO はヒマヒマだったようです。shred 内蔵の乱数を使うと速いらしくDISK IO がネックになってきますね。