web-dev-qa-db-ja.com

すべてゼロを書き込むことでTRIMをエミュレートできますか?

SSDセクターの前1 に書き込まれたことがありますが、すべてゼロで埋められているように見えます。

したがって、機能の目的で、セクターにすべてゼロを書き込むと、それは無料のもののように見えます。したがって、コントローラーには、それをそのように扱う技術的な可能性があります。 ICアーキテクチャに関する私の限られた知識によると、ハードウェアに関しては、すべてのゼロの回路テストによる速度低下は、たとえあったとしても、おそらく無視できるでしょう。

問題は、フラッシュ/ SSDコントローラーが実際にこれまたは同様のものを実装しているのかということです。

USBのようにTRIMコマンドを持たないインターフェースを介して接続されたフラッシュメモリストレージにさらに適用できるように見えます。

これまでに投稿された回答の中で、数人の人々がショーストッパーの問題の可能性について概説しました。それでも、それらはすべて問題ではないことが判明しました。それらが本当に深刻な問題であるという証拠がない限り、それらが本当に深刻な問題であると正式に主張するのではなく、むしろ正直に言って、あなたはそれを仮定しているだけだと言ってください。


1論理セクター、つまりホストが見るもの。

2
ivan_pozdeev

すべてゼロを書き込むことでTRIMをエミュレートできますか?

番号。

フラッシュの仕組みは次のとおりです。

  • 未書き込みのフラッシュはすべて1であり、書き込みは1を0にプルダウンします。

  • フラッシュはページと呼ばれるバイト数で書き込まれます。2048バイトはページサイズの例です。 (64バイト程度の少量のデータもあります。これもECC情報を格納できるページの一部です)

  • 0を1に戻したい場合はどうなりますか。ページを消さないとできません。

  • フラッシュを消去すると(ページが破損していない場合はすべてのビットが1に戻ります)、消去できるバイト数(eraseblock Linux用語から借用するサイズ)は通常、ページよりも大きくなりますサイズ。消去ブロックサイズの例である128k。

  • 消去は、単にページに書き込むよりもはるかに時間がかかります。

だから:

  • SSDは、ホストにとって標準のハードドライブであるかのように見せかけます。標準のハードドライブは512バイトセクター(LBAと呼ばれ、ドライブの容量を512で割った値に0の番号が付けられます)で動作し、2048やその他のサイズでは動作しません。

  • また、SSDファームウェアは、回転するハードドライブのようにデータを保存するための512バイトの場所が実際にはないため、バックグラウンドで多くの偽造を行う必要があります。

  • 消去する必要のないページへの書き込みは、ページを消去してから書き込むよりも高速です。

SSDは、LBAからPBAへのテーブルと呼ばれるものを維持します。たとえば、オペレーティングシステムはSSDにLBA 20に書き込むように指示しますが、実際には「フラッシュチップ2ページ56」のようなものになる可能性があります。これは、LBAからPBAへのテーブルで維持されます。

SSDファームウェアは、書き込みを新しいページに転送し、必要な場合を除いて消去を回避しようとします。未書き込みのページが利用できない場合は、物事をシャッフルして、読み取り/おそらく別の場所への書き込み/消去ブロック/大量の書き込みをバックサイクルで実行する必要があります。

したがって、LBAからPBAへのテーブルは完全にランダムにすることができます。

TRIMはSSDに、このテーブルからエントリを削除し(または、「LBAはまだ書き込まれていません」とマークし)、実際にフラッシュを消去して、将来の高速書き込みに使用できるようにすることを通知します。

したがって、すべての0x00または0xFFを書き込むことが同等ではないのはこのためです。 TRIMだけがファームウェアに、そのテーブル内のものを追跡せず、フラッシュが未使用であると見なしても問題がないことを伝えます。そして、新しい書き込みに備えて消去します。

すべての0x00または0xFFの結果を書き込むと、使用していると思われるデータを追跡する完全なLBAからPBAへのテーブルになり、シャッフルして読み取り/消去/再書き込みを行う必要があるため、処理が遅くなります。

2
LawrenceC

すべてゼロを書き込むことでTRIMをエミュレートできますか?

番号。
書き込みの動作には消去されたセクターが必要であり、実際の書き込み操作が発生します。
書き込み操作は、このセクターが使用中であることをSSDに示します(実際のTRIMコマンドで必要な逆の状態)。

SSDセクターが書き込まれる前は、すべてがゼロで埋められているように見えます。

正しくない、そして明らかにあなたの質問はこの誤った前提に基づいています。
消去されたセクターは0xFFのバイト(すべて1)で埋められます。

フォーマットは伝統的にすべてのセクターにすべてゼロを書き込みます。

したがって、機能の目的で、セクターにすべてゼロを書き込むと、それは無料のもののように見えます。

いいえ、それはしません。
ファイルシステムレベルには「空き」セクターがあり、SSDレベルには「空き」セクターがあることに注意してください。理論的には同じセットである必要がありますが、SSDは、セクターが「フリー」(TRIMコマンドを使用)であることをファイルシステムから明示的に通知する必要があるため、不一致があります。

[〜#〜]補遺[〜#〜]

したがって、コントローラーには、それをそのように扱う技術的な可能性があります。 ICアーキテクチャに関する私の限られた知識によると、ハードウェアに関しては、すべてのゼロの回路テストによる速度低下は、たとえあったとしても、おそらく無視できるでしょう。

問題は、フラッシュ/ SSDコントローラーが実際にこれまたは同様のものを実装しているのかということです。

いいえ、意図しないデータ損失につながるためです。
プログラムがすべてゼロのセクターを書き込んだ場合(たとえば、メモリイメージにそのようなブロックを含めることができる場合)、SSDはセクターではなく、マップされていないセクターとして処理するため、SSDはそのセクターを破棄できます。使用中で、ファイルに割り当てられています。

結論として、提案されたスキーム(データコンテンツを使用)は機能しません。
セクターを空きまたは未使用として指定する場合は、TRIMコマンドがあります。
代替の書き込み操作はありません。

1
sawdust

実際、消去されたSSDセクターは、ゼロではなく1で埋められます。 SSDセクター(トリミングするSSD上の実際の物理セクター)とディスクセクター(SSDが管理マジックを実行した後にファイルシステムに提示する論理セクター)を混同しています。論理セクターをゼロで埋めると、SSDに消去された物理SSDセクターが割り当てられ、ゼロで埋められるため、問題が発生します。

論理セクターがトリミングされると、SSDはその論理セクターにマップされているすべての物理セクターのマップを解除します。チャンスがあれば、それらを消去し、1で埋めます。消去されると、消去された物理セクターのプールに追加されます。トリミングの目的は、消去された物理セクターのプールを拡大することです。

対応する物理セクターがない論理セクターを読み取ると、ドライブはゼロのページを返します。ただし、物理セクターを読み取る必要はありません。また、物理セクターがマップされていないため、読み取る必要もありません。

詳細については、 ここ を参照してください。

1
David Schwartz