前書き
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.service
とfstrim.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は、各ファイル操作のコンポーネントとしてではなく、スケジュールされたジョブでドライブの定期的なメンテナンスを実行するために必要な重要な情報を中継することにより、優れた妥協点を提供します。