[Linux]SSDのパフォーマンス改善(TRIMの設定)

アイキャッチ画像Manjaro

SSDにManjaroをインストールしたので、SSDのパフォーマンス改善のためにTRIMの設定とI/Oスケジューラーの確認をします。

設定変更は自己責任でお願いします。

環境

$ uname -r
5.10.89-1-MANJARO
$ lsb_release -a
LSB Version:    n/a
Distributor ID:    ManjaroLinux
Description:    Manjaro Linux
Release:    21.2.1
Codename:    Qonos
$

ノートPCのスペックは以下のとおりです。

Onda Xiaoma21
CPUApollo Lake N3450
ディスプレイ12.5インチIPS
解像度1920×1080
メモリ4GB
ストレージ64GB eMMC
256GB 2242サイズのM.2 SSD増設済
MicroSDカードスロット
無線LAN内蔵無線LANはWindowsでも認識しなくなったので  
GW-US300MiniS を使用
Onda Xiaoma21 スペック

TRIMの有効化

TRIMをサポートしているSSDの場合、TRIMを有効にすることが推奨されています。
TRIMの実行方法は以下の2つの方法があります。

  • discardマウントフラグでTRIMを有効にする
  • fstrimコマンドで定期的にTRIMを適用する

ただし、ArchWikiではdiscardマウントフラグでのTRIMの有効化は推奨していません。

また、man fstrimにも

Running fstrim frequently, or even using mount -o discard, might negatively affect the lifetime of poor-quality SSD devices.
For most desktop and server systems a sufficient trimming frequency is once a week.

fstrimを頻繁に実行するか、mount -o discardを使用する場合、低品質のSSDデバイスの寿命に悪影響を与える可能性があります
ほとんどのデスクトップおよびサーバーシステムでは、十分なトリミング頻度は週に1回です。

fstrim(8) – Linux manual page

との記載があります。

また、TRIMをサポートしていないデバイスを指定してfstrimコマンドを実行しても、TRIMは実行されません。

$ sudo fstrim -v /mnt/non_discard
fstrim: /mnt/non_discard: the discard operation is not supported

このため、ここでは「fstrimコマンドで定期的にTRIMを適用する方法」で対応します。

fstrimコマンドで定期的にTRIMを適用する

fstabの設定確認

fstrimコマンドをタイマーで実施するので、fstabでのdiscardマウントフラグは使用していません

$ cat /etc/fstab
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=1600-XXXX                            /boot/efi      vfat    noatime,umask=0077 0 2
UUID=1e223bba-dca3-485d-811d-e5fbc54xxxxx /              ext4    defaults,noatime 0 1
UUID=9f30e7c6-6637-442c-8928-f65a3f3xxxxx /mnt/emmc0     ext4    x-gvfs-show,defaults,noatime 0 2
UUID=101A-XXXX                            /mnt/sdcard0   exfat   x-gvfs-show,noatime,uid=1000,gid=1000,umask=0022,nofail,x-systemd.device-timeout=10 0 0
tmpfs                                     /tmp           tmpfs   defaults,noatime,mode=1777 0 0
$

TRIMタイマーの有効化

systemctl enable fstrim.timer で、TRIMタイマーを有効化します。

$ sudo systemctl enable fstrim.timer
Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer.
$ 
$ systemctl status fstrim.timer
○ fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
     Active: inactive (dead)
    Trigger: n/a
   Triggers: ● fstrim.service
       Docs: man:fstrim
$

ステータスを見てわかるとおり、この時点ではTRIMタイマーはまだ起動していません。

TRIMタイマーの設定確認

念のため、デフォルトの設定を確認しておきます。

fstrim.serviceの設定ファイル
$ cat /usr/lib/systemd/system/fstrim.service 
[Unit]
Description=Discard unused blocks on filesystems from /etc/fstab
Documentation=man:fstrim(8)
ConditionVirtualization=!container

[Service]
Type=oneshot
ExecStart=/usr/bin/fstrim --listed-in /etc/fstab:/proc/self/mountinfo --verbose --quiet-unsupported
PrivateDevices=no
PrivateNetwork=yes
PrivateUsers=no
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
MemoryDenyWriteExecute=yes
SystemCallFilter=@default @file-system @basic-io @system-service
$
  • --listed-in /etc/fstab:/proc/self/mountinfo
    /etc/fstabに記載されているファイルシステムが対象

前述のとおり、fstrimコマンドはTRIMをサポートしていないデバイスを指定しても、TRIMが実行されないので、デフォルトの設定のままで問題なさそうです。

fstrim.timerの設定ファイル
$ cat /usr/lib/systemd/system/fstrim.timer
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim
ConditionVirtualization=!container
ConditionPathExists=!/etc/initrd-release

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true
RandomizedDelaySec=6000

[Install]
WantedBy=timers.target
$
  • OnCalendar=weekly
    週一回(月曜日の午前0:00)実施
  • Persistent=true
    → PCの電源が切られているときにTRIMの実行時間がきたら、次のPC起動時に実行

週一回実施となっているので、デフォルトの設定のままで問題なさそうです。

TRIMタイマーの起動

systemctl start fstrim.timer で、TRIMタイマーを起動します。

$ sudo systemctl start fstrim.timer
$ 
$ systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
     Active: active (waiting) since Sun 2022-01-23 14:10:27 JST; 1h 7min ago
      Until: Sun 2022-01-23 14:10:27 JST; 1h 7min ago
    Trigger: Mon 2022-01-24 00:10:15 JST; 8h left
   Triggers: ● fstrim.service
       Docs: man:fstrim

 1月 23 14:10:27 Xioma21 systemd[1]: Started Discard unused blocks once a week.
$

ステータスを確認して、Active: active (waiting)となっていれば、Triggerに記載されている日時以降で、PCを起動したときに実行されます。

タイマーの確認

設定されているタイマーは systemctl list-timers で確認することができます。

$ systemctl list-timers --all
NEXT                        LEFT               LAST                        PASSED             UNIT                         ACTIVATES                 >
Sun 2022-01-23 22:57:43 JST 8h left            Mon 2022-01-03 16:05:42 JST 2 weeks 5 days ago pamac-mirrorlist.timer       pamac-mirrorlist.service
Mon 2022-01-24 00:00:00 JST 9h left            Sun 2022-01-23 14:10:27 JST 44min ago          logrotate.timer              logrotate.service
Mon 2022-01-24 00:00:00 JST 9h left            Sun 2022-01-23 14:10:27 JST 44min ago          man-db.timer                 man-db.service
Mon 2022-01-24 00:00:00 JST 9h left            Sun 2022-01-23 14:10:27 JST 44min ago          shadow.timer                 shadow.service
Mon 2022-01-24 00:10:15 JST 9h left           Sat 2022-01-22 17:18:07 JST 21h ago            fstrim.timer                 fstrim.service
Mon 2022-01-24 14:25:29 JST 23h left           Sun 2022-01-23 14:25:29 JST 29min ago          systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.ser>
Sat 2022-02-05 15:00:00 JST 1 week 6 days left Sun 2022-01-02 14:06:40 JST 3 weeks 0 days ago pamac-cleancache.timer       pamac-cleancache.service

7 timers listed.
$

NEXTが次に実行される日時です。

この例では、一度 fstrim.service を手動で実行したため、LASTPASSEDに実行日時の記載がありますが、fstrim.service を一度も実行していない場合は、LASTPASSEDn/aになっていると思います。

fstrimコマンド実行後のログ確認

TRIMタイマーによってfstrimコマンドが実行されると、以下のログが残ります。

$ journalctl -u fstrim.service
-- Boot bd9c7c36148e41388b7d34e20ac6110f --
 1月 24 16:13:55 Xioma21 systemd[1]: Starting Discard unused blocks on filesystems from /etc/fstab...
 1月 24 16:14:00 Xioma21 fstrim[2364]: /mnt/emmc0: 47.4 GiB (50940080128 bytes) trimmed on /dev/mmcblk1p1
 1月 24 16:14:00 Xioma21 fstrim[2364]: /: 212.1 GiB (227722854400 bytes) trimmed on /dev/sda2
 1月 24 16:14:00 Xioma21 fstrim[2364]: /boot/efi: 299.1 MiB (313634816 bytes) trimmed on /dev/sda1
 1月 24 16:14:00 Xioma21 systemd[1]: fstrim.service: Deactivated successfully.
 1月 24 16:14:00 Xioma21 systemd[1]: Finished Discard unused blocks on filesystems from /etc/fstab.
$

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

Linux5.0以降のカーネルからはシングルスケジューラがなくなったので、mq-deadline になっていれば良いと思います。

$ cat /sys/block/sda/queue/scheduler 
[mq-deadline] kyber bfq none
$ 
$ cat /sys/block/mmcblk1/queue/scheduler 
[mq-deadline] kyber bfq none
$ 
$ cat /sys/block/mmcblk3/queue/scheduler 
[mq-deadline] kyber bfq none
$

現在の設定値は [] で囲まれています。

ここでは、すべて mq-deadline なので特に変更しません。

変更が必要な場合は、

# echo mq-deadline > /sys/block/sdX/queue/scheduler

で変更することができます。

スワップ領域

今回インストールしたノートPCにはメモリが4GBあるのでスワップは使っていません。
メモリが4GBというのは決して多いとは言えません。しかし、このノートPCではウェブサイトの閲覧とテキストエディタで文章を書く程度しか使ってはいないので、今のところ処理速度での問題はありません。

スワップ領域がないとハイバネート機能は使えません。

もし、SSDでスワップを使う場合、以下のコマンドでシステムの swappiness を減らして、SSDにあるスワップ領域への書き込みを減らすことが推奨されています。

# echo 1 > /proc/sys/vm/swappiness

参考

コメント

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