Linux のファイルシステムにおいて “discard” マウントオプションとは TRIM を行うようにするオプションです。ファイルシステム上の解放されたファイルブロックをデバイスに通知します。 SSD や仮想マシンのディスクイメージのパフォーマンス低下抑制に有効なオプションです。
Linux カーネルバージョン 5.6 以降、ファイルシステム “discard” マウントオプションがサポートされました。Btrfs ファイルシステムではカーネル 6.2 からは非同期 discard がデフォルトとなりました。
discard オプションとは
SSD や一部の仮想マシン・ディスクイメージはファイルシステム上で削除が実行されていてもデバイス上ではデータがきっちり残っています。SSD は磁力で上書きできる HDD と違い、新たにデータを書き込むにはそのメモリセルのデータを破棄しなければ再利用できません。
このため、未使用領域が無くなってしまったとき、 SSD のコントローラが削除しても良い領域を探し回る時間が生まれてしまいます。この使われていないブロック・削除しても良い領域をファイルシステムが SSD に事前に知らせることを TRIM と呼びます。TRIM を行うと SSD は効率的に削除可能な領域を計算できるのでパフォーマンスの低下を抑制し、特定のセルへ書き込みが集中するのを抑制してくれます。したがいましてデバイスの寿命を延ばすこともできる、とされています。
“discard” オプションではこの TRIM コマンドをどのタイミング実行するか選ぶことが出来ます。
まあと言っても2つのモードしかありません。
同期モード (sync)
同期モードは、データの破棄(TRIM)が即座に行われ、データが削除されたブロックはすぐに再利用可能となります。
しかし、同期モードには一つの重要な制約があります。それは、バックエンドのストレージデバイスが非同期なTRIM(キューイングされたTRIM)をサポートしていない場合、性能が低下する可能性があるということです。
そもそもの問題、データ破棄範囲が狭すぎると SSD のコントローラが無視する可能性が高いそうでこのモードの使い勝手はなかなか難しそうです。
非同期モード (async) デフォルト設定
TRIM データをある程度まとめる、いわゆるバッチ処理をしてからデバイスに送信します。このため同期モードと比べオーバーヘッドと性能への影響が少ないのが特徴です。
“discard” オプションに設定を付与しなかった場合、”discard=async” がデフォルトになります。
要するに、同期モードは即座にデータの破棄を行うモードであり、非同期モードはデータを効率的に破棄するためのモードであり、どちらを選ぶかはバックエンドのデバイスと性能要件に依存します。
実際には TRIM データを受け取ってそれをどう扱うかはデバイスのコントローラ、ロジックチップに委ねられています。チップの品質と組み込まれたアルゴリズムでパフォーマンスの差が露骨に出ます。
参考: BTRFS Documentation – man5 – Mount Options
“discard” が必要ないケースも
一部のサイトでは SSD 側で OP (オーバープロビジョン) されていれば “discard” オプションは必要ないとされています。 TRIM と同じような役割を担ってくれるからです1。
OP を設定できるメーカー提供のソフトウェアは Windows 専用のものがほとんどなため、 Linux 上でお手軽に設定する方法はありませんが、 hdpram コマンドを使えば HPA (Host Protected Area) という似た予約領域を設定することが可能なようです。
ただ、HPA 設定を行ってもほとんどのディストリビューションでは無視されるため設定が必要になってきます。
参考:
・Spinics Linux Mailing List Archive – Re: Best way (only?) to setup SSD’s for using TRIM
・Thomas-Krenn Wiki – SSD Over-provisioning using hdparm
fstrim.timer は必要なのか?
fstrim.timer は systemd に組み込まれている週一で TRIMコマンドを実行するサービスです。この記事を読んでいて Linux をそれなりに使った経験がある方ならば、おやおや?と思うかもしれません。
“discard” と fstrim どっちが良いのか、もしくは両方必要なのか、ここらへん議論が割れているようです。
Btrfs 以外の複数種類のファイルシステムを利用している場合は fstrim をつかう必要が出てくるかもしれませんが、個人的にはそろそろ必要なくなってくるでは?と思っています。 fstrim.timer が有効になっているとスリープモードに入るのに時間がかかるなどの報告もあります。
また、 fstrim のマニュアルによれば TRIM のしすぎは低品質なコントローラを搭載した SSD の寿命を縮める可能性があるようです。ほとんどのデスクトップやサーバでは週 1 回くらいが望ましいとのこと。2ですので、なおさら重複してる機能を使うのはおかしいと考えます。
しかし、このサービスもほとんどのディストリビューションでは有効になっているので、まだ必要なサービスなのかもしれません。それに Btfs のマニュアルでも fstrim も使ってもいいよと書いてあるので併用しても大きな害はないものと思われます。
ご自身で判断がつかない場合はとりあえずディストリビューションのデフォルト設定のままで良いのではないでしようか。ややこしいので早く TRIM の管理方法を 1 つに統合してほしいものです。
おわり
コメント