Linuxでいわゆる「RAMディスク」を作成してみます。
HDDは情報の読み込みでも書き込みでも物理的な速度でメモリにはかないません。で、あるならばメインメモリの一部をHDDに見せかけることができれ5ば超高速なストレージとして使えるのでは!という発想ですね。Linuxではtmpfs
と呼ばれる仕組みを利用することで手軽に利用できます。
もちろん、メモリ上にデータを置きますので電源を落とした瞬間にすべてが失われます。主にキャッシュなど一時的な利用が中心になると思われます。
目次 [hide]
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ディスクを利用するはずが、結果的にメモリの内容がディスクに逃げていくという訳の分からない自体になりますので利用は計画的に行う必要があります。
参考ページ
このブログを応援する
お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。
/dev/shm は共有RAMディスクで(shmはshared memoryの略です)、いちいち別な場所にマウントし直したりせずそのまま使えばいいだけですよ。
複数ユーザーが共有しているような環境であれば、一意となる名前のディレクトリをshm下に作成した上でそのディレクトリを他のユーザーがアクセスできないようパーミッション変更して使えば良いです。
コメントありがとうございます!
これを書いていたときは
・既存ディレクトリの置き換えがしたかった
・最大で利用する容量を制限したかった
あたりの理由があった気がしますが、細かいことは忘れてしまいましたw