Linux の tmpfs を使って、/tmpをRAMディスクにしてみた。結論としては効果は全然なかった。
dfすると/dev/shmというエントリがあって、shared memoryらしいことは知っていたが、使ったことはなかった。これをちょっと調べてみたら、on demandにサイズが変わるRAMディスクのようなもで、/tmpをmountすることもできる。
実はCGIではffmpegを始めとする外部コマンドを多数使っている。コマンドをそのまま使っているため、ファイル渡しのIFになってしまっているところがあり、速度が少し気になっていた。
昔のSunOS 4.1の頃は swaptmp とか言うもので /tmp をRAMディスクにするのが普通だったりしたし、少しはファイル渡しIFを高速化できるかも、と考えた。
基本は、
- 通常デフォルトでメモリの半分サイズのtmpfsが作成されている。
- それを/tmpにマウントすれば良い。mount -f tmpfs -o size=64m /tmp
実際には、起動時に /tmp に名前付きpipe?ソケット?がいくつか作られているので、ブート後にマウントを行うとそれらが通信できなくなって支障が出る。(例えばフォントサーバが動かなくなって字形がショボくなったりする)。従って、fstabに書いて起動途中(デーモンが上がる前に)にmountする必要があった。
- tmpfs /tmp tmpfs size=64m 0 0
で、cgiで実測してみたけど、違いは誤差範囲であった。
考えてみれば、ハードディスクのアクセスの際には、HDDのディスクキャッシュ以前にもシステム管理のメインメモリのキャッシュが効いており、連続してアクセスする場合はほぼキャッシュ内に収まっているのだろう。万が一ハードウェアアクセスしてしまうと凄く遅くなるけれど、そうはならないようだ。実際のアルゴリズム的には、Cache → HDDも shm → swap も大して違わないのかもしれない。
書き込み後、時間が経ってから読み出すような場合には効果があるかもしれないけど、通常のtmpファイルとしては大きな利点はなさそうに思う。