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が発生しなくなっていますね。よかった!