handlename's blog

コード片など

Test::mysqldを永続化しつつメモリ上で動かす

を参考に、Test::mysqldを使い回しつつメモリ上のディスクで読み書きするようにしてみた。

メモリ上に仮想ディスクをつくってマウント

man 8 hdid に書いてあるものをほぼそのまま利用。

hdimount
#!/bin/sh

NUMSECTORS=128000
mydev=`hdid -nomount ram://$NUMSECTORS`
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/sh

if [ ! -e '/tmp/mnt' ] ; then
    echo 'no tmp disk "/tmp/mnt"';
    exit;
fi

`TMPDIR=/tmp/mnt prove $@`

いちおうディスクがなければ中断するように。
テストを走らせるときはこんな感じで。

$ 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