SSDとLinux †
※ 近年 SSD が安くなった。そこで DN2820FYKHまた、Raspberry Pi のように SD カード上のシステムもある。
書き込み回数が有限であるようなデバイス上でシステムを運用するための情報をまとめる。
以下では、主として Debian GNU/Linux (wheezy) を想定している。他のディストリビューションでそう変わらないだろう。
SSD の選択について †
- 大量のデータを読み書きする場合
1セルの電子量の状態を1ビットでなく3ビット記録できる TLC(Triple Level Cell) が推奨される。
カーネル・パーティションについて †
- バージョン 3.9 以上
SSD キャッシングが使える。ただし、これは、SSDをハードディスクのキャッシュとして使うものであるので、
SSD の寿命を伸ばすことは関係なさそうだ。
- 最新のファームウエアを使うこと
sudo smartctl -a /dev/sda
などで確かめる。(なお、smartctl コマンドは smarmontools パッケージに入っている。)
- I/O スケジューラ
Linux カーネル 2.6.10 から、デバイス毎にスケジューラを切り替えることが出きるようになった。通常、ハード
ディスクの場合には、データが分散して書かれているために、ヘッドの移動などを考慮して最適化した方がアクセス
が早くなる。SSD の場合には、そのような心配はない。その場合には、スケジューラを用いない
(noopにする)のがいいという議論がある。しかし、deadlineにするのがいいという議論を参照すると、
noop の方がちょっと早いけど、大きなファイルの転送中とかは遅れるので deadline がいい、とある。
設定の確認(SSDが sda のとき):
cat /sys/block/sda/queue/scheduler
noop, deadline, cfq のうち、設定されているものが [ ] でハイライトされている。
設定例(SSDが sda のとき): sysfsutils パッケージも導入してから /etc/sysfs.conf の最後に書き加える。
block/sda/queue/scheduler = deadline
- パーティション
4kB のページサイズを考慮してパーティションを分けなければならない。このページによるとwheezy でパーティ
ションを分けるなら意識しなくてもいいようだ。
swapについて †
- swap 領域をSSDに作らない。
メモリを多めにする、ということ。決まった仕事しかしないだろうので、あらかじめ見当をつけるべき。
ノートパソコンでハイバネーション(休止)するなら致し方ないけど、据え置きならスワップなしも視野に。
- ハイバネーションなどのために swap を作るときは、できるだけ swap を起こさないようにする。
/etc/sysctl.conf に次のように書き加える。
vm.swappiness = 0
メモリがいっぱいになるまでスワップしなくなる。(cf. Wikipedia)
ファイルシステムについて †
- 永続的な記憶領域に btrfs か ext4 を使う。
最も先進的である btrfs は、SSD に対する配慮があるらしい。ただし、experimental (実験的レベルの)ファイル
システムである。詳しくは、例えば ArchLinuxのBtrfsの解説を見れば良い。
- マウント時にアクセス記録(atime)を記録しないようにする。
オプションに noatime を追加する。ただし、ls -a などで最終アクセス記録を参照できなくなる(多分。)。
例:
/dev/sda1 / ext4 noatime,errors=remount-ro 0 0
※ relatime にする可能性もある。しかし、読んだ時刻の更新に気を遣わないなら、noatime でよい。
- SSDの空き領域を開放する TRIM を自動で実行する。
オプションに discard を加える。btrfs, ext4 で有効。TRIMについては2011年の記事がこちらにある。
例:
/dev/sda1 / ext4 noatime,discard,errors=remount-ro 0 0
ただし、ファイルシステムがいっぱいに近くなったときに有効かも、だけの話でTRIM は不要だという議論
もある。また、あらかじめ領域を余分に 15% ほどとっている SSD があるようだ。そういう場合にも
TRIM は不要であるという議論がある。
- 一時的な記憶領域に tmpfs を使う。
- tmpfs とは
RAM の一部をファイルシステムにするのが tmpfs である。指定したサイズは最大値であり、空いている部分は普通に
メインメモリとして利用される。
- tmpfs を使うべきもの
システムが終了すると同時に消えていいファイルは tmpfs でよい。たとえば、
- ロックファイル
あるソフトが起動している時に、同時に複数起動しないようにするために、ファイルを作って、そのファイルがある
時は、新規の起動を制限する、といったこと等が行われる。その時のファイル(ロックファイル)は、システムが終
了する度になくなっていい。
- /tmp
だいたい大丈夫。再起動しても /tmp の内容が保持されるべきであることもあるかもしれないので注意する。
- /home
ユーザー利用領域なのでよくない。しかし、ときどき、SSD に同期(シンクロナイズ)する、つまり、定期的に SSD
に書き出すのも推奨される。詳しくは書かないが、そのためのツールとして、anything-sync-daemon とか
goanysync がある。
- /var/log
基本的にシステムのログは残すべきである。しかし頻繁にファイルを書き換えるようであれば、これはよろしくない。
そこで、起動時に tmpfs に移し、停止時に SSD に書き込む試みが行われているようだ。
- tmpfs の設定方法
- /etc/fstab に設定する方法
この方法は、次に書く設定方法よりも優先的に設定される。例えば、/etc/fstab に次のように書き加えると
/tmp が tmpfs になる。
例:
tmpfs /tmp tmpfs defaults,size=512m 0 0
- /etc/default/tmpfs (squeeze までは /etc/default/rcS ) に設定する方法
wheezy になって変わったところなので、それなりのドキュメントを参照すること。この記事も具体的な設定として参考になる。
設定例:
RAMLOCK=yes
RAMSHM=yes
RAMTMP=yes
TMPFS_SIZE=10%
TMP_SIZE=70%
※ TMPFS_SIZE は tmpfs のサイズの最大値を示している。TMP_SIZE はそれを上書きして、/tmp の上限値を示す。
メモリ量に対する比率で示している。
- log について
システムの記録(log)は、ほとんど /var/log に記録される。ところが、ローテーションが行われたり、ちょっとした追加が行われたりするので、SSD
の観点から適切でない。そこで、/var/log を tmpfs にする試みが行われている。もちろん、シャットダウンすると tmpfs の内容は保持されない。そ
こで、起動時に /var/log を tmpfs に移動し、シャットダウン時に SSD の /var/log に移すのである。
- 解説ページ
A transient /var/log参照。
- スクリプト
ここ(上述のページからリンクが張られている)からダウンロードする。
4,5 行目に次の記述を加える。
# Required-Start:
# Required-Stop:
また、必要に応じて SIZE の部分を書きかえる。
※ このスクリプトは root で動かすため、その中身を特によく知った上で実行すること。
- 起動時・終了時に自動的に実行するための設定例
mv transientlog /etc/init.d/
chown root.root /etc/init.d/transientlog
chmod a+x /etc/init.d/transientlog
insserv transientlog
update-rc.d transientlog start 00 2 3 4 5 . stop 99 0 1 6 .
キャッシュの書き込み †
- キャッシュの書き込み頻度を減らす。
メモリ上にキャッシュされた書き込みは、定期的にディスクに書き込まれる。まず、その時間を確かめるには
cat /proc/sys/vm/dirty_writeback_centisecs
とする。単位は1/100秒なので、500 と表示されたら、5秒ごとに書き込むということである。これを長くする。
/etc/sysctl.conf に以下の行を書き加える。
vm.dirty_writeback_centisecs = 1500
※ 原因不明でうまく設定できない。なぜか 6000(60秒)になる。
cron で動いているプログラム †
- 探し方
/etc/cron.d /etc/cron.hourly /etc/cron.daily 等を探す。
- 消してもよさそうなプログラム
- mlocate
mlocate は locate コマンドでファイルを探すためのデータベースを cron で作っている。使わなければパッケージごと削除する。
(データベースを使わなくても十分早くファイルを探せる。)
リンク集 †