SSD上のBtrFSでTRIMサポートを確認する


21

SSDディスクのアレイでBtrFSを使用することを検討しており、BtrFSが実際にファイルの削除時にTRIM操作を実行することを確認するように求められました。これまでのところ、TRIMコマンドがディスクに送信されたことを確認できませんでした。

BtrFSは本番環境とは見なされていませんが、私たちは最先端を好むので、テストしています。サーバーはUbuntu 11.04サーバー64ビットリリース(mkfs.btrfsバージョン0.19)です。Linux 3.0.0カーネルをインストールしました。BtrFSの変更ログには、Ubuntu 11.04(2.6.38)に同梱されているカーネルではバルクTRIMを使用できないことが示されているためです。

これが私のテスト方法です(最初はhttp://andyduffell.com/techblog/?p=852から採用され、BtrFSで動作するように修正されています):

  • 開始する前にディスクを手動でトリムします。 for i in {0..10} ; do let A="$i * 65536" ; hdparm --trim-sector-ranges $A:65535 --please-destroy-my-drive /dev/sda ; done
  • ドライブがTRIMされたことを確認します。 ./sectors.pl |grep + | tee sectors-$(date +%s)
  • ドライブをパーティション分割します。 fdisk /dev/sda
  • ファイルシステムを作成します。 mkfs.btrfs /dev/sda1
  • マウント: sudo mount -t btrfs -o ssd /dev/sda1 /mnt
  • ファイルを作成します。 dd if=/dev/urandom of=/mnt/testfile bs=1k count=50000 oflag=direct
  • ファイルがディスク上にあることを確認します。 ./sectors.pl | tee sectors-$(date +%s)
  • テストファイルを削除します。 rm /mnt/testfile
  • テストファイルがディスクからTRIMされていることを確認します。 ./sectors.pl | tee sectors-$(date +%s)
  • TRIMされたブロックの確認:diff最新の2つのsectors-*ファイル

この時点で、削除前と削除後の検証では、使用中の同じディスクブロックが引き続き表示されます。代わりに、使用中のブロックの数が減少するはずです。テストファイルが削除されてから1時間待機すると(TRIMコマンドの発行に時間がかかる場合)、使用中の同じブロックが表示されます。

私も-o ssd,discardオプションでマウントしようとしましたが、それはまったく役に立たないようです。

fdisk上から作成されたパーティション(検証が速くなるようにパーティションを小さくします):

root@ubuntu:~# fdisk -l -u /dev/sda

Disk /dev/sda: 512.1 GB, 512110190592 bytes
255 heads, 63 sectors/track, 62260 cylinders, total 1000215216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6bb7542b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1              63      546209      273073+  83  Linux

私のsectors.plスクリプト(これは非効率的ですが、仕事は完了します):

#!/usr/bin/perl -w

use strict;

my $device = '/dev/sda';
my $start = 0;
my $limit = 655360;

foreach ($start..$limit) {
    printf "\n%6d ", $_ if !($_ % 50);
    my @sector = `/sbin/hdparm --read-sector $_ $device`;
    my $status = '.';
    foreach my $line (@sector) {
            chomp $line;
            next if $line eq '';
            next if $line =~ /$device/;
            next if $line =~ /^reading sector/;
            if ($line !~ /0000 0000 0000 0000 0000 0000 0000 0000/) {
                    $status = '+';
            }
    }
    print $status;
}
print "\n";

テスト方法に欠陥はありますか?ここに何かが足りませんか?

助けてくれてありがとう。


1
実際に、あなたは、修正の事を知っていることを、私は完全にエッジの事を出血テストサポートしていますが、あなたが知っているだけのように今のように、のbtrfsは、fsckを持っていません:btrfs.wiki.kernel.org/index.php/Main_Pageを -そう気をつけてください。
マットシモンズ

@Matt-欠落しているfsckについての良い点。私の理解では、fsckの最初のバージョンは今後数週間以内に出荷されるはずであるため、これを実稼働に移行するまでにカバーする必要があります。さらに、データのコピーが複数あるため、1つのコピーを失った場合、少なくとも2つのコピーを復元する必要があります。しかし、これは今のところかけがえのないデータを持つ人々のファイルシステムではないことに完全に同意します。
シェーンマイヤーズ

1
おそらく何も変更しませんがsync、ファイルをrmmingした後にを実行してみてください。
zebediah49

syncファイルを削除してからを実行してみたが、結果は同じままだったと言いたい。週末が終わった後、私がオフィスに戻ったとき、私はそれを再確認します。
シェーンマイヤーズ

最先端を気にしないなら、zfsonlinux.orgを検討したことがありますか?Linux用のネイティブ(ヒューズではなくカーネル内)ZFS。彼らは公式の「リリース」に近づいており、RCが利用可能です(UbuntuのPPAを含む-debianでも簡単に再構築できます)
cas

回答:


4

そのため、これに何日も取り組んだ後、BtrFSがTRIMを使用していることを実証することができました。これらのSSDを展開するサーバーでTRIMを正常に動作させることができませんでした。ただし、ラップトップに接続された同じドライブを使用してテストする場合、テストは成功します。

このすべてのテストに使用されるハードウェア:

  • Crucial m4 SSD 512GB
  • HP DL160se G6
  • LSI LSISAS9200-8e HBA
  • 汎用SASエンクロージャ
  • Dell XPS m1210ラップトップ

サーバーでBtrFSの検証に何度も失敗した後、古いラップトップを使用して同じテストを試してみることにしました(RAIDカードレイヤーを削除します)。ラップトップでExt4とBtrFSの両方を使用したこのテストの最初の試行は失敗します(データはTRIMされません)。

次に、SSDドライブのファームウェアをバージョン0001(出荷時の状態)からバージョン0009にアップグレードしました。Ext4とBtrFSでテストを繰り返し、両方のファイルシステムでデータを正常にTRIMしました。

TRIMコマンドの実行時間を確保するために、rm /mnt/testfile && sync && sleep 120検証を実行する前に実行しました。

この同じテストを試みている場合、SSDには動作する消去ブロックがあります(Crucial m4消去ブロックのサイズはわかりません)。ファイルシステムがTRIMコマンドをドライブに送信すると、ドライブは完全なブロックのみを消去します。ブロックの一部にTRIMコマンドが指定されている場合、消去ブロック内の有効なデータが残っているため、そのブロックはTRIMされません。

だから、私が話していることを実証するために(sectors.pl上記のスクリプトの出力)。これは、SSD上のテストファイルにあります。期間は、ゼロのみを含むセクターです。プラスには、1つ以上のゼロ以外のバイトがあります。

ドライブ上のテストファイル:

24600 .......................................+++++++++++
24650 ++++++++++++++++++++++++++++++++++++++++++++++++++
24700 ++++++++++++++++++++++++++++++++++++++++++++++++++
    -- cut --
34750 ++++++++++++++++++++++++++++++++++++++++++++++++++
34800 ++++++++++++++++++++++++++++++++++++++++++++++++++
34850 +++++++++++++++++++++++++++++.....................

ドライブから削除されたテストファイル(aの後sync && sleep 120):

24600 .......................................+..........
24650 ..................................................
24700 ..................................................
    -- cut --
34750 ..................................................
34800 ..................................................
34850 ......................+++++++.....................

ファイルの最初と最後のセクターは、ファイルの他の部分とは異なる消去ブロック内にあるようです。したがって、一部のセクターはそのまま残されました。

持ち帰り用の形式:Ext4 TRIMのテスト手順の中には、ファイルから最初のセクターがTRIMされたことのみを確認するようユーザーに求めるものがあります。テスターは、テストファイルの大部分を表示して、TRIMが成功したかどうかを確認する必要があります。

RAIDカードを介してSSDに送信された手動で発行されたTRIMコマンドは機能するが、自動TRIMコマンドは機能しない理由を理解するために...


すべてのHW RAIDはトリムコマンドを使用していると思いました。一方、優れた最新のドライブでは、TRIMの重要性は低下しています。
ロナルドポトル

4

私が読んだものに基づいて、あなたの方法論に欠陥があるかもしれません。

TRIMにより、削除されたブロックがSSDによってゼロ化されると想定しています。しかし、これは多くの場合そうではありません。

SSDがTRIMを実装して、破棄されたブロックをゼロにする場合のみです。デバイスが少なくともdiscard_zeroes_dataを報告するのに十分であるかどうかを確認できます。

cat / sys / block / sda / queue / discard_zeroes_data

また、SSDがゼロになったとしても、SSDが実際にブロックをゼロにするには、破棄が完了してからしばらく時間がかかる場合があります(これは品質の低いSSDにも当てはまります)。

http://www.redhat.com/archives/linux-lvm/2011-April/msg00048.html

ところで私はTRIMを検証するための信頼できる方法を探していましたが、まだ見つかりませんでした。誰かが道を見つけたら知ってほしい。


3

ここに10.10とEXT4のテスト方法があります。たぶんそれが役立つでしょう。

/ubuntu/18903/how-to-enable-trim

ああ、私はあなたがfstabマウントで廃棄パラメータを必要とすると思う。SSDを自動検出する必要があると思うので、SSDパラメータが必要かどうかはわかりません。


2
Ext4 SSDの検証手順に従うことを試みましたが、他のファイルシステムと比較してBtrFSの動作が異なるため、動作しません。したがって、私が思いついたワークフロー。私は使用ssdのbtrfsは、それが自動検出しなければならないにもかかわらず、そのSSD固有のコードを使用することを知っていたことを確認するために、マウントオプションを。また、discard(上記のように)使用してみましたが、役に立ちませんでした。
シェーンマイヤーズ

しかたがない。ショットに
値する

1

btrfsの場合discard、TRIMサポートを有効にするオプションが必要です。

機能的なTRIMの非常に簡単ですが動作するテストはこちらです:http : //techgage.com/article/enabling_and_testing_ssd_trim_support_under_linux/2


1
上で述べたように、discardオプションとオプションの両方でテストを試みssdました。BtrFSのドキュメントではこのssdオプションについて多く言及されているので、そこでテストに焦点を当てましたが、どちらのオプションも期待した結果になりませんでした。TRIMのテスト方法を示すほとんどのWebページは、Ext4などに対応しています。ファイルシステムの設計の違いにより、BtrFSはこれらの方法論を使用してテストできません。
シェーンマイヤーズ

hdparm --fibmapFSに依存しません。与えられたLBAアドレスのブロックはどちらかそれのEXTN、のbtrfs、XFS、JFSかどうか...、ゼロに、またはされていないssdオプションは、トリムは無関係である、例えばメーリングリストのbtrfsにこの議論を参照してください。mail-archive.com/linux-btrfsを@ vger.kernel.org / msg10932.html
パウェウブロダッキ

使用してみましたhdparm --fibmapが、BtrFSでは機能しません。ワイパー.shのREADME(hdparmと一緒に配布されています)を見ると、「FIEMAP / FIBMAP ioctl()呼び出しはbtrfsファイルシステムで使用すると完全に安全ではない」と明示的に述べられています。hdparmがリリースされましたが、テストが非常に簡単になるため、これはあまりにも悪いことです。ssdドキュメントはオプションの有用性についてあまり明確ではないので、オプションがTRIMとは何の関係もないことを知りませんでした。
シェーンマイヤーズ

ioctlに関する追加情報をありがとう、私はそれを知りませんでした。追加情報を求めるのに最適な場所は、btrfsメーリングリストかもしれません。そこから直接情報を入手できます。
パウェウブロダッキ

1

考えるべきいくつかのこと(「何かが足りない」という質問に答えるのを助けるため)

  • / dev / sdaとは正確には何ですか?単一のSSD?または(ハードウェア?)SSDのRAIDアレイ?

  • 後者の場合、どのようなRAIDコントローラーですか?

  • RAIDコントローラーはTRIMをサポートしていますか?

そして最後に、

  • / dev / sda1をbtrfs以外のものでフォーマットした場合、テスト方法は期待する結果をもたらしますか?

1

SATAインターフェースを備えた実質的にすべてのSSDは、ユーザーから完全に隠された何らかのログ構造ファイルシステムを実行します。SATAの「トリム」コマンドは、ブロックが使用されていないこと、および基礎となるログ構造ファイルシステムが/ if /対応する消去ブロック(かなり大きい可能性があります)/ only /がトリムでマークされたブロックを含むことをデバイスに伝えます。

http://t13.org/Documents/MinutesDefault.aspx?keyword=trimにある標準ドキュメントを読んでいませんが、標準レベルの保証があるかどうかはわかりません。トリムコマンドの結果を参照してください。消去ブロックの開始時に最初の数バイトがゼロになるなど、何か変更が見られる場合、これが異なるデバイス間で、またはファームウェアバージョン間でも適用できる保証はないと思います。

抽象化の実装方法について考える場合、トリムコマンドの結果を、ブロックの読み取り/書き込みを行うだけでは完全に見えないようにする必要があります。さらに、フラッシュ変換レイヤーだけがそれを知る必要があり、それらを論理的に並べ替えた可能性があるため、どのブロックが同じ消去ブロックにあるかを判別するのは難しいかもしれません。

おそらく、SSDフラッシュ変換レイヤーに関連するメタデータを取得するためのSATAコマンド(おそらくOEMコマンド?)がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.