2011年06月12日 20:30 [Edit]

tips - MacBook、特にAirではRAMディスクは無駄な理由

これ、MacBook Air に限らずSSDの寿命を気にする人がよくやっている手ではあるのですが…

MacBook Airを買った - <s>gnarl,</s>技術メモ”’<marquee><textarea>¥
  • 速い(気がする)
  • 全くの無音なのでコンパイルの息遣いを感じたりすることができない
  • 寿命が気になる
書き込みを減らすために、RAMディスク作った。

MacBook Airに関しては無駄です。

少なくとも、RAMディスクを作っただけでは。


その理由が、こちら。

% ls -l /var/vm/
total 4718592
-rw------T  1 root  wheel  4294967296 Jun 12 18:52 sleepimage
-rw-------  1 root  wheel    67108864 Jun 11 04:44 swapfile0
-rw-------  1 root  wheel    67108864 Jun 12 18:52 swapfile1
-rw-------  1 root  wheel   134217728 Jun 12 18:52 swapfile2
-rw-------  1 root  wheel   268435456 Jun 12 18:52 swapfile3

sleepimageというファイルが見えるでしょうか?搭載RAMと同じサイズです。

今日日のMacBookは、二種類のスリープを使い分けています。「サスペンション(suspension)」と「ハイバネーション(hibernation)」。前者はRAMに通電し、後者はRAMの内容をディスクに落とした上でRAMへの通電もやめます。そこまでは他のWintelノートと同じなのですが、Wintelノートではどちらにするか明示的に指定しなければならないのに対し、MacBookでは、スリープが一定時間以上続くと、スリープしている間にサスペンションからハイバネーションに切り替わります。

このあたりの詳しいことは、man pmsetで確認することができます。

man pmset
DEEP SLEEP ARGUMENTS
     deepsleep causes kernel power management to automatically hibernate a
     machine after it has slept for a specified time period. This saves power
     while asleep. This setting defaults to ON for supported hardware. The
     setting deepsleep will be visible in pmset -g if the feature is supported
     on this machine.

     deepsleep only works if hibernation is turned on to hibernatemode 3 or
     25.

     deepsleepdelay specifies the delay, in seconds, before writing the hiber-
     nation image to disk and powering off memory for Deep Sleep.

省電力関連の設定をデフォルトのままにしてある私の MacBook Air (3,2)では、こうでした。

% pmset -g
Active Profiles:
Battery Power		1*
AC Power		2
Currently in use:
 deepsleepdelay	4200
 halfdim	1
 hibernatefile	/var/vm/sleepimage
 disksleep	10
 sleep		10
 hibernatemode	3
 ttyskeepawake	1
 displaysleep	2
 deepsleep	1
 acwake		0
 lidwake	1

要するに、スリープ開始後4200秒=70分経つと、/var/vm/sleepimageが使われるというわけです。別の言い方をすると、RAM 2GBなら2GB、RAM 4GBなら4GB、SSDに書き出されると。

RAMディスクのために使用されている領域も含めて。

このあたりの設定をApple標準のPreference Paneよりも細かく設定するSmart Sleepというものがあることにはあります。

が、ページにあるようにあくまで MacBook および MacBook Pro 用で、deepsleepに対応しているかどうかは未知数。ちなみにdeepsleepと他との違いは、いつsleepimageに書き出すか。deepsleepではスリープ後、そうでない場合はスリープ前で、それを使うかどうかは復帰時次第。MacBook 5,1ではサポートしていませんでした。

手短にまとめると、デフォルトの動作はこのようになります。

  • 以前のMacBookのようにdeepsleepをサポートしていないモデルでは、スリープ開始前にRAMの内容を書き出した上でRAMにも通電しておく(完了したら、スリープインディケーターのLEDが点灯)。どちらから復帰するかはバッテリーのレベル次第。ディスクから復帰する場合にはバーグラフが出る。
    • 最新のMacBook Proを持っている人のレポート希望
  • MacBook Air (Late 2010)のようにdeepsleepをサポートしたモデルでは、RAMの内容を書き出さずにRAMにも通電しておく(スリープインディケーター不要)。deepsleepdelayで指定された時間が経ったら、RAMの内容を書き出した上でRAMも電源オフ。

というわけで、MacBook AirでRAMディスクを使ってSSDをいたわるためには、スリープしてはならない、少なくとも何らかの形で/var/vm/sleepimageへの書き込みを阻止しなければならないという結論になりました。そういう利用シーンがあることにはあります。型落ちのMacBookをサーバーに転用するとか。そうでもないかぎり、RAMディスクは使わない方がよいでしょう。

Dan the Man with Too Many MacBooks to Nurse

おまけ:RAMディスクのパフォーマンス

確かに高速ではあります。

RAMの確保も作成時ではなく使用時なので、メモリーの無駄遣いにもあまりなりません。しかしtmpfsと違って、ファイルを削除したらただちにメモリーが解放されるということはなく、また OS X に限らず最近の *nix はディスクキャッシュが優秀だということもあり、使いどころがきわめて限定されるというのもまた事実です。

実験内容

iMac 11,1
% diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://8388608`
% dd if=/dev/zero of=./zero.fill bs=1m count=4096 
4096+0 records in
4096+0 records out
4294967296 bytes transferred in 52.514180 secs (81786811 bytes/sec)
% dd if=/dev/zero of=/Volumes/ramdisk/zero.fill bs=1m count=4096
dd: /Volumes/ramdisk/zero.fill: No space left on device
4076+0 records in
4075+0 records out
4272947200 bytes transferred in 5.139586 secs (831379653 bytes/sec)
% dd if=/dev/zero of=/dev/null bs=1m count=4096
4096+0 records in
4096+0 records out
4294967296 bytes transferred in 0.515878 secs (8325549086 bytes/sec)
MacBook Air 3,2
diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2097152`
% dd if=/dev/zero of=./zero.fill bs=1m count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 5.549849 secs (193472258 bytes/sec)
% dd if=/dev/zero of=/Volumes/ramdisk/zero.fill bs=1m count=1024
dd: /Volumes/ramdisk/zero.fill: No space left on device
1012+0 records in
1011+0 records out
1060110336 bytes transferred in 2.466265 secs (429844462 bytes/sec)
% dd if=/dev/zero of=/dev/null bs=1m count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 0.210066 secs (5111453702 bytes/sec)

追記:

やはりMacbook Proはdeepsleepをサポートしていないようです。SSDがオプションである以上妥当な線ではありますが…

.@dankogai 店頭のDEMO機を使用し、MacBook Pro 13, 15, 17inch でpmset コマンドを実行してみたところ、deepsleepdelay の項目はありませんでした。SSD搭載モデルでは無いのですが、これで検証になりますでしょうか?less than a minute ago via Twitter for Mac Favorite Retweet Reply

.@dankogai スクリーンショットはこちらになります。i5が13inch、i7 2.0Ghzが15inch、i7 2.2Ghzが17inchになります。 yfrog.com/h8pnavp yfrog.com/h2bhxzp yfrog.com/hs5bonpless than a minute ago via Twitter for Mac Favorite Retweet Reply


この記事へのトラックバックURL

この記事へのコメント
知識がWindows XPで止まってる人間乙
Posted by https://me.yahoo.co.jp/a/lqsrCocfM5sLpvlHrQ12TQOtXfg-#9192e at 2011年06月12日 22:09