Subscribed unsubscribe Subscribe Subscribe

OSX で tmpfs 的なことを試してみる

Perl Mac

OSX で tmpfs 的なことをする方法 - unknownplace.org を読んで、SSDマシンじゃないけどちょっとやってみよう、と思って試してみた。
設定方法は上記記事の通りで

$ hdid -nomount ram://128000
/dev/disk1
$ newfs_hfs /dev/disk1
Initialized /dev/rdisk1 as a 63 MB HFS Plus volume
$ mkdir /tmp/mnt
$ mount -t hfs /dev/disk1 /tmp/mnt

で僕にも簡単にできた! いちおう確認してみると

$ df
Filesystem    512-blocks      Used Available Capacity  Mounted on

...

/dev/disk1        128000      3032    124968     3%    /private/tmp/mnt

ちゃんと作られているっぽい。
さて、tmpfs的なものを作ったは良いものの、ここをちゃんと使うようにするには。Test::mysqldを普通に動かすと

$ perl -MTest::mysqld -le 'print Test::mysqld->new(my_cnf => { "skip-networking" => "" })->dsn'
DBI:mysql:dbname=test;mysql_socket=/var/folders/yv/yv0iL9yNF68JPxnSaXyFnU+++TI/-Tmp-/gIwkKm8uT0/tmp/mysql.sock;user=root

と、デフォルトのtempdirに諸々のファイルが作成されてしまい、折角作ったtmpfs的なものが意味無しになってしまう。
とは言えTest::mysqldに毎回tmpfs的なもののディレクトリを指定してnewするのもアレだし、いつも必ずtmpfs的なものをmountしてあるわけでもない。
ので、環境変数で対応する、のが正解でしょうか?
File::Tempのtempdirは環境変数TMPDIRがセットされていればそこにtemporary directoryを作ってくれるので、テストのときはこれを指定して実行してやれば良いはず。

$ perl -MTest::mysqld -le 'print Test::mysqld->new(my_cnf => { "skip-networking" => "" })->dsn'
DBI:mysql:dbname=test;mysql_socket=/var/folders/yv/yv0iL9yNF68JPxnSaXyFnU+++TI/-Tmp-/90ncuxWNUY/tmp/mysql.sock;user=root
$ TMPDIR=/tmp/mnt perl -MTest::mysqld -le 'print Test::mysqld->new(my_cnf => { "skip-networking" => "" })->dsn'
DBI:mysql:dbname=test;mysql_socket=/tmp/mnt/zezhubsKV7/tmp/mysql.sock;user=root

これで、マウントしたtmpfs的なものがちゃんと使われるようになりました。
ためしに、上の2つのコマンドを実行する裏でiostatを取ってみた結果。

$ iostat 1
          disk0           disk1       cpu     load average
    KB/t tps  MB/s     KB/t tps  MB/s  us sy id   1m   5m   15m
   17.51  14  0.24   193.03   0  0.00   7  3 90  0.51 0.43 0.41
    0.00   0  0.00     0.00   0  0.00   3  2 95  0.51 0.43 0.41
    0.00   0  0.00     0.00   0  0.00   5  2 93  0.47 0.42 0.41
    4.00   1  0.00     0.00   0  0.00   9  6 85  0.47 0.42 0.41
  268.84  90 23.61     0.00   0  0.00   7  5 88  0.47 0.42 0.41
   60.44   9  0.53     0.00   0  0.00   7  4 88  0.47 0.42 0.41
    4.00   1  0.00     0.00   0  0.00  11  5 85  0.47 0.42 0.41
    0.00   0  0.00     0.00   0  0.00   4  2 93  0.43 0.41 0.40
    0.00   0  0.00    66.66 381 24.78   9  7 85  0.43 0.41 0.40
    0.00   0  0.00     5.84 276  1.57   4  3 93  0.43 0.41 0.40
    0.00   0  0.00     0.00   0  0.00   3  2 94  0.43 0.41 0.40

最初はdisk0の方にioが、2番目のコマンドのときはdisk1 つまりmountしたtmpfs的なものの方にioが発生しています。
TMPDIRを指定してやることでdisk0の方にはioが発生しなくなっていますね。よかった!