LinuxサーバーでSSDストレージ用に定期的なTRIMを構成する方法
序章
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を有効にする前に、現在のマウントオプションを確認することは理にかなっています。
連続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
これらのファイルシステムは、 discard
オプション、含めることにより -o remount,nodiscard
と mount
:
- 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
オプションを選択し、見つけた行から削除します。
. . .
# /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
ご覧のとおり、このスクリプトには次のバージョンが必要です。 fstrim
とともに --all
国旗。 多くのバージョン fstrim
以前のリリースのUbuntuに同梱されているものには、このオプションは含まれていません。
その他の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.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する必要があります。
非システム化ディストリビューション用の定期的なTRIMの設定
偶然にも、systemd以外のinitシステムに同梱されているほとんどのディストリビューションリリースには、 fstrim
を持っていなかったユーティリティ --all
国旗。 これにより、安全な自動TRIM操作がはるかに困難になります。
TRIMをサポートしていないドライブ、またはTRIMを誤って実装しているデバイスでTRIMを使用すると、危険であり、データが失われる可能性があります。 The --all
flagはこれらのシナリオを安全に処理できますが、接続されたドライブが操作を正しくサポートしているかどうかを手動で判断しようとすると危険な場合があります。
Ubuntu 14.04では、 fstrim-all
これを行おうとするが含まれています。 によって実行される毎週のスクリプト cron
これを実行します。 ただし、スクリプトは、接続されたドライブのTRIM機能を常に正しく解釈するとは限りません。
これと他のディストリビューションのために fstrim
なしのコマンド --all
フラグ、最善の回避策は、静的にリンクされたバージョンの 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
.
ソースファイルをダウンロードして抽出する
The 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
中に、次の行を貼り付けます。 これは私たちの新しいを実行します fstrim
とのバイナリ --all
オプション:
#!/bin/sh
# trim all mounted file systems which support it
/cron-bin/fstrim --all || true
終了したら、ファイルを保存して閉じます。
次のように入力して、スクリプトを実行可能にします。
- sudo chmod a+x /etc/cron.weekly/fstrim
The cron
と anacron
デーモンは、このスクリプトを週に1回実行して、ファイルシステムをTRIMします。
結論
これで、Linuxサーバーは、サポートされているすべてのファイルシステムを毎週定期的にTRIMするように構成されているはずです。 TRIMは、SSDの長期的なパフォーマンスと寿命の両方を最大化するのに役立ちます。
継続的なTRIM操作は理想的に聞こえるかもしれませんが、通常のファイルシステム操作にかなりのオーバーヘッドを追加する可能性があります。 定期的なTRIMは、各ファイル操作のコンポーネントとしてではなく、スケジュールされたジョブでドライブの定期的なメンテナンスを実行するために必要な重要な情報を中継することにより、優れた中間点を提供します。