自宅PCサーバーをSSDにしたので、Debianのパフォーマンス最適化とか寿命延命とか調べていたら頭が痛くなるくらい難しいですね。
複雑なのは、SSDの製品自体の進化も早いし、OSはじめ関連機器のSSD対応もどんどん進んでいます。私はすぐにwindowsで例えてしまいますが、現在windows8.1でSSDを利用するなら標準設定でほぼ何の対策もする必要がありません。むしろXP時代の対策をそのまま設定すると、逆にパフォーマンス低下を招いたりします。まさに昨日の常識は今日の非常識の世界です。理論的には正しくても効果のほどが分かりにくというのも、何を設定すればいいのか判断するのが難しい原因です。
まったく何もしないというのも良し、やりたい事があればやれば良し。という考えのもと、今回設定した項目の備忘録です。これが最善というワケではないので、あしからず。
利用環境:Debian GNU/Linux Wheezy 7.8 /カーネル3.2.0-4-amd64 /ファイルシステムはext4を利用。
このページの目次
利用したSSD
今回利用したSSDはSamsungのSSD EVO 850 120GBです。製品詳細をみますと、下のほうの注釈のところ
3)SSD 850 EVOシリーズをパソコンでご利用いただく際の製品保証は、期間(5年間)もしくはTBW(Total Byte Written=総書込みバイト量)しきい値(120GB/250GB=75TB, 500GB/1TB=150TB)に到達した日の、いずれか短い期間までとなっています。
なお、TBW=150TBとは、一日当たり約40GBの書込みを行うCADデザイナーの2倍である80GBの書き込みを、連続して5年間行った場合に漸く到達することを前提とした、極めて厳しい基準に基づいています。
とにかく、ものすごい書き込みを毎日おこなっても、5年の製品保証ということです。ましてや1万円のSSDです、あまり神経質になる必要はなさそうですね。延命措置のための対策は必要ないでしょう。考えるのはパフォーマンス最適化の方ですね。
事前準備的なもの
とりあえず考慮したものを全部書き出しています。
最新のファームウエアでSSDを利用する
EVO 850はまだ新しいシリーズなので、今日現在ファームウェアアップデートは出ていませんでした。
最新のOSとカーネルを利用する
SSDを利用するならLinuxカーネル3.2以上推奨とのこと、Debianの最新安定板のWheezy7.8はカーネル3.2.0-4-amd64でした。ぎりぎりセーフですね、Debianは保守的といわれる意味を知りました。
SSDとHDDを合体させてSSDキャッシングを使うなら、カーネル3.9以降推奨のようです。ubuntu14.10はカーネル3.16です。Debianから乗り換えるならこちらでしょうか。私はDebian好きなので乗り換えませんが。
最新のファイルシステム
ext4なら良しとのこと。次世代ファイルシステムBtrfsはまだ実験的段階のようです。
メモリはできるだけたくさん積む
2GB以上のメモリでSWAPはほぼ使われなくなります。さらにメモリがあるだけキャッシュとして利用されていくので積めるだけ積みましょう。問題なのは円安によるメモリ価格上昇の方です。
パフォーマンス最適化対策
SSDのための最適化の設定はできることはやりたいですね。
Trim機能を使う
WindowsやAndroidがOSでTrimをサポートするようになった以上、LinuxでもTrimをしておいた方が良さそうですね。設定方法は長くなったので別記事にしています。
I/OスケジューラーをDeadlineに
ディスクにデータを読み書きに行くスケジュール方法が3種類(noop、deadline、cfq)あり、HDDとSSDでは物理構造が違うため、デフォルトでHDD用のcfqから、noopかdeadlineに変更すると良いようです。速度優先ならnoop、安定度でいえばdeadline、効果に懐疑的な方はデフォルトのcfqが良いみたいです。
私は恒久的に設定をdeadlineにしました。
cat /sys/block/sda/queue/scheduler
まずは現在の設定を確認します。
noop deadline [cfq]
[ ]で囲まれているのが現在値です。cfqになっていました。
nano /etc/default/grub
grubの設定を変えるので編集します。
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=deadline"
“elevator=deadline”を付け加えるだけです。
update-grub
grubの設定を反映させて
reboot
システム再起動後
cat /sys/block/sda/queue/scheduler
もう一度確認して
noop [deadline] cfq
deadlineになっていればOKです。
書き込みを減らす対策
今回は書き込みを減らすべく取った対策はnoatimeにした項目だけでした。それすら不要だったかもしれません。
マウントオプションをnoatimeにする
ファイルのアクセス履歴を保存しないようにして、ディスクへの書き込みを減らす対策です。当然それを必要とするプログラムがあると問題ありですが、定番の対策なので実施してもいいでしょう。
私はDebianのセットアップ時に「ディスクのパーティショニング」の画面でnoatimeにしました。
パーティション設定のところで選べます。
noatimeに[*]を付けるだけです。
それでセットアップした/etc/fstabの中身です。
# <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda1 during installation UUID=8b11d682-5f97-4cad-bd1e-fbc55fd6bf8f / ext4 noatime,errors=remount-ro 0 1 # swap was on /dev/sda5 during installation UUID=92962ee4-4f03-4736-a8d3-817bf43b6b6f none swap sw 0 0 /dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/sr0 /media/floppy0 auto rw,user,noauto 0 0
あとから変更する場合は、/etc/fstabファイルの上記と同じ場所に”noatime”を入れたり消したりするだけです。
SWAP領域への書き込みを減らす
私の場合、メモリ4GBなので、普段からまったくSWAPを使っていなかったので対策していません。
RAM-DISK(tmpfs)を使って書き込みを減らす
Debianの場合は、デフォルトでtmpfsがメモリの半分の容量で/dev/shmとしてマウントされています。使いたければすぐに使えるということなので、書き捨てで良い/tmpをRAMディスクに移したり、書き込みの多い/etc/logをRAMディスクに移して最後にディスクに同期させるという対策があるそうです。
…私は今回は見送りです。
キャッシュの同期頻度を減らす
Linuxはメモリが有ればあるだけキャッシュとしてメモリを利用してくれています。そのキャッシュデータをディスクに同期する間隔を開けて書き込みを減らす対策です。当然、間隔を開ければ開けるほど緊急時のデータ不整合が起こる可能性は高くなります。
…私は見送りました。
現在の設定を確認するには
cat /proc/sys/vm/dirty_writeback_centisecs
1/100秒単位で数値が出ます。デフォルト値は500(5秒)のようです。
Cronが使うmlocateを
Cronが使うパッケージのうち、不要そうなmlocateを削除すると…
…細かすぎるので見送りです。
確認だけのような対策
OSがSSDとして認識しているか
DebianがディスクをSSDとして認識しているか確認します。
cat /sys/block/sda/queue/rotational
結果が「0」ならSSD、「1」ならHDDと誤解しています。/sdaの部分は適時変えてください。
パーティションアライメント
パーティションを仕切るときに最適化されているか確認します。よほどのことがない限りいまさらな話のようです。
blockdev --getalignoff /dev/sda1
sda1の部分は適時変えてください。結果が「0」ならOKだそうです。
チャンスがあればSSDリフレッシュを
OSをクリーンインストールし直したりする機会が訪れたら、SSDリフレッシュを実行するのを忘れないようにしましょう。
最後にひとこと
今回やっておくべきと思ったのはTrimを使うことくらいでした。
チェックした項目は次のサイトを参考にさせて頂きました。
https://wiki.archlinux.org/index.php/Solid_State_Drives_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29
https://wiki.debian.org/SSDOptimization
http://robo.mydns.jp/Lecture/index.php?%C3%C7%CA%D2%2FSSD%A4%C8Linux