理系学生日記

おまえはいつまで学生気分なのか

RAM ディスクを使用して SSD への書き込みを減らす

そいやコンクリートジャングルで暮らすうちに蓄積したストレスを発散すべく MacBook Air を購入したのでした。
この MacBook Air は SSD 搭載ですが、SSD といえばフラッシュメモリ、フラッシュメモリといえば書き換え回数制限です。書き換え回数の上限に達したフラッシュメモリは、それ以上確実にデータを保持することができなくなります。
これはたいへんこわい。記憶装置が正しい記憶をしないとすると、それはまさしくぼくたちの頭みたいなものですから、もはや信用なりません。ぼくたちは一生懸命にこの書き換え回数を制限してやる必要があります。
しかし、書き換え回数を少なくするために PC 使用を制限するなどというのは PC を買った意味がなくなりますから、ここは RAM ディスクを作成して、いわゆるアプリケーションのキャッシュ系は RAM ディスク上に置くことに決めた。

※なお、以下はぼくの適当な理解を前提としてますし、かなりはしょって書いているので、まちがってる可能性があります。雰囲気だけおたのしみください。

なぜ回数制限が発生するのか

SSD は上記の通りフラッシュメモリを使っていますが、フラッシュメモリがビット情報を保持する過程では、絶縁体と(量子力学の)トンネル効果が大きな役割を果たします。
フラッシュメモリの記憶素子には、電子を保持するゲートがあり、そのゲートに電子が保持されているかどうかで "1" と "0" が判断できるようになります。そして、そのゲートに電子を移動させるのが記憶素子に印加する電圧になります。
ここで、電子を"保持"するためには、電圧を印加していない場合には電子を移動させてはならないという制約が必要です。もしその制約がなかったら、PC の電源を切っているときに電子がゲートから流出したり、ゲートに流入したりして、データが "0" だったのか "1" だったのか分からなくなりますから。

この役割を果たしているのがゲートの回りにある絶縁体で、ある程度の電圧をかけないと、電子はこの絶縁体を通過できません。絶縁体によって、電子はゲートから入れなく(あるいは出られなく)なりますから、電源切っているときも電子は動けない→情報が保持されるという感じです。ちなみに、電子が通るんだったら絶縁体じゃないじゃんっていう人は「トンネル効果」でググれ。


ただし、この絶縁体、電子が出たり入ったりしていくうちに、つまり書き込みまくったりしてるうちに、その「絶縁性」がだんだんヘタってきます。こうなると、情報を保持する能力ガンガン落ちますから、回数制限が発生してくる、というわけですね。たぶん。
ちょっと調べたらこのあたりが図解入りで分かりやすいんじゃないかと思います。

RAM ディスク

書き込みを減らすといっても、必要なデータというのは SSD に書き込む他にしかたがありません。
しかし、世の中には、「動作を早くするため」に一時的に保持される(キャッシュされる)データというのがある。たとえば Web ページを一回見た後、次にそのページ見るときはローカルに保持してあるデータ見ることで、いちいちインターネットを通してダウンロードする必要なんてないわけですね。キャッシュすごい。ちょうスゴい。
でもでも、このキャッシュってヤツはずっと保持してなくても良いわけです。一時的に保持してればよくて、最悪の場合でも、べつに無かったら無かったでちょっと動作が遅くなるだけです。ですから、別にディスク上に保持してなくたっていい。せいぜいメモリ上に保持しといてやれば良いわけですね。

これをアプリケーション透過で行おうとするのが RAM ディスクで、アプリケーション側からみるとディスクに見えるけど、実は RAM 上に保存されるっていう感じのものです。要するにメモリがディスクをエミュレーションしてるかんじですね。メモリをちょう高速なハードディスクとして使えるわけです(でも、電源切るとデータが消えちゃう)

RAM ディスクについてはこのへんですかね。

つくりましょう

とりあえず、以下のような ramdisk っていうスクリプトでっちあげて、/usr/libexec/ に置きました。
RAM の領域を dev 化してファイルシステムつくってマウントていうかんじですね。

#!/bin/bash

# SECTOR = 512B なので、524288 sectors = 256MBに相当
NUMSECTORS=524288

RAMDISK=$(hdid -nomount ram://$NUMSECTORS)

newfs_hfs $RAMDISK
mount -t hfs $RAMDISK /Volumes/ramdisk
mkdir -p /Volumes/ramdisk/{tmp,cache}

あとは、これをシステム起動時に叩くようにしてやれば、起動フェーズで RAM ディスク化される。
起動フェーズという縛りがあるので、launchd に実行してもらうように、以下の plist を /System/Library/LaunchDaemons/com.kiririmode.ramdisk.plist に配置してやります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.kiririmode.ramdisk</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/libexec/ramdisk</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

あとは、キャッシュ用のフォルダを、上記の RAM ディスク上に向ける。

$ ls -l ~/Library/Caches
lrwxr-xr-x  1 kiririmode  staff  22 Aug 13 20:57 /Users/kiririmode/Library/Caches -> /Volumes/ramdisk/cache

なお、こちらは必読かと思います。