rsync で大量ファイルを消すと遅い

なんかいちいさん(id:ichii386)が面白そうなこと(「rsync で削除すると速い (?) 件」)をやってたので、手元の PC でも試してみました。

% mkdir /tmp/a
% cd /tmp/a
% seq 1000000 | time xargs -n100 touch
xargs -n100 touch  0.33s user 1.02s system 3% cpu 38.471 total
% cd /tmp
% time rm -rf a
rm -rf a  0.94s user 12.84s system 14% cpu 1:35.91 total
% cd /tmp
% mkdir empty
% time rsync -a --delete empty/ a
rsync -a --delete empty/ a  1.65s user 20.53s system 8% cpu 4:31.73 total

rm の約96秒に対して、rsync は約272秒。めっちゃ遅いんですけど…。

dtrace なんて使えないので、strace でシステムコールの回数を取ってみました。

[rm]

1000001 unlinkat
    976 getdents64
    840 brk
     11 mmap2
     10 fstatfs64

[rsync]

1000004 lstat64
1000000 unlink
    978 getdents64
    327 mmap2
    291 munmap
     63 select
     45 close
     42 read

んー、rsync の方が余計なこといっぱいしてそうです。そのせいでしょうか。

rm と rsync のバージョンはこんな感じです。

% rm --version
rm (GNU coreutils) 8.13

% rsync --version
rsync  version 3.0.9  protocol version 30

とくに結論はありません。興味がつきたのでここまで。