LinuxサーバーでSSDストレージの定期的なTRIMを構成する方法

前書き

SSD、またはソリッドステートドライブのアーキテクチャにより、継続的に使用すると、考慮および軽減されない場合、パフォーマンスが低下します。 TRIMコマンドは、オペレーティングシステムが、データのブロックが使用されなくなったSSDに情報を伝達できるようにする操作です。 これにより、SSDの内部システムはウェアレベリングをより適切に管理し、将来の書き込みに備えてデバイスを準備できます。 TRIMは、時間の経過に伴うデバイスのパフォーマンスと全体的な寿命に大きな影響を与える可能性があります。

Linuxで継続的なTRIMを有効にすることは可能ですが、通常のファイル操作に追加のオーバーヘッドがあるため、実際にはパフォーマンスに悪影響を与える可能性があります。 より穏やかな代替方法は、periodic TRIMを構成することです。 これにより、通常のファイル操作の必要なコンポーネントとしてではなく、スケジュールに従ってドライブをトリミングするようにオペレーティングシステムが構成されます。 ほとんどすべての場合、パフォーマンスを損なうことなく、継続的なTRIMと同じ利点を提供します。

このガイドでは、SSDとTRIMの仕組みについて簡単に説明し、さまざまなLinuxディストリビューションで定期的なTRIMを有効にする方法を示します。

SSDはどのようにデータを保存しますか?

TRIMが解決する問題をよりよく理解するには、SSDがデータを保存および管理する方法についていくつかのことを知ることが役立ちます。

データ単位

SSD上のデータは、pagesと呼ばれる固定サイズの単位で読み書きされます。 次に、ページはblocksと呼ばれる大きな単位にグループ化されます。

読み取り、書き込み、および消去の制限

SSDはページを個別に読み書きできます。 ただし、ブロックレベルでのみデータを消去できます。 もう1つの制限は、書き込みは完全にzeroed(すべてのビットが0に設定されている)のページでのみ実行できることです。 つまり、データを直接上書きすることはできません。

データを変更するには、SSDが実際に古い場所から情報を読み取り、メモリ内の情報を変更してから、変更されたデータを新しいゼロページに書き込む必要があります。 次に、内部テーブルを更新して、オペレーティングシステムに割り当てられている論理的な場所を、デバイス上のデータの新しい物理的な場所にマッピングします。 古い場所は、別の内部テーブルでstaleとしてマークされています。使用されていませんが、まだゼロにされていません。

古いページの再利用

古いページを再生するには、SSDの内部ガベージコレクションプロセスがブロックから有効なページをすべて読み取り、新しいブロックに書き込む必要があります。 繰り返しますが、論理的および物理的な場所をマッピングする内部テーブルが更新されます。 一意のまだ使用中のデータが含まれていない古いブロックは、ゼロに設定して、将来の書き込みの準備ができているとマークすることができます。

TRIMの機能

SSDの内部ガベージコレクションプロセスは、ブロックの消去とウェアレベリングの管理を担当します。 ただし、ファイルシステムは通常、独自のレコードでデータを再び使用可能なスペースとしてマークするだけで、データを「削除」します。 それらは、基礎となるストレージからデータを実際には消去しませんが、後続の書き込みでそのデータが以前に占有していた領域を上書きする可能性があります。

つまり、SSDは通常、後で同じ論理的な場所に書き込むための指示をファイルシステムから受け取るまで、ページが不要であることを認識しません。 ガーベッジコレクションルーチンを実行することはできません。データが削除されたとき、以前に予約されていたスペースが他のデータに使用されるようになったときだけ通知されるためです。

TRIMコマンドは、使用されなくなったデータに関する情報をファイルシステムからSSDに伝達します。 これにより、アイドル状態のときにデバイスが通常のガベージコレクションの役割を果たし、新しい書き込みを処理する準備ができているページがゼロになっていることを確認できます。 SSDは、事前にデータをシャッフルし、古いページをクリーンアップし、一般的にデバイスを良好な動作状態に保つことができます。

ただし、すべての削除でTRIMを実行するとコストがかかり、ドライブのパフォーマンスに悪影響を及ぼす可能性があります。 定期的なTRIMを設定すると、各操作ではなく、定期的なスケジュールで不要なページに関するデバイスのバルク情報が提供されます。

連続TRIMの無効化

デバイスがマウントされたときに、デバイスで連続TRIMがすでに有効になっている場合があります。 定期的なTRIMを有効にする前に、現在のマウントオプションを確認することをお勧めします。

連続TRIMは、discardオプションを使用してドライブまたはパーティションをマウントすることで有効になります。

まず、discardオプションで現在マウントされているファイルシステムを見つけます。

findmnt -O discard
OutputTARGET     SOURCE    FSTYPE OPTIONS
/mnt/data  /dev/sda1 ext4   rw,relatime,discard,data=ordered
/mnt/data2 /dev/sdb1 ext4   rw,relatime,discard,data=ordered

mount-o remount,nodiscardを含めることにより、discardオプションなしでこれらのファイルシステムを所定の位置に再マウントできます。

sudo mount -o remount,nodiscard /mnt/data
sudo mount -o remount,nodiscard /mnt/data2

findmntコマンドを再度実行しても、結果は表示されません。

findmnt -O discard

次に、/etc/fstabファイルを開いて、ファイルシステムに現在定義されているマウントオプションを確認します。 これらは、ブートごとにファイルシステムをマウントする方法を決定します。

sudo nano /etc/fstab

discardオプションを探し、見つかった行から削除します。

/etc/fstab

. . .
# /dev/sda1 /mnt/data ext4 defaults,nofail,discard 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
# /dev/sdb1 /mnt/data2 ext4 defaults,nofail,discard 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail 0 0

完了したら、ファイルを保存して閉じます。 これで、ファイルシステムはdiscardオプションなしでマウントされ、以降の起動でも同じ方法でマウントされます。 これで、それをサポートするすべてのファイルシステムに定期的なTRIMを設定できます。

systemdディストリビューションの定期的なTRIMのセットアップ

systemdを使用した最新のディストリビューション向けの定期的なTRIMの設定は、かなり簡単です。

Ubuntu 16.04

Ubuntu 16.04には、cronによって毎週実行されるスクリプトが付属しています。 つまり、Ubuntu 16.04では、次のセクションで説明するsystemdメソッドを有効にする必要はありません。

スクリプトを調べたい場合は、次のように入力して確認できます。

cat /etc/cron.weekly/fstrim
Output#!/bin/sh
# trim all mounted file systems which support it
/sbin/fstrim --all || true

ご覧のとおり、このスクリプトには、--allフラグが付いたバージョンのfstrimが必要です。 以前のリリースのUbuntuに同梱されている多くのバージョンfstrimには、このオプションが含まれていません。

その他のsystemdディストリビューション

他のsystemdディストリビューションの場合、定期的なTRIMはfstrim.timerファイルで有効にできます。これにより、マウントされたすべての対応ドライブでTRIM操作が週に1回実行されます。 これは、fstrim --allオプションも活用します。

これを書いている時点では、これは以下のディストリビューションに最適な方法です。

  • Debian 8

  • CentOS 7

  • Fedora 24

  • Fedora 23

  • CoreOS

CentOS 7、Fedora 23、Fedora 24、およびCoreOSの場合、fstrim.serviceおよびfstrim.timer単位がデフォルトで使用可能です。 接続されているすべての対応ドライブの毎週のTRIMをスケジュールするには、.timerユニットを有効にします。

sudo systemctl enable fstrim.timer

Debian 8ではファイルシステム内でfstrim.servicefstrim.timerを使用できますが、デフォルトではsystemdにロードされません。 最初にファイルをコピーするだけです:

sudo cp /usr/share/doc/util-linux/examples/fstrim.service /etc/systemd/system
sudo cp /usr/share/doc/util-linux/examples/fstrim.timer /etc/systemd/system

これで、他のディストリビューションと同じようにタイマーを有効にできます。

sudo systemctl enable fstrim.timer

サーバーは、操作をサポートするすべてのマウントされたファイルシステムを毎週1回TRIMする必要があります。

非systemdディストリビューションの定期的なTRIMのセットアップ

偶然にも、systemd以外のinitシステムに同梱されているほとんどのディストリビューションリリースには、--allフラグのないバージョンのfstrimユーティリティも同梱されていました。 これにより、安全な自動TRIM操作がはるかに難しくなります。

TRIMをサポートしていないドライブまたはTRIMを誤って実装するデバイスでTRIMを使用すると、危険でデータが失われる可能性があります。 --allフラグはこれらのシナリオを安全に処理できますが、接続されたドライブが操作を正しくサポートしているかどうかを手動で判断しようとすると危険な場合があります。

Ubuntu 14.04には、これを実行しようとするfstrim-allという短いスクリプトが含まれています。 cronによって実行される毎週のスクリプトがこれを実行します。 ただし、スクリプトは接続されたドライブのTRIM機能を常に正しく解釈するとは限りません。

--allフラグのないfstrimコマンドを使用するこのディストリビューションおよびその他のディストリビューションの場合、最善の回避策は、フラグを含む静的にリンクされたバージョンのfstrimをコンパイルすることです。 これは、配布管理バージョンと一緒にインストールでき、cronジョブからのみ明示的に呼び出すことができます。

これは、次のディストリビューションに最適なオプションです。

  • Ubuntu 14.04

  • Ubuntu 12.04

  • Debian 7

  • CentOS 6

Ubuntu 14.04の場合、ステータスが正しく検出されない可能性があるため、fstrim-allスクリプトの実行を無効にすることをお勧めします。

sudo chmod a-x /etc/cron.weekly/fstrim
sudo mv /etc/cron.weekly/fstrim /etc/cron.weekly/fstrim.bak

他のディストリビューションについては、すぐにジャンプできます。

ソフトウェアコンパイルツールをインストールする

まず、必要なソフトウェア構築ツールをインストールします。

UbuntuおよびDebianシステムの場合、これは次のように入力することで実行できます。

sudo apt-get update
sudo apt-get install build-essential

CentOSシステムの場合、次のように入力して同様のツールセットをインストールできます。

sudo yum groupinstall 'Development Tools'

これで、最新バージョンのfstrimをコンパイルするために必要なビルドの依存関係ができました。

ソースファイルをダウンロードして抽出する

fstrimユーティリティは、util-linuxと呼ばれるグループ内の他のツールとともにリリースされます。 リリースバージョンhereごとに整理されたソースコードを見つけることができます。

パッケージの最新バージョンをクリックします。 現時点では、それはv2.28ですが、開発が進むにつれて異なる可能性があります。

次のディレクトリ内で、ソフトウェアの最新のtarballを見つけます。 これはutil-linux-で始まり、.tar.gzで終わります。 現在、最新の安定バージョンはutil-linux-2.28.1.tar.gzです。 適切なリンクを右クリックして、クリップボードにコピーします。

サーバーに戻り、/tmpディレクトリに移動します。 curlまたはwgetユーティリティを使用し、コピーしたURLを貼り付けてファイルをダウンロードします。

cd /tmp
curl -LO https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.1.tar.gz

その後、tarballを抽出してソースディレクトリ構造を作成します。

tar xzvf util-linux*

ソースコードとビルドツールができたので、ソフトウェアをビルドできます。

静的にリンクされたfstrimの構成とコンパイル

抽出したディレクトリ構造を入力することから始めます。

cd /tmp/util-linux*

次に、ソフトウェアを構成する必要があります。 分離されたfstrimバイナリのみをインストールし、パッケージ管理システムによって管理されているユーティリティとライブラリを上書きしたくないため、静的バイナリをコンパイルします。

これを行うには、静的リンクを有効にし、共有ライブラリを無効にする必要があります。 次を入力して、これらのプロパティでソフトウェアを構成します。

./configure --enable-static --disable-shared

ソフトウェアを構成したら、次のように入力してfstrimユーティリティをコンパイルできます。

make fstrim

これにより、ユーティリティがコンパイルされ、抽出されたアーカイブの最上位ディレクトリに配置されます。

バイナリをPATHのnotであるディレクトリにコピーします。 これをcronスクリプトから呼び出すことにのみ関心があるため、他の用途でシステムにインストールされたfstrimと競合しないようにする必要があります。

/cron-binというディレクトリを作成し、そこにバイナリを配置します。

sudo mkdir /cron-bin
sudo cp /tmp/util-linux*/fstrim /cron-bin

これで、より機能的なfstrimユーティリティにアクセスできるようになりました。

fstrimを実行するためのWeekly Cronスクリプトの作成

これで、毎週cronによって実行される新しいスクリプトを作成できます。 これは、Ubuntu 16.04に含まれているスクリプトとまったく同じです。ただし、静的にコンパイルされたバイナリを配置した場所を指します。

次のように入力してファイルを作成します。

sudo nano /etc/cron.weekly/fstrim

内部に、次の行を貼り付けます。 これにより、--allオプションを指定して新しいfstrimバイナリが実行されます。

/etc/cron.weekly/fstrim

#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim --all || true

完了したら、ファイルを保存して閉じます。

次を入力して、スクリプトを実行可能にします。

sudo chmod a+x /etc/cron.weekly/fstrim

cronおよびanacronデーモンは、このスクリプトを週に1回実行して、ファイルシステムをTRIMします。

結論

Linuxサーバーは、サポートされているすべてのファイルシステムを毎週定期的にTRIMするように構成する必要があります。 TRIMは、SSDの長期的なパフォーマンスと寿命の両方を最大化するのに役立ちます。

連続TRIM操作は理想的に聞こえるかもしれませんが、通常のファイルシステム操作にかなりのオーバーヘッドを追加する可能性があります。 定期的なTRIMは、各ファイル操作のコンポーネントとしてではなく、スケジュールされたジョブでドライブの定期的なメンテナンスを実行するために必要な重要な情報を中継することにより、優れた妥協点を提供します。

Related