[Linux] メモリ上に高速なディスクを作成する - tmpfs

Linuxでいわゆる「RAMディスク」を作成してみます。 HDDは情報の読み込みでも書き込みでも物理的な速度でメモリにはかないません。で、あるならばメインメモリの一部をHDDに見せかけることができれ5ば超高速なストレージとして使えるのでは!という発想ですね。Linuxではtmpfsと呼ばれる仕組みを利用することで手軽に利用できます。

もちろん、メモリ上にデータを置きますので電源を落とした瞬間にすべてが失われます。主にキャッシュなど一時的な利用が中心になると思われます。

RAMディスクをマウントする

今回の環境

テスト用にAWSのLightsailで最もお求めやすいインスタンスを作成しました。

$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2018.03"
()

現在の状態は以下の通り。デフォルトで/dev/shmにtmpfsがマウントされていますね。後ほどこいつを利用します。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         231M   60K  231M    1% /dev
tmpfs            241M     0  241M    0% /dev/shm
/dev/xvda1        20G  1.5G   19G    8% /

fstabは以下の通り。

$ cat /etc/fstab 
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0

マウントする

マウントポイント用のディレクトリを適当な場所に作成したあとにマウントします。

$ mkdir /var/tmp/ram
$ sudo mount -t tmpfs -o size=64m /dev/shm /var/tmp/ram

マウントされましたね。この例で言えばこのあとは/var/tmp/ramにファイルを読み書きするだけでRAMディスクが利用できます。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         231M   60K  231M    1% /dev
tmpfs            241M     0  241M    0% /dev/shm
/dev/xvda1        20G  1.5G   19G    8% /
/dev/shm          64M     0   64M    0% /var/tmp/ram

起動時に自動でマウントする

現在の設定のままだと電源が落ちた瞬間にマウントが解除されてしまいます。 /etc/fstabへ設定を追記しておきます。

$ sudo vi /etc/fstab
/dev/shm     /var/tmp/ram   tmpfs   defaults,size=64m        0   0

試しに再起動や電源ON/OFFを行いマウントされていれば成功です。

ベンチマーク

ではどの程度速くなるのか検証してみたいと思います。ここではddコマンドで簡易的な測定を行っています。

書き込み

前者が通常のディスク(/var/tmp)、後者がRAMディスク(/var/tmp/ram)になります。

$ dd if=/dev/zero of=/var/tmp/zero bs=64k count=1k conv=fdatasync
1024+0 レコード入力
1024+0 レコード出力
67108864 バイト (67 MB) コピーされました、 0.176746 秒、 380 MB/秒

$ dd if=/dev/zero of=/var/tmp/ram/zero bs=64k count=1k conv=fdatasync
1024+0 レコード入力
1024+0 レコード出力
67108864 バイト (67 MB) コピーされました、 0.0252552 秒、 2.7 GB/秒

圧倒的なスピード! 処理速度で約6.9倍、転送速度では約71倍のパフォーマンスを叩き出しています。

読み込み

こちらも同様に前者が通常のディスク(/var/tmp)、後者がRAMディスク(/var/tmp/ram)になります。

$ dd if=/var/tmp/zero of=/dev/null bs=64k count=1k
1024+0 レコード入力
1024+0 レコード出力
67108864 バイト (67 MB) コピーされました、 0.00932708 秒、 7.2 GB/秒

$ dd if=/var/tmp/ram/zero of=/dev/null bs=64k count=1k
1024+0 レコード入力
1024+0 レコード出力
67108864 バイト (67 MB) コピーされました、 0.010285 秒、 6.5 GB/秒

ちょっと意外?な結果となりました。ほとんど変わりません。AWS LightsailではHDDよりも高速なSSDを搭載していることもあってか、読み込みにおいては顕著な効果は見られませんでした。

何かを見逃している気もするので、こちらは後日また検証してみたいと思います。

その他

tmpfsが使えない

tmpfsはLinuxのKernelのバージョンが2.4から対応しています。 もし利用できない場合はOSを確認してみてください。

The tmpfs facility was added in Linux 2.4, as a successor to the older ramfs facility, which did not provide limit checking or allow for the use of swap space. http://man7.org/linux/man-pages/man5/tmpfs.5.html

メモリは利用分のみ消費される

tmpfsの利点は、実際に使わなければメモリ使用量はほぼゼロという点です。 1kbyteのファイルを置いた瞬間に、初めてメモリを1kbyte消費します。もちろんすべてメモリを消費仕切らないよう「ディスク容量」として制限をかけておけば安全に運用できます。

注意点としては、あまりメモリを利用しすぎるとSWAPを使い始めてしまいます。 パフォーマンスを上げるためにRAMディスクを利用するはずが、結果的にメモリの内容がディスクに逃げていくという訳の分からない自体になりますので利用は計画的に行う必要があります。

参考ページ