FreeBSD と trim

trimの作法 で紹介されている FreeBSD forum の投稿 によれば、

  • TRIM コマンドはストレージデバイスに対するヒントであって、1Mbytes未満だと無視されることがある
  • TRIM コマンドは non-queueable であって、全ての I/O 要求が処理されてからでないと実行されないし、実行中はほかの I/O 要求が処理できない

という問題があって、ファイルシステムで TRIM 対応を有効にするのは効率がよくないことがある。 nda(4) だと kern.cam.nda.max_trim という sysctl があって、その辺対応されていたりするみたいだけど。

ではどうすればよいかということだけれども、cron とか /etc/periodic.{daily,weekly,monthly} とかを利用して、時々 TRIM をまとめて発行してくれるプログラムを実行するということになる。その場合に実行すべきコマンドは、以下の通りになる。

  • FFS では fsck_ffs -E dev
  • ZFS では zpool trim pool

なお、最初に紹介したスライドに出てくる trim(8) については、

All erased data is lost.

とか書いてあるので、データをまるごと消してしまうよう。気をつけて。