Test::mysqldを永続化しつつメモリ上で動かす
- Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件 - Craftworks Tech Blog - Branch
- OSX で tmpfs 的なことをする方法 - unknownplace.org
- OSX で tmpfs 的なことを試してみる - すぎゃーんメモ
を参考に、Test::mysqldを使い回しつつメモリ上のディスクで読み書きするようにしてみた。
メモリ上に仮想ディスクをつくってマウント
man 8 hdid に書いてあるものをほぼそのまま利用。
hdimount
#!/bin/shNUMSECTORS=128000 mydev=
hdid -nomount ram://</span><span class="synPreProc">$NUMSECTORS</span><span class="synSpecial">
newfs_hfs $mydev mkdir /tmp/mnt mount -t hfs $mydev /tmp/mnt
~/bin に置いて
$ hdimount
でマウントできるようにしておく。
Test::mysqldの起動
これも参考記事のものをそのまま利用。
テスト本体の方ではrunnerでつくったTest::mysqldインスタンスを使うようにしておく(上記の参考記事参照)。
mysqld_runner.pl
#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use File::Spec; use JSON; use Koshien::Test;my $tempfile = File::Spec->catfile(File::Spec->tmpdir, ‘test_mysqld.json’);
$SIG{‘INT’} = *purge; END { purge(); }
print "Starting mysqld…"; my $mysqld = setup_database; my $log = File::Spec->catfile($mysqld->{‘base_dir’}, qw/tmp mysqld.log/); printf " started at %s\n", $mysqld->{‘my_cnf’}{‘socket’}; print "log file: $log\n";
{ my $json = encode_json({ %$mysqld }); open my $fh, ’>’, $tempfile or die $!; $fh->print($json); $fh->close; }
sleep 3 while -e $tempfile;
sub purge { unlink $tempfile; print "Shutting down mysqld…\n"; exit; }
適当な場所に置いて実行。TMPDIRはいじらなくていい。
$ perl -Ilib t/script/mysqld_runner.pl
テストの実行
hdidでつくったディスクを使うには、テストを実行するときに環境変数をセットすればOK。
毎回コマンドラインから設定するのは面倒なのでシェルスクリプトで。
tmprove
#!/bin/shif [ ! -e ’/tmp/mnt’ ] ; then echo ’no tmp disk "/tmp/mnt"’; exit; fi
</span><span class="synIdentifier">TMPDIR</span>=<span class="synSpecial">/tmp/mnt prove </span><span class="synPreProc">$@</span><span class="synSpecial">
いちおうディスクがなければ中断するように。
テストを走らせるときはこんな感じで。
$ tmprove -Ilib -lr t/m
読み書き状況を見てみる
iostatはこんな感じに。disk2がhdidでつくったディスク。
before
disk0 disk1 disk2 cpu load average KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m 24.77 13 0.32 11.06 0 0.00 31.74 1 0.02 14 3 84 0.83 0.84 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 3 2 94 0.83 0.84 0.83 4.00 3 0.01 0.00 0 0.00 0.00 0 0.00 17 3 80 0.83 0.84 0.83 18.00 2 0.04 0.00 0 0.00 0.00 0 0.00 28 2 70 0.83 0.84 0.83 16.00 35 0.55 0.00 0 0.00 0.00 0 0.00 27 2 71 0.85 0.84 0.83 7.87 31 0.24 0.00 0 0.00 0.00 0 0.00 26 3 71 0.85 0.84 0.83 5.00 4 0.02 0.00 0 0.00 0.00 0 0.00 27 2 71 0.85 0.84 0.83 13.54 26 0.34 0.00 0 0.00 0.00 0 0.00 26 3 70 0.85 0.84 0.83 4.00 2 0.01 0.00 0 0.00 0.00 0 0.00 28 2 70 0.85 0.84 0.83 4.00 1 0.00 0.00 0 0.00 0.00 0 0.00 27 2 71 0.94 0.86 0.83 8.00 9 0.07 0.00 0 0.00 0.00 0 0.00 28 3 69 0.94 0.86 0.83 4.00 2 0.01 0.00 0 0.00 0.00 0 0.00 29 2 69 0.94 0.86 0.83 6.74 35 0.23 0.00 0 0.00 0.00 0 0.00 24 3 73 0.94 0.86 0.83 6.00 10 0.06 0.00 0 0.00 0.00 0 0.00 17 3 80 0.94 0.86 0.83 57.56 72 4.04 0.00 0 0.00 0.00 0 0.00 28 2 70 0.94 0.86 0.83 8.00 3 0.02 0.00 0 0.00 0.00 0 0.00 27 2 71 0.94 0.86 0.83 5.33 9 0.05 0.00 0 0.00 0.00 0 0.00 28 3 69 0.94 0.86 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 28 2 71 0.94 0.86 0.83 6.50 8 0.05 0.00 0 0.00 0.00 0 0.00 26 3 71 0.94 0.86 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 28 2 70 1.03 0.88 0.84
after
disk0 disk1 disk2 cpu load average KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m 24.78 13 0.32 11.06 0 0.00 32.52 1 0.02 14 3 84 0.87 0.84 0.83 4.00 2 0.01 0.00 0 0.00 0.00 0 0.00 4 3 93 0.87 0.84 0.83 4.00 4 0.02 0.00 0 0.00 0.00 0 0.00 11 3 86 0.87 0.84 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 27 2 70 0.96 0.86 0.84 10.00 4 0.04 0.00 0 0.00 4.00 4 0.02 28 3 70 0.96 0.86 0.84 4.00 1 0.00 0.00 0 0.00 56.35 645 35.49 8 6 86 0.96 0.86 0.84 0.00 0 0.00 0.00 0 0.00 201.22 23 4.51 16 3 81 0.96 0.86 0.84 0.00 0 0.00 0.00 0 0.00 8.32 2314 18.81 13 7 80 0.96 0.86 0.84 4.00 1 0.00 0.00 0 0.00 300.42 66 19.33 16 4 80 0.88 0.85 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 27 2 71 0.88 0.85 0.83 4.00 2 0.01 0.00 0 0.00 22.15 612 13.23 26 6 69 0.88 0.85 0.83 4.00 1 0.00 0.00 0 0.00 486.98 47 22.32 5 3 93 0.88 0.85 0.83 0.00 0 0.00 0.00 0 0.00 15.48 1266 19.13 24 6 69 0.88 0.85 0.83 8.00 1 0.01 0.00 0 0.00 20.69 1172 23.68 10 4 86 0.89 0.85 0.83 4.00 4 0.02 0.00 0 0.00 53.38 684 35.68 14 7 79 0.89 0.85 0.83 0.00 0 0.00 0.00 0 0.00 201.22 23 4.51 13 3 84 0.89 0.85 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 28 2 70 0.89 0.85 0.83 0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 28 2 71 0.89 0.85 0.83 0.00 0 0.00 0.00 0 0.00 8.22 2370 19.02 17 7 76 0.90 0.85 0.83 4.00 3 0.01 0.00 0 0.00 36.44 613 21.82 12 6 81 0.90 0.85 0.83
ちゃんと使われてるみたい。
ついでにtime測ってみた
遅くなった…。
prove -Ilib -lr t/m 31.18s user 1.22s system 97% cpu 33.132 total TMPDIR=/tmp/mnt prove -Ilib -lr t/m 45.94s user 4.66s system 65% cpu 1:17.08 total