fstrimは、パーティションがdiscardでマウントされているにもかかわらず、パーティションサイズの半分以上をトリミングします


8

SSDを取り付けたとき、マウントしただけでdiscard発汗しませんでした。しかし、今日私はfstrim代わりに使用することの長所と短所について読んでいて、実際にかかる時間を知るためにプログラムを実行することを決めました(パーティションをでマウントしたままdiscard)。このコマンドは、ルートパーティションとホームパーティションの両方で数分かかりました。私のホームパーティション-vでは、これを使用してこれを取得しました。

$ sudo fstrim -v /home
/home: 137494052864 bytes were trimmed

これは、パーティションの空き容量を超えています!

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       206G   78G  118G  40% /home

後続の実行は1秒未満で終了します。例:

$ sudo fstrim -v /home
/home: 0 bytes were trimmed

確かに、パーティションを常にでマウントしていた場合discardfstrimそのような大量のデータをトリミングしないでください。このdiscardオプションは確実に有効になっています。関連するfstab行は次のとおりです。

UUID=xxxxxxxx...    /          ext4   noatime,discard,errors=remount-ro  0      1
UUID=xxxxxxxx...    /home      ext4   noatime,discard,errors=remount-ro  0      2

そしてmount出力行:

/dev/disk/by-uuid/xxxxxxxx... on / type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)
/dev/sda2 on /home type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)

SSDは東芝THNSNS256GMCPです。なぜこれが起こるのですか?

回答:


12

ここで2つのこと:

  1. fstrimファイルシステムで割り当てられていないすべてのデータをトリムします(まあ、実際にはすべてのデータではなく、割り当てられていないデータブロックのみです。iノードテーブルの未使用部分または完全に使用されていないブロックの部分はトリミング済み)discardは、使用中かどうかに関係なく。fstrimそれらの未割り当てブロックのどれが「トリミング」されたか、または過去にまだないかを知ることはできませんが、それは(実際にはカーネル、すべてのfstrim作業はで行われますFITRIM ioctl)ただし、どのブロックグループを追跡します トリムされており、それ以降、そのブロックグループに未割り当てがない場合、それらを再度トリムしません。ただし、最小エクステント長が短いFITRIMをリクエストしない限り(ext4コードのチェックから、他のものとは異なる場合があります)ファイルシステム)は、次の実行で0になる理由を説明しています。

    既にトリミングされているブロックをトリミングしても害はありません。それはちょうどSSDを語っていますもう一度(何か他のもののために再び使用する準備ができるように、消去と同じように)それはそれで欲しいものは何でも行うことができます。

  2. ではdf、出力、「利用可能」値は、アカウントには、「予約」されたスペースをとらないroot76 130G、118Gではないです-あなたは206であることに気づくでしょう。12G(約5%)は予約されています。tunefs -m予約される量を変更するために参照してください。

1
それで、fstrimすでに何がトリミングされているのかわからない場合、2回目に0バイトが報告されるのはなぜですか?確かにこれはディスクからのものである必要がありますが、それではなぜそのような大きなトリムが初めて報告されるのでしょうか?確かにディスクがいるかどうかに依存しないだろうdiscardか、trim使用されていました。
Graeme 2014年

1
@ Graeme、argh、良い点。fstrimはFITRIM ioctlを使用し、すべての作業を実行して結果をfstrimに報告するカーネルです。カーネルはすでにトリミングされたものを追跡していると思いますが、ブートされてからしかそれができません。回答を調査して更新します。
ステファンChazelas

1
はい、はい、カーネルはブート以降にトリミングされたものを追跡する必要があります。再起動して別のを実行するとfstrim、ほぼ同じ出力が得られます。
Graeme 2014年

@Graeme、私の編集を見てください。
ステファンChazelas

1
fstrim適切なを発行するだけでioctl、他のすべてはファイルシステムの決定であり、ファイルシステムの動作は大きく異なります。ext4同じものを何度もトリミングすることを避けようとし、xfs無料のすべてを気にせずにトリミングします。他の人が他のことをするかもしれません-まったくサポートしていれば...予測できない場合は、ファイルシステムに文句を言います。
frostschutz 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.