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 | |
|---|---|
| CPU | Apollo Lake N3450 |
| ディスプレイ | 12.5インチIPS |
| 解像度 | 1920×1080 |
| メモリ | 4GB |
| ストレージ | 64GB eMMC 256GB 2242サイズのM.2 SSD増設済 MicroSDカードスロット |
| 無線LAN | 内蔵無線LANはWindowsでも認識しなくなったので GW-US300MiniS を使用 |
TRIMの有効化
TRIMをサポートしているSSDの場合、TRIMを有効にすることが推奨されています。
TRIMの実行方法は以下の2つの方法があります。
discardマウントフラグでTRIMを有効にするfstrimコマンドで定期的にTRIMを適用する
ただし、ArchWikiではdiscardマウントフラグでのTRIMの有効化は推奨していません。
また、man fstrimにも
Running
fstrim(8) – Linux manual pagefstrimfrequently, or even usingmount -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回です。
との記載があります。
また、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 を手動で実行したため、LASTとPASSEDに実行日時の記載がありますが、fstrim.service を一度も実行していない場合は、LASTとPASSEDがn/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


コメント