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

前書き

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

Linuxで継続的なTRIMを有効にすることは可能ですが、通常のファイル操作に追加のオーバーヘッドがあるため、実際にはパフォーマンスに悪影響を与える可能性があります。 より穏やかな代替手段は、_定期的な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
 /dev/sda1 ext4   rw,relatime,,data=ordered
/dev/sdb1 ext4   rw,relatime,,data=ordered

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

sudo mount -o remount,nodiscard
sudo mount -o remount,nodiscard

`+ findmnt +`コマンドを再度実行した場合、結果は表示されません。

findmnt -O discard

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

sudo nano /etc/fstab

`+ discard +`オプションを探し、見つけた行から削除します:

/ etc / fstab

. . .
/dev/sda1 /mnt/data ext4 defaults,nofail, 0 0
/dev/sda1 /mnt/data ext4 defaults,nofail 0 0
/dev/sdb1 /mnt/data2 ext4 defaults,nofail, 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を有効にすることができます。これは、週に1回、マウント可能なすべてのドライブでTRIM操作を実行する `+ fstrim.timer `ファイルで実行できます。 これは、 ` 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 +`というグループの他のツールとともにリリースされます。 ソースコードは、リリースバージョン別に整理されています(https://www.kernel.org/pub/linux/utils/util-linux/ [こちら])。

パッケージの最新バージョンをクリックします。 現時点では、それは「+ 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//util-linux-.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は、各ファイル操作のコンポーネントとしてではなく、スケジュールされたジョブでドライブの定期的なメンテナンスを実行するために必要な重要な情報を中継することにより、優れた妥協点を提供します。