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

Linux
この記事は約7分で読めます。
スポンサーリンク

更新 : 2018/12/05

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

スポンサーリンク

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

ドライブがTRIMに対応していれば以下のように表示される

*	Data Set Management TRIM supported (limit 8 blocks)

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

/etc/fstabdiscard マウントフラグを記述することで TRIM を有効にする方法もある。しかし書き込みが行われるたびにTRIMコマンドを実行するためストレージのパフォーマンスがかえって低下する恐れがある。

現在多くのディストリビューションで Systemd を使って定期的に TRIMコマンドを適用する方法が推奨されている。

# systemctl enable fstrim.timer

正常にコマンドが実行されればTRIMタイマーのシンボリックリンクが作成される。

Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.

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

# systemctl status fstrim

systemd 上で稼働しているすべてのタイマーを表示するコマンド。

$ sudo systemctl list-timers --all

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

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

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

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

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

追記

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

現在のI/Oスケジューラの確認

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

実行結果。現在使われているスケジューラは[ ]で囲われている。Arch Linuxの場合はMQ deadlineが初期設定なので特にいじる必要はない。

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

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"

fstab マウントフラグを変更

noatime マウントオプションを加えることで atime 情報の更新を止める。

relatime でも notime と然程パフォーマンスの違いはないが書き込み量を減らすことができる。

正常に動かなくなるプログラムも出てくるらしいけれど、今まで 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をコピーしました