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

  • LINEで送る
この記事は 2019年4月30日 に書かれたものです

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

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

- Sponsored Link -

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ディスクを利用するはずが、結果的にメモリの内容がディスクに逃げていくという訳の分からない自体になりますので利用は計画的に行う必要があります。

参考ページ

コメント

ご感想やご質問などお気軽にどうぞ。書き込むにはfacebookへのログインが必要です。

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -

旧コメント欄(表示のみ)

※こちらのコメント欄は以前稼働していたものです。現在は新たに書き込むことはできません。ご感想やご質問は記事の下にあるコメント欄をご利用ください。
  1. 匿名 より:

    /dev/shm は共有RAMディスクで(shmはshared memoryの略です)、いちいち別な場所にマウントし直したりせずそのまま使えばいいだけですよ。
    複数ユーザーが共有しているような環境であれば、一意となる名前のディレクトリをshm下に作成した上でそのディレクトリを他のユーザーがアクセスできないようパーミッション変更して使えば良いです。

  2. 勝部 麻季人 より:

    コメントありがとうございます!
    これを書いていたときは
     ・既存ディレクトリの置き換えがしたかった
     ・最大で利用する容量を制限したかった
    あたりの理由があった気がしますが、細かいことは忘れてしまいましたw

:)