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

提供:Dev Guides
移動先:案内検索

序章

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

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

このガイドでは、SSDとTRIMがどのように機能するかを簡単に説明してから、さまざまなLinuxディストリビューションで定期的なTRIMを有効にする方法を示します。

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

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

データユニット

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

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

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

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

古いページの再生

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

TRIMは何をしますか?

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

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

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

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

継続的なTRIMの無効化

デバイスがマウントされたときに、デバイスで継続的なTRIMをすでに有効にしている可能性があります。 定期的なTRIMを有効にする前に、現在のマウントオプションを確認することは理にかなっています。

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

まず、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

-o remount,nodiscardmountに含めることにより、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ファイルで有効にできます。このファイルは、すべての対応するマウントされたドライブで週に1回TRIM操作を実行します。 これは、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

Debian8ではファイルシステム内で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する必要があります。

非システム化ディストリビューション用の定期的な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というグループの他のツールとともにリリースされます。 ソースコードはリリースバージョン別に整理されており、ここにあります。

パッケージの最新バージョンをクリックします。 現時点では、それは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内のではなくであるディレクトリにバイナリをコピーします。 これはcronスクリプトからのみ呼び出すことに関心があるため、他の用途でシステムにインストールされているfstrimと競合しないようにする必要があります。

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

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

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

fstrimを実行するための毎週のcronスクリプトを作成する

これで、cronによって毎週実行される新しいスクリプトを作成できます。 これは、静的にコンパイルされたバイナリを配置した場所を指すことを除いて、Ubuntu16.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は、各ファイル操作のコンポーネントとしてではなく、スケジュールされたジョブでドライブの定期的なメンテナンスを実行するために必要な重要な情報を中継することにより、優れた中間点を提供します。