Linux:SSDを搭載後にした設定

Linux
この記事は約6分で読めます。
ADVERTISEMENT

更新 : 2018/12/05

Windows と打って変わって、 Linux では何から何まで自分で SSD に最適な設定をしなければならない。

ADVERTISEMENT

SSD の特徴や用語

ここで SSD の特徴や用語をおさらい。

SSD は上書き保存ができない。

 SSD に搭載されている NAND メモリはデータの上書きができず、未使用か消去済みの領域にしかデータを書き込めない。そして SSD はデータを削除しても即時に物理的にデータを削除しない。 よって SSD を使っているうちに未使用領域なくなってしまうとデータを新たに書き込むときには削除を伴う書き込みが発生する。このため SSD は使うほどパフォーマンスが低下していくが、後述する Trim コマンドを実行することで書き込み速度の回復が期待できる。

ブロックコピー

市販品の SSD は比較的大きなブロック単位でデータを扱う。このため書き込みたいデータをすべて読みだしたあと、ブロック内のデータを消去、データを書き写す作業が行われる。この一連の流れをブロックコピーと呼ぶ。やはりここでも真っ新な領域が少ないと書き込みに遅延が発生する。

ウェアレベリング(摩耗平滑化)

SSD の寿命を延ばすための技術。 SSD はよく知られているようにデータの書き込みができる回数に制限がある。そのため、特定のブロックに利用が偏らないよう、コントローラで制御されている。

TRIM

Trim コマンドは OS が SSD に物理的に削除しても良いアドレスを SSD に通知する。これにより書き込み命令を受けた際、コントローラが効率よく物理消去を行える可能性がある。この効果はメーカーによってまちまちで、Trim コマンドを使うには SSD 本体と OS 両方が対応している必要がある。一部の SSD は TRIM に対応していない場合があるので注意が必要。

 Linux 4.1 以降の場合、Trim をサポートしているファイルシステムは以下のもの

Ext4 Btrfs JFS VFAT XFS F2FS NTFS

特別な理由がない限り、 ext4 を使うのが望ましい。特に Btrfs はまだ不安定。

※Linux カーネルはバージョン 3.9 より新しいものでないと SSD キャッシュ機能に対応していない。

最適化設定

パーティショニング

当方のPC環境は SSD 、HDD 混在している状態。

SSD にはブートセクションとルート。高速起動をしたいプログラムや野良ソフトを格納する /sdata を割り当てた。

キャッシュやログを格納し、書き込みが多い /var と ユーザ情報やデータを格納する /home は HDD 。

またセールかなんかで安くなったらもう一台 SSD を追加したい感じ。

TRIMの設定

Trim に SSD 本体が対応しているか確認

コマンドを実行するには hdparm をインストールしている必要がある。

# hdparm -I /dev/sda | grep -i trim

fstrim で定期的に TRIM を適用する

fstab に discard マウントフラグを記述することで TRIM を有効にする方法もあるが、ArchWiki などで非推奨となっているため Systemd を使って定期的に TRIMコマンドを適用する方法をとることにした。

# systemctl enable fstrim.timer

fstrim が稼働しているか確認・ステータスを表示

# systemctl status fstrim

I/O スケジューラーの変更

I/Oスケジューラは、ブロックI/O処理を効率化させる仕組み。I/Oリクエストの処理する順番を入れ替えることにより、スループットを向上させたり、特定の処理を優先的に実行させることができる。

Linux カーネルがデフォルトでサポートしているのは CFQnoopdeadline の3種類

CFQLinuxカーネルのデフォルトスケジューラ。I/O優先度をサポート、その優先度に応じて処理を行う。スケジューラが多数の内部キューを維持、システム上で動作するプロセス間でのI/O要求を公平に処理する。待ち時間に限界値がある。実はあまり仕組みがよくわからない。
noop最もシンプルなスケジューラでI/Oの要求を要求順に処理する。ほぼなにもしないスケジューラ。
deadlineディスク上で一の近い要求を順番に処理していく。ディスクヘッドから遠いI/O要求は後回しにされるが、待ち時間に上限が設けられており、タイムリミットに達した要求が出た際にはそちらを優先する。

SSD に最適なのは noop か deadline か議論があるようだが、単純に書き込みで早いのは noop だそうだ。ArchWiki でも推奨されているのでこちらを使ってみようと思う。大きなファイルの処理をした際に影響が出るという意見もあるので様子見しながら。

追記

noop だと高負荷状態で特定のI/Oリクエストがスタックして永久に実行されない問題があるらしいので deadline が好ましいとのこと。

SSDとHDDの混在環境での設定

SSD と HDD 両方を使ったシステムの設定がしたいので udev にルールを設定する。

$ sudo nano /etc/udev/rules.d/60-schedulers.rules
# 回転しないディスクは deadline に設定
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"

確認方法

$ cat /sys/block/sd*/queue/scheduler

実行結果

[mq-deadline] kyber bfq none
[mq-deadline] kyber bfq none
[mq-deadline] kyber bfq none

fstab マウントフラグを変更

atime 情報の更新を止める。relatime に設定されているとファイルにアクセスするだけでファイルシステムが情報を書き込む。これを止めるとパフォーマンスの向上が望める。正常に動かなくなるプログラムも出てくるらしいけれど、今まで HDD で noatime フラグを付けても問題が起きた経験がなかったから大丈夫だろう。

$ sudo nano /etc/fstab
# SDD 
# /dev/sda1
UUID=**********   /boot     vfat    default                        0   2
# /dev/sda2 
UUID=**********   /               ext4   defaults,noatime    0   1
# /dev/sda3
UUID=**********   /sdata    ext4    defaults,noatime    0   2

### HDD ###
# /dev/sdb1
UUID=**********   /var         ext4    defaults,noatime    0   2
# /dev/sdb2
UUID=**********   /home     ext4    defaults,noatime    0   2

コメント

タイトルとURLをコピーしました