SSDの最適化(trixie版)

SSDの特性から、定期的に最適化(以下 trim)をかけないと、SSDの寿命なり、パフォーマンスがいちじるしく落ちていきます。そのため、trixie(Debian13)では、fstrim.timerというサービスが、一週間に一回trimを実行しています。

現在Raspberry Pi3,Pi4,Pi5を運用していますが、きちんと最適化が実行されているか確認します。

  • Pi3 USB2.0でIDE SSDを接続
  • Pi4 USB3.0でIDE SSDを接続
  • Pi5 PCIe Gen 2.0でNVME SSDを接続

USBで接続しているとtrimできない場合があります。今回Pi3でtrimができなかったので、その対処法も説明します。

SSDにtrimが必要な理由

そもそもSSDは、ページ単位で書き換えを行い、ブロック単位で初期化します。

更新を行うと、更新対象のページを読み込み=>内容を更新=>未使用のページに書き込み=>元ページを無効化します。

ブロックに未使用のページが無い時は、新しいブロックの空きページに書き込みを行います。

ブロックの中のページが全て無効になったら、一定のタイミングでGC(ガーベージコレクション)が走り、ブロックが破棄(初期化)され次の利用に備えます。(SSDの内部で機能的にGC(ガーベージコレクション)を行う製品もあります。

従って、SSDの空き容量が少なくなったり、負荷が高い状態が継続すると、更新が発生した時点で、ページの読み込み=>内容の更新=>無効ブロックの初期化=>空きページに更新=>元ページの無効化 と冗長な処理が都度発生し、パフォーマンスが低下していきます。

trixie(Debian13)では、無効ブロックを定期的に削除するサービスが動いています。下記のコマンドで、trimが実行されているか確認できます。赤字の通りactiveであれば一週間ごとにtrimが実行されています。

$ systemctl status fstrim.timer
● fstrim.timer - Discard unused filesystem blocks once a week
     Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; preset: ena>
     Active: active (waiting) since Sun 2026-01-04 22:01:26 JST; 6min ago
 Invocation: 8331925cc8034400ab7a7c44dd95c621
    Trigger: Mon 2026-01-05 01:18:31 JST; 3h 10min left
   Triggers: ● fstrim.service
       Docs: man:fstrim

trimの実行間隔の確認は、下記のコマンドで可能です。結果からすると毎週月曜日に稼働しているようです。

$ systemctl list-timers fstrim.timer
NEXT                          LEFT LAST                        PASSED UNIT         ACTIVATES     
Mon 2026-01-12 00:52:00 JST 6 days Mon 2026-01-05 01:11:47 JST 9h ago fstrim.timer fstrim.service

1 timers listed.
Pass --all to see loaded but inactive timers, too.

設定内容の確認は、下記のコマンドで可能です。

$ systemctl cat fstrim.timer
# /usr/lib/systemd/system/fstrim.timer
[Unit]
Description=Discard unused filesystem blocks once a week
Documentation=man:fstrim
ConditionVirtualization=!container
ConditionPathExists=!/etc/initrd-release

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

[Install]
WantedBy=timers.target

Raspberry Pi3でtrimの確認

IDE SSDをUSBのケースに入れて、USB2.0でRaspberry Pi3と接続しています。

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 004: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 005: ID 14cd:6116 Super Top M6116 SATA Bridge

赤字の通り、ベンダーIDが14cd、プロダクトIDが6116 Super Top M6116 SATA Bridgeを経由してUSBに接続されています。

trimがサポートされているか下記のコマンドで確認します。

$ lsblk --discard
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0         0        4K       4G         0
sda           0        0B       0B         0
∟sda1        0        0B       0B         0
∟sda2        0        0B       0B         0
zram0         0        4K       2T         0

赤字の通り、DISC-GRAN 0B およびDISC-MAX 0Bと表示されています。この状態は、trimがサポートされていないということです。

実際にコマンドでtrimをかけてみると

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

赤字の通り、残念ながらtrimがサポートされていないようです。

そこで、UDEVルールに、接続のSSDを追加します。フォーマットは「ACTION==”add|change”, ATTRS{idVendor}==”ベンダーID”, ATTRS{idProduct}==”プロダクトID”, SUBSYSTEM==”scsi_disk”, ATTR{provisioning_mode}=”unmap”」です。

下記の通り新しくファイルを作成し

$ sudo vi /etc/udev/rules.d/ssd-trim.rules
ACTION=="add|change", ATTRS{idVendor}=="14cd", ATTRS{idProduct}=="6116", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"

を追加します。

赤字の部分は、lsusbコマンドで出力したベンダーIDとプロダクトIDです。設定が完了したらraspberry pi3を再起動して確認します。

trim可能か下記のコマンドで確認します。

$ lsblk --discard
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0         0        4K       4G         0
sda           0      512B       4G         0
∟sda1        0      512B       4G         0
∟sda2        0      512B       4G         0
zram0         0        4K       2T         0

赤字の通りDISC-GRANおよびDISC-MAXに0B以外が表示されているので、trimが可能となりました。ここで再度trimを実行すると

$ sudo fstrim -v /
/: 104.3 GiB (111971782656 bytes) trimmed

とこれで、trimできました。

後は、fstrim.timerのサービスにより定期的にtrimが実行され、SSDの最適化が継続されます。

Raspberry Pi4でtrimの確認

IDE SSD(JMS583Gen 2 to PCIe Gen3x2 Bridge)をUSBのケースに入れて、USB3.0でRaspberry Pi4と接続しています。

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 152d:0583 JMicron Technology Corp. / JMicron USA Technology Corp. JMS583Gen 2 to PCIe Gen3x2 Bridge

赤字の通りJMS583でUSB3.0に接続されています。

trimがサポートされているかは、下記のコマンドで確認します。

$ lsblk --discard
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda           0        4K       4G         0
∟sda1        0        4K       4G         0
∟sda2        0        4K       4G         0
zram0         0        4K       2T         0

赤字の通り、DISC-GRAN 4K DISC-MAX 4Gで、trimがサポートされています。試しにtrimをかけてみると

$ sudo fstrim -v /
/: 226.1 GiB (242746011648 bytes) trimmed

赤字の通り、trimが実行されました。

後は、fstrim.timerのサービスにより定期的にtrimが実行され、SSDの最適化が継続されます。

Raspberry Pi5でtrimの確認

PCIe Gen 2.0でNVME SSDが、Raspberry Pi5と接続されています。下記のコマンドでPCIeに接続されているNVMEのSSDを確認します。

$ lspci
0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
0001:01:00.0 Non-Volatile memory controller: Realtek Semiconductor Co., Ltd. RTS5765DL NVMe SSD Controller (DRAM-less) (rev 01)
0002:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 21)
0002:01:00.0 Ethernet controller: Raspberry Pi Ltd RP1 PCIe 2.0 South Bridge

trimがサポートされているかは、下記のコマンドで確認します。

$ lsblk --discard
NAME        DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0              0        4K       4G         0
zram0              0       16K       2T         0
nvme0n1            0      512B       2T         0
∟nvme0n1p1        0      512B       2T         0
∟nvme0n1p2        0      512B       2T         0

赤字の通り、DISC-GRAN 512B DISC-MAX 2Tで、trimがサポートされています。試しにtrimをかけてみると

$ sudo fstrim -v /
/: 226.9 GiB (243657654272 bytes) trimmed

赤字の通り、trimが実行されました。

後は、fstrim.timerのサービスにより定期的にtrimが実行され、SSDの最適化が継続されます。

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