TRIM

TRIMコマンド（ATAコマンドセット：TRIM、SCSIコマンドセット：UNMAP）は、オペレーティングシステムからソリッドステートドライブ（SSD）の未使用領域を内部的に消去するために用いられるコマンドである。 SSDの登場から間もなくTRIMコマンドが登場した。 SSDへのハードウェア的な操作は、従来のハードディスクドライブとは大きく異なるため、オペレーティングシステムから削除やフォーマットなどの操作を従来通り行った場合に、書き込み操作で予期せず段階的なパフォーマンス低下が発生した。TRIMの実行により、SSDはガベージコレクションをより効率的に処理できる。実行しない場合は、書き込み動作が遅延する可能性がある。 一部のドライブにおいては、工場出荷状態にリセットするツールは、TRIMの導入前から存在していたが、ドライブ上のすべてのデータも削除されるため、使用中に最適化のために使用することは現実的ではない 。また、2014年までには多くのSSDに対し、TRIMとは独立して機能する、バックグラウンドガベージコレクションメカニズムが搭載されるようになった。これにより、TRIMをサポートしていないOSでもパフォーマンスが維持できるようになったが、 ライトアンプリフィケーションが発生しやすくなる上、フラッシュセルの寿命を縮める欠点が存在した。 多くのファイルシステムでは削除操作を処理する場合、データブロックに「未使用」のフラグを立てる 。これにより、いずれのストレージメディアでもどの領域が本当に使用中であるかに関わらず、空きスペースとして領域を使用できる。上書き操作とは異なり、削除操作時においては、データを含むセクターへの物理的な書き込みは行われない。一般的なSSDにおいては、未使用の領域のリストを含むファイルシステム構造を処理せず，そのまま書き込み動作を行うため、メディア側では領域が使用可能になったことは認識されない。 これにより、ハードディスクなどでは、削除されたファイルを復元するツールが利用できるようになっている 。つまり、いずれのメディアの場合でも、未使用領域を使用したという場合でも上書き操作が行われている可能性が存在する。 磁気ディスクの場合、空のセクターへの書き込みと上書き操作に相違はないが、一部のSSDは機能の実装が最低レベルであるため、上書きは完全未使用の領域にデータを書き込む場合に比べて大きなオーバーヘッドを生じ、書き込みパフォーマンスを損なう可能性がある 。 SSDは、通常4〜16 kiB単位でグループ化されたフラッシュメモリのセルにデータを格納し、通常それを128〜512ページのブロックにグループ化する 。NANDフラッシュメモリセルの場合、領域が完全に空の場合にのみ書き込み操作が実行できる。データが残存している可能性がある場合、書き込み操作の前に領域を消去する必要がある。SSDへの書き込み操作はページ単位で実行できるが、ハードウェアの制限により、消去は常にブロック全体に対して実行される。よって、SSDの空の領域への書き込み操作は非常に高速だが、以前に使用された領域を上書きする必要がある場合、遅延が発生する。 再度書き込む前にページ内のセルの消去が必要となるが、消去できるのはブロック全体であるので、上書きすると読み取り-消去-変更-書き込みサイクルが実行される 。削除対象のブロックに存在するデータ全体が一旦キャッシュに保存され、ブロック全体を消去し、上書きされた部分がキャッシュに書き込まれる。その後、更新されたブロック全体をフラッシュメディアに書き込む。この現象はライトアンプリフィケーションとして知られている 。 TRIMコマンドを使用すると、オペレーティングシステムは、使用しなくなったページをSSDに通知できる。ファイル削除操作の場合、オペレーティングシステムはファイルのセクターを空き領域としてマークし、TRIMコマンドをSSDに送信する。その後新しいデータを書き込むときににSSDはブロックの内容を保持しないため、書き込み量を少なくすることとなり、書き込みスループットが高くなる。よって、寿命を延ばすことが期待できる。 ただし、SSDによってコマンドの実装方法が異なるため、得られるパフォーマンスが異なる場合がある 。 TRIMはSSDにLBA領域を無効としてマークするように指示し、その後に領域の読み取りを行ったとしても意味のあるデータを返さなくなる。非常に短い間、データが依然としてフラッシュメモリ内に存在する可能性があるが、TRIMコマンドが発行されてガベージコレクションが実行された後は、専門家でさえデータを回復できる可能性はほぼないとされている。 TRIMコマンドの発行は、サポートされているオペレーティングシステムでのみ実行される。以下の表は、オペレーティングシステムと、コマンドをサポートする最初のバージョンを示している。さらに、ATA規格にTRIMコマンドが追加されるよりも前に設計された古いSSDでは、ファームウェアの更新が必要となる。更新されていない場合、新しいコマンドは無視される。ただし、すべての古いSSDでTRIMコマンドをサポートするアップデートが準備されているわけではない。 空き領域を正しく理解しているプログラムだけが安全にコマンドを発行できるため、TRIMのサポートは、ファイルシステムドライバーによっても異なる。 2017年1月 (2017-01)現在[update], TRIMコマンドへのサポートはほとんどすべてのハードウェアRAIDにおいては実装されていない。しかし、ソフトウェアRAID の場合はサポートされている場合がある。 Windows 10では、RAIDボリュームの構成時に「ドライブの最適化」のオプションを使用することで、SSDを含むRAIDボリュームでもTRIMをサポートする。 macOSの標準RAIDドライバーはTRIMをサポートしていない。この問題は、少なくとも10.7からmacOS 10.12.xまでのすべてのバージョンで該当する。 アップル以外製SSDでのTRIMサポートを含むサードパーティのSoftRAID®アプリケーションを使用する場合、TRIMはRAID（0、1、4、5、10）ボリュームでサポートされる。ただし、ターミナルコマンド「sudo trimforce enable」を使用して明示的に有効にする必要がある。 TRIMは、Linuxカーネル内のdmraid（英語版）において、2011年1月以降のリリースで使用可能となった。これは、BIOSによる「偽のハードウェアRAID」へのサポートであり、RAID上にあるファイルシステムからのTRIMリクエストを透過的に処理する。 Linuxの汎用ソフトウェアRAIDシステムであるmdraid（英語版）では、システムがファイルシステムでmdtrimユーティリティを定期的に実行するように構成されている場合、RAID 1上でバッチベース（ファイル削除時実行）のTRIMを試験的にサポートしている。Red Hat Enterprise Linux 6.5以降などのLinuxの新しいバージョンでは、mdraidは、単なるバッチジョブとしてではなく、実際にTRIMコマンドをリアルタイムで渡すことをサポートしている。 しかし、Red HatはソフトウェアRAIDのうち1、4、5、6を使用しないことを推奨しており、理由として、ほとんどのRAID管理ユーティリティ（Linuxにおけるmdadm（英語版）など ）での初期化時にデバイスのすべてのブロックに書き込み処理を行い、チェックサム（またはRAID 1/10の場合はドライブ間の検証）が適切に動作することを確認するためである。これにより、SSDにおいてはスペア領域以外のすべてのブロックが使用中の場合、パフォーマンスが大幅に低下する。 一方、Red Hatは、TRIM（Linux用語では「破棄」）をサポートしており、LVMユーティリティは作成時にすべてのブロックに対する書き込み処理を行わないため、SSD上のLVM RAIDに対してはRAID 1またはRAID 10を使用することを推奨している。 2010年3月、ユーザー間でIntel Rapid Storage Technology（RST）9.6ドライバーがRAIDボリュームでTRIMをサポートしていると信じられるようになったが、Intelは後にTRIMがAHCIモードとRAIDモードのBIOS設定でサポートされるが，RAIDボリュームの一部として使用される場合はサポートしないことを明らかにした。 2012年8月の時点で、IntelはRapid Storage Technology（RST）11.2ドライバーを搭載した7シリーズのチップセットがMicrosoft Windows 7におけるRAID 0のTRIMをサポートしていることを確認している。Intelは6シリーズチップセットのサポートを確認していないが、RAID 0ボリュームでのTRIMは、変更されたRAIDオプションROMを使用することで、Z68、P67、X79のチップセットで動作することが示されている。6シリーズチップセットで公式にサポートされていない理由として、技術的なものではなく、検証コストないし消費者にアップグレードを促す目的であると推測されている。 X79チップセットを備えたマザーボードにおいてオプションROMを変更しなくても問題ない場合は、製造元がROMスイッチを追加した場合である。BIOSとUEFIの内部にRST ROMとRST-E ROMの両方があれば、RST-E ROMの代わりにRST ROMを使用して、TRIMを機能させることが可能となる。Intelは、ROMと同じバージョンのドライバーを使用することで最高のパフォーマンスが得られると述べている。たとえば、BIOS・UEFIに11.0.0.0mオプションROMがある場合、11.xバージョンのドライバーを使用する必要がある。 ファイルシステムが自動的にTRIMをサポートしない場合でも、一部のユーティリティではTRIMコマンドを手動で送信できる。通常、ユーティリティが使用されていないブロックを判別し、リストをコマンドとしてドライブに渡す。このようなユーティリティは、複数のメーカーが提供している（例： Intel、G.Skill ）。また、一般的なユーティリティ（例：Linuxのhdparm（英語版）v9.17以降の"wiper" 、mdtrim）としても提供されている。hdparmとmdtrimはいずれも、ファイルシステムに大きなファイルを割り当て、割り当てられている物理的な場所を解決することにより、空きブロックを検索する。 TRIMコマンドの仕様は、 国際情報技術標準委員会 （INCITS）の技術委員会T13が主導するATアタッチメント （ATA）インターフェイス標準の一部として標準化されている。TRIMは、ドラフトACS-2仕様のDATA SET MANAGEMENTコマンド（opcode 06h）で実装されている。また、ATA規格は、パラレル（IDE、PATA）・シリアル（SATA）の両方でサポートされている。 オリジナルのATA TRIMコマンドの欠点は、キューに入れられないコマンドとして定義されていたため、キューに入れられた読み取りおよび書き込み操作の通常のワークロードと簡単に混在させることができない点であった。 SATA 3.1では、これを修正するためにキューに入れられたTRIMコマンドが導入された。 ATA IDENTIFY DEVICEコマンドから返されるSATAワード69および169により定義される、複数種のTRIMコマンドが存在する。 非決定的TRIM：TRIM後の論理ブロックアドレス （LBA）への読み取りコマンドで、異なるデータを返す場合がある。 確定的TRIM（DRAT）：TRIM後のLBAへの読み取りコマンドは、同じデータを返すか、確定的となる。 TRIM後の確定的読み取りゼロ（RZAT）：TRIM後のLBAへのすべての読み取りコマンドはゼロを返す。 SATAワード105には、ドライブがサポートできるDATA SET MANAGEMENTコマンドごとの512バイトブロックの最大数を示す追加情報が存在する。 通常、これはデフォルトで8または4 kBとなっているが、多くのドライブでは1として、TRIMのMicrosoft Windowsハードウェア要件に存在する、コマンド完了時間が20ミリ秒または8ミリ秒×LBA範囲エントリ数のいずれか以上かつ600ミリ秒未満でなければならないという条件を満たすようにしている。 個々のLBA範囲はLBA範囲エントリと呼ばれ、8バイトで表現される。LBA自体は、LBA範囲エントリの最初の6バイトで表され、範囲長が残りの2バイトで表されている。範囲長のビットがすべてゼロの場合、LBA範囲エントリはパディングとして破棄される。つまり、1回のTRIM範囲で最大で32 MBの64倍すなわち2GBが指定される。デバイスがSATAワード105で8をサポートしている場合、1回のTRIM（DATA SET MANAGEMENT）コマンドで16 GBをトリムできることとなる。 SCSIでは、TRIMと同一内容であるUNMAPコマンド、およびUNMAPフラグが設定されたWRITE SAMEコマンド（10および16バリアント）が存在する。 MultiMediaCardおよびSD ERASE（CMD38）コマンドは、ATAでのTRIMコマンドと同様の機能を提供するが、消去されたブロックをその後0または1で上書きする必要がある。eMMC 4.5では、破棄されたブロックの内容が不確定と見なすことができる点でTRIMコマンドにより類似した「破棄」サブオペレーションを定義した。 NVM Expressコマンドセットでは、ホストの意図を一連のブロック範囲のストレージデバイスに示めすための汎用のコマンドが存在する。その操作の1つであるdeallocateコマンドはTRIMを実行することと同義である。また、deallocateコマンド実行へのヒントを提供し、ディスクがゼロをトリミングして返すことを可能にするWrite Zeroesコマンドも存在する。 暗号化が使用されている場合、TRIMコマンドを使用すると、使用されているブロックと使用されていないブロックに関する情報が明らかになってしまう。 オリジナルのTRIMコマンドは、 T13小委員会によって非キューコマンドとして定義されていたため、たとえば各ファイルシステムの削除コマンドの後に送信された場合など、不注意に使用すると、大量の実行ペナルティが発生する可能性がある。非キューコマンドの性質上、デバイスドライバは、未解決のコマンドがすべて完了するのを待機し、TRIMコマンドを発行してから、通常のコマンドを再開する必要がある。SSDのファームウェアによっては、TRIMが完了するまでにかなりの時間がかかってしまい、ガベージコレクションサイクルがトリガーされる場合もある[要出典]。このペナルティは、システムの使用率が最小になるようなバッチジョブをスケジュールすることにより、ファイルの削除ごとにトリミングするのではなく、定期的にバッチTRIMを実行することで最小限に抑えられる。このTRIMの欠点は、Queued TRIMコマンドの導入により、シリアルATAリビジョン3.1で改善した。 Queued TRIMへのサポートを誤ってシステムに通知しているか、実装に重大なバグがあるドライブファームウェアにより、いくつかのデバイス、特にMicronとCrucialのM500およびSamsungの840および850シリーズなどで深刻なデータ破損を引き起こすとされている。 以下のデバイスは、Linuxカーネルのlibata-core.cでブラックリストに登録されており、非キューTRIMコマンド（ATA_HORKAGE_NO_NCQ_TRIM）の送信を強制される。 Micron/Crucial M500 (すべてのファームウェア) Micron M510 (ファームウェアバージョン MU01) Micron/Crucial M550 (ファームウェアバージョン MU01) Crucial MX100 (ファームウェアバージョン MU01) Samsung 840/850 シリーズ(すべてのファームウェア) また、このファイルは、TRIMが発行されたときに誤ったブロックがデータを失う原因となるため、SuperSSpeed S238をTRIMコマンドへのブラックリストに載せている。 libata-core.cには、サブシステムのメンテナーがDRATフラグとRZATフラグ（ATA_HORKAGE_ZERO_AFTER_TRIM）を確実に認識しているSSDを列挙しているホワイトリストもある。 ホワイトリストに登録されているドライブは以下の通りである。 Crucial SSD Intel SSD 510を除くIntel SSD Micron SSD Samsung SSD Seagate SSD ^ “TRIM Overview” (英語). Intel. 2020年6月9日閲覧。 ^ Shimpi, Anand Lal (2009年3月18日). “The SSD Anthology”. AnandTech.com. p. 4. 2010年6月19日閲覧。 ^ a b Shimpi, Anand Lal. (18 March 2009). p. 10. ^ Shimpi, Anand Lal. (18 March 2009). p. 11. ^ “Kingston SSDNow V Plus 100 Review”. AnandTech.com. Anand Lal Shimpi (2010年11月11日). 2010年12月10日閲覧。 ^ a b Savill, John (2009年4月21日). “I heard solid-state disks (SSDs) suffer from a decline in write performance as they're used. Why?”. WindowsITPro. 2012年6月30日時点のオリジナルよりアーカイブ。2010年6月19日閲覧。 ^ Shimpi, Anand Lal. (18 March 2009). p. 7. ^ a b Savill, John (2009年4月22日). “What is the TRIM function for solid-state disks (SSDs) and why is it important?”. WindowsITPro. 2013年2月9日時点のオリジナルよりアーカイブ。2010年6月19日閲覧。 ^ Malventano (2009年2月13日). “Long-term performance analysis of Intel Mainstream SSDs”. PC Perspective. 2012年2月10日閲覧。 ^ Shimpi, Anand Lal. (18 March 2009). p. 5. ^ Shimpi, Anand Lal. (18 March 2009). p. 8. ^ “Write Amplification: Intel's Secret Sauce”. ExtremeTech.com. 2010年11月6日閲覧。 ^ “Inside the X25-M Controller: Wear Leveling, Write Amplification Control”. TomsHardware.com (2008年9月8日). 2010年11月6日閲覧。 ^ “Too TRIM? When SSD Data Recovery is Impossible”. TechGage. TechGage (2010年3月5日). 2018年8月21日閲覧。 ^ “Preliminary TRIM support”. 2020年7月6日閲覧。 ^ “FreeBSD 8.1-RELEASE Release Notes: Disks and Storage”. 2010年9月1日閲覧。 ^ “Add kernel side support for BIO_DELETE/TRIM on UFS”. 2011年2月1日閲覧。 ^ “Added ZFS TRIM support which is enabled by default.”. 2013年6月5日閲覧。 ^ “FreeBSD 9.2-RELEASE Announcement”. 2013年10月4日閲覧。 ^ “Base revision 242323 – Add basic BIO_DELETE support to GEOM RAID class for all RAID levels”. 2012年10月30日閲覧。 ^ “TRIM support in NetBSD” (2012年10月19日). 2020年7月6日閲覧。 ^ “Block device changes in Linux 2.6.28”. 2020年7月6日閲覧。 ^ “Storage changes in Linux 2.6.33”. Kernel Newbies. 2010年9月1日閲覧。 ^ “HOWTO: Configure Ext4 to Enable TRIM Support for SSDs on Ubuntu and Other Distributions – Forked by Nicolay”. 2020年7月6日閲覧。 ^ “Btrfs improvements in Linux 2.6.32”. 2020年7月6日閲覧。 ^ “JFS Filesystem can now handle trim”. 2012年3月28日閲覧。 ^ “Filesystem changes in Linux 3.0”. 2020年7月6日閲覧。 ^ Freemyer (2010年). “OpenSUSE forum – SSD detection when creating first time fstab”. 2020年7月6日閲覧。 ^ “How to enable TRIM?”. Ask Ubuntu. 2015年11月11日閲覧。 ^ “SDB:SSD discard (trim) support”. 2020年7月6日閲覧。 ^ “Mac OS X 10.6.8 Brings TRIM Support for Apple SSDs, Graphics Improvements” (2012年2月24日). 2020年7月6日閲覧。 ^ “Macbook Pros ship with active SSD TRIM support” (2011年3月4日). 2020年7月6日閲覧。 ^ “Yosemite kills third-party SSD support”. 2020年7月6日閲覧。 ^ “Chameleon SSD Optimizer”. 2020年7月6日閲覧。 ^ “Cindori Software”. 2020年7月6日閲覧。 ^ Lee Hutchinson (2015年6月30日). “Latest OS X update allows you to enable TRIM for third-party SSDs”. Ars Technica. Condé Nast. 2015年7月1日閲覧。 ^ “Support and Q&A for Solid-State Drives”. MSDN (2009年5月9日). 2010年8月12日閲覧。 ^ “Windows 7 Enhancements for Solid-State Drives”. Microsoft downloads. Microsoft Corporation (2008年11月12日). 2009年7月8日閲覧。 ^ Geoff Gasior (2012) OCZ's RevoDrive 3 X2 240GB solid-state drive ^ Coles (2010年4月15日). “SSD Benchmark Tests: SATA IDE vs AHCI Mode – AHCI vs IDE Final Thoughts”. BenchmarkReviews. 2013年8月20日閲覧。 ^ “Fsutil behavior” (英語). Microsoft Documentation. 2019年11月17日閲覧。 ^ “SATA TRIM support in OpenSolaris” (2010年7月29日). 2020年7月6日閲覧。 ^ “Android 4.3 Update Brings TRIM to All Nexus Devices” (2013年7月29日). 2013年7月30日閲覧。 ^ "Android 4.3 announced, rolling out to Nexus devices today".The Verge. 24 July 2013. Retrieved 24 July 2013. ^ “Possible to get SSD TRIM (discard) working on ext4 + LVM + software RAID in Linux? – Server Fault”. 2011年11月29日閲覧。 ^ “Cyberax/mdtrim – GitHub”. 2011年11月29日閲覧。 ^ a b “Red Hat Enterprise Linux 6 Storage Administration Guide, Chapter 21. Solid-State Disk Deployment Guidelines”. 2016年3月9日閲覧。 ^ “Red Hat Enterprise Linux 7 Storage Administration Guide” (2015年11月11日). 2016年2月29日閲覧。 ^ “Is there TRIM support for RAID configurations?”. Intel (2010年3月26日). 2010年11月6日閲覧。 ^ “Intel Confirms RAID0 TRIM Support on 7-Series Chipsets” (2012年8月19日). 2013年1月14日閲覧。 ^ “RAID0 trim and SRT seems possible on 6-series and 5-Series” (2012年11月18日). 2013年1月14日閲覧。 ^ “TRIM & RAID-0 SSD Arrays Work With Intel 6-Series Motherboards Too” (2012年11月28日). 2013年1月14日閲覧。 ^ “Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It” (2012年8月16日). 2013年1月14日閲覧。 ^ Anand Lal Shimpi. “Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It”. 2020年7月6日閲覧。 ^ Doug Crowthers. “TRIM Command Confirmed With RAID 0 on Intel 7 Series”. Tom's Hardware. 2020年7月6日閲覧。 ^ “Intel SSD Optimizer White Paper”. Intel Corporation. 2012年6月30日時点のオリジナルよりアーカイブ。2010年1月23日閲覧。 ^ “wiper.exe for Falcon Series”. XtremeSystems. 2010年1月23日閲覧。 ^ “hdparm-9.17 released, with experimental trim/wiper scripts for SSDs”. 2010年8月14日閲覧。 ^ “hdparm project page”. sourceforge.net. 2010年8月14日閲覧。 ^ “Data Set Management Commands Proposal for ATA8-ACS2 (revision 6)”. INCITS T13. INCITS (2007年12月12日). 2009年7月8日閲覧。 (draft specification T13/e07154r6) ^ “T13 documents referring to TRIM”. INCITS T13. INCITS. 2009年7月8日閲覧。 ^ “T13 ATA8 Draft Spec 1697-D”. INCITS (2010年6月23日). 2010年8月14日閲覧。 ^ “SATA 6Gb/s”. Serial ATA International Organization. 2012年9月26日閲覧。 ^ “Device.Storage Requirements (Windows)”. 2016年2月29日閲覧。 ^ “T13/2161-D: Information technology – ATA/ATAPI Command Set – 3 (ACS-3)”. 2016年2月29日閲覧。 ^ “Note for SCSI UNMAP support in FreeBSD mailing list”. 2020年7月6日閲覧。 ^ “Milan Broz's blog: TRIM & dm-crypt ... problems?”. Milan Broz. 2014年10月1日閲覧。 ^ http://www.sata-io.org/technology/6Gbdetails.asp ^ “SATA 3.1 spec brings swap standard, improved TRIM”. The Tech Report. 2020年7月6日閲覧。 ^ “Bug 71371 – [PATCH]Crucial M500, broken "queued TRIM" support”. 2020年7月6日閲覧。 ^ “Bug #1449005 "trim does not work with Samsung 840 EVO after firm..." : Bugs : fstrim package : Ubuntu”. 2020年7月6日閲覧。 ^ a b c torvalds. “linux/libata-core.c at master · torvalds/linux · GitHub”. GitHub. 2020年7月6日閲覧。 ^ torvalds. “libata: force disable trim for SuperSSpeed S238 · torvalds/linux@cda57b1”. GitHub. 2020年7月6日閲覧。 ^ “[1/3] libata: Whitelist SSDs that are known to properly return zeroes after TRIM”. 2020年7月6日閲覧。 データ残留 From write() down to flash chips – An explanation on how the TRIM command lets SSDs erase data not used by the filesystem TRIM Command White Paper – A white paper explaining the command's purpose and actions Fusion-io Patent "Apparatus, system, and method for redundant write caching"