Trim命令

Trim命令(ATA命令集中稱為TRIM,SCSI命令集中稱為UNMAP),它使作業系統能通知固態硬碟(SSD)哪些數據塊已不再考慮使用,可以被內部擦除。 Trim在SSD被推出後很快被跟著推出。因為SSD的底層操作與硬碟驅動器顯著不同,作業系統處理諸如刪除和格式化等操作的典型方式將導致SSD上的寫操作不可預期的逐步性能退化。Trim(意為修整、修剪、裁剪)使SSD能更有效地處理垃圾收集,否則將減慢在未來對所涉及塊的寫入操作。 儘管在引入Trim前已有將某些驅動器“重置”為新狀態的工具,但它們也將刪除該驅動器上的所有數據,從而使這些工具和技術不能用於持續性最佳化。在2014年,許多SSD有內部的後台垃圾收集機制,它們與修整工作相獨立。儘管這在不支持修整的作業系統上也成功地保持了性能,它存在增加寫入放大和快閃記憶體單元磨損的相關缺點。

快閃記憶體磁碟驅動器特有的問題

因為許多檔案系統以標記數據塊為“未使用”來處理刪除操作,存儲介質(傳統硬碟、SSD)通常不知道哪個扇區/頁是真在使用,哪些可被認作空閒空間。因此與重寫操作不同,刪除將不涉及對數據所在扇區的物理寫入。由於通用SSD不了解檔案系統結構(例如未使用的塊/扇區的列表),存儲介質無法獲知哪些塊已經變為可用。這使反刪除工具能從傳統的機械硬碟上恢復檔案,因為儘管作業系統報告檔案已被“刪除”,檔案所在的扇區只是在作業系統之後進行寫入時作為空閒空間的扇區,從而有效使操作變得像重寫操作。對於機械磁碟來說,這與寫入空扇區沒有區別,但因為SSD最底層的一些特性,與將數據寫入空頁面相比,重寫會有顯著的開銷,從而潛在地削弱寫入性能。

SSD在快閃記憶體單元中通常以4至16kB的分組來存儲數據,並將分組組合成128至512頁的塊。例如,512kB以4kB為一頁存儲在128頁的塊中。NAND快閃記憶體單元只能在處於空狀態時寫入。如果它們可能包含數據,則執行寫操作前必須擦除其內容。一次SSD寫入操作可以只完成單個頁,但由於硬體限制,擦除命令始終會影響整個塊;因此將數據寫入到SSD上的空頁非常快,而寫入存在數據的頁就會顯著變慢。由於頁被再次寫入前需要擦除單元,但擦除只能對整個塊,改寫將按“讀取、擦除、修改、寫入”的方式完成;整個塊的內容會先存儲在快取中,然後在SSD中擦除整個塊,再將改寫的頁寫入到快取的塊,最後再將更新的塊寫入快閃記憶體介質。這種現象也稱寫入放大。

操作

TRIM命令使作業系統得以通知SSD哪個頁不再包含有效的數據。對於檔案刪除操作,作業系統會將檔案刪除標記為可用於新數據,然後向SSD傳送TRIM命令。在Trim後,在新的數據寫入快閃記憶體頁面時,SSD不保留塊的任何內容,從而實現更少的寫入放大(更少的寫入)、更高的寫入吞吐量(不需要讀取、擦除、修改),從而增加驅動器壽命。

不同的SSD實現的命令有所不同,因此性能可能也有所差異。

Trim為不可逆地擦除數據,無法恢復;這不同於機械硬碟中被刪除的數據可能被數據恢復。

實現

作業系統支持

Trim僅在支持它的作業系統上有效。下表列出了各個重要的作業系統支持該命令的首個版本。此外,在TRIM命令添加到高技術配置標準之前設計的舊款固態驅動器需要更新固件(如果有)才能支持Trim,否則將忽略這個新命令。

RAID問題

截至2017年1月,大多數基於硬體的RAID技術未實現TRIM命令的支持。但是,軟體實現的RAID通常提供了TRIM支持。

Windows:

Windows 10為SSD RAID卷在配置一個RAID卷時通過“最佳化驅動器”選項提供了TRIM支持。

Mac OS:

macOS RAID驅動程式不支持TRIM。自Mac OS X 10.7至macOS 10.12.x的所有版本均是如此。

對於使用第三方SoftRAID®應用程式的RAID(0,1,4,5和10)卷支持TRIM,包括使用非蘋果品牌SSD設備的TRIM支持。 (註:非蘋果品牌的SSD設備必須使用終端命令“sudo trimforce enable”來啟動TRIM)

Linux:

2011年1月以後的Linux核心中dmraid的發布版本已實現BIOS輔助的“假硬體RAID”支持,並且現在通行來自RAID陣列上的檔案系統的任何TRIM請求。

不同於dmraid,Linux的常規目的軟體RAID系統mdraid有實驗性的基於批處理(而不是在檔案刪除時實時)的TRIM,當系統配置為定期在RAID 1陣列上的檔案系統上運行mdtrim實用工具(包括ext3等沒有原生TRIM支持的檔案系統)。在Linux的稍晚版本(例如Red Hat Enterprise Linux 6.5和beyond)中 mdraid支持實時、實際傳遞TRIM命令,而不是作為一個批處理作業。

但請注意,紅帽公司建議不要在大多數RAID技術的SSD上使用軟體RAID 1、4、5和6,因為大多數RAID管理實用工具(例如Linux的mdadm)在初始化期間會在設備上寫入所有塊以確保校驗和(或RAID 1/10情況下的驅動器到驅動器驗證)運作正常,而這導致SSD認為除備用區域以外的所有塊都在使用中,從而顯著降低性能。

另一方面,Red Hat推薦在SSD上為LVMRAID使用RAID 1或RAID 10,因為這些級別支持TRIM(在Linux術語中稱為"discard"),並且LVM實用工具在創建時不會寫入所有塊到RAID 1或RAID 10卷。

在2010年3月的一小段時間內,用戶被誤導相信英特爾快速存儲技術(RST)9.6驅動程式支持RAID卷上的TRIM,但後來英特爾澄清說,TRIM支持AHCI模式和RAID模式的BIOS設定,但不支持RAID卷的驅動器。

截至2012年8月,英特爾確認,使用Rapid Storage Technology(RST)11.2驅動程式的7系列晶片組支持微軟Windows 7中的RAID 0的TRIM。雖然英特爾沒有確認支持6系列晶片組,RAID 0卷上的TRIM已展示為在Z68、P67和X79晶片組上可用,通過由硬體發燒友修改的RAID選項ROM。據推測,缺乏對6系列晶片組的官方支持是由於驗證成本或企圖鼓勵消費者升級,而不是出於技術原因。

在使用X79晶片組的主機板上需要修改選項ROM的例外是製造商添加了ROM開關;這需要RST和RST-E ROM存在於BIOS/UEFI內。這允許使用RST ROM而不是RST-E ROM,從而允許TRIM工作。英特爾指出,使用與ROM版本相同的驅動程式可以實現最佳性能。例如,如果BIOS/UEFI具有11.0.0.0m選項ROM,則應使用11.x版本的驅動程式。

為不支持的作業系統使用

在使用不支持自動TRIM的檔案系統時,某些實用工具可以手動傳送Trim命令。通常它們將確定哪些塊為空閒,然後將該列表以一系列的Trim命令傳遞給驅動器。這些實用程式可從各製造商(例如Intel、G.Skill)或作為一般實用程式(例如Linux的hdparm自v9.17起,或者如上所述的mdtrim)。

硬體支持

高技術配置

TRIM命令規範已被標準化為AT Attachment接口標準的一部分,由國際信息技術標準委員會(INCITS)的技術委員會T13所領導。TRIM根據D高技術配置 SET MANAGEMENT(數據集管理)命令(操作碼06h)實現,ACS-2規範草案。高技術配置標準被並行(IDE、P高技術配置)和串口(S高技術配置)高技術配置硬體所支持。

原版高技術配置 TRIM命令的缺點是它被定義為不可排隊命令,因此不能輕鬆地與正常的、排隊的讀和寫操作混合。S高技術配置 3.1引入了一個排隊的TRIM命令來糾正這一點。

高技術配置 IDENTIFY DEVICE命令返回的S高技術配置 Words 69和169定義了不同類型的TRIM。

•非確定性TRIM:TRIM後每個對邏輯區塊地址(LBA)的讀取命令可能返回不同的數據。

•確定性TRIM(DRAT):TRIM後對LBA的所有讀取命令都返回相同的數據,或者變為確定的。

•TRIM(RZAT)後確定性讀零:TRIM後對LBA的所有讀取命令都將返回零。

在S高技術配置字105中有額外信息,描述驅動器可以在每個數據集管理命令(D高技術配置 SET MANAGEMENT)支持最多多少個512位元組的數據塊。通常此值默認為8(或4kB),但許多驅動器將其減少到1,以滿足微軟Windows硬體要求對TRIM的部分——該命令完成時間不應超過20 ms或者8 ms × (LBA範圍項的數量),且兩者中的較大者應始終小於600 ms。

各LBA範圍被稱為一個LBA範圍條目,並由八個位元組表示。 LBA由LBA範圍條目的前6個位元組表示,範圍長度是由剩下兩個位元組表示的一個從零開始的計數器。如果兩個位元組組成的範圍長度為零,那么LBA範圍條目應視作填充而丟棄。這意味著以512位元組為TRIM塊範圍支持的設備,該最大值為64個32 MB,也就是2 GB。如果設備在S高技術配置字105處設為8,則它應該能在單個TRIM(數據集管理)命令中修整16GB。

SCSI

SCSI提供了UNMAP命令(TRIM的完全模擬),以及帶有UNMAP標誌集的WRITE SAME命令(10和16個變數)。

SD/MMC

多媒體存儲卡和SDERASE(CMD38)命令提供了與高技術配置 TRIM命令類似的功能,但它要求擦除的塊用0或1重寫。eMMC 4.5進一步定義了一個“discard”(丟棄)子操作,從而更緊密的配合高技術配置 TRIM,因為丟棄的塊的內容可以被認為是不確定的(即“不在乎”的)。

缺點

•在使用加密時,TRIM命令的相關信息將揭露哪些塊正在使用,哪些沒有。

•TRIM命令的原始版本已被T13小組委員會定義為非排隊命令,因此執行不當可能造成大量的錯誤執行。例如,如果它在作業系統的每個刪除命令後發出,該命令的非排隊性質將要求驅動程式先等待所有未完成的命令完成,然後發出TRIM命令,最後再繼續正常命令。TRIM可能需要很長時間才能完成,這取決於SSD中的固件,並還可能觸發垃圾收集周期。這種缺陷可以用定期執行批量TRIM的解決方案來最小化,而不是在每次檔案刪除時執行修剪,批量處理任務可以在系統利用率最小時調度。這項TRIM缺點已在Serial 高技術配置修訂3.1中解決,其中引入了排隊的TRIM命令。

•排隊的TRIM命令已在多款設備中涉及嚴重的數據損壞,最顯著的是Micron的M500、Crucial的M500、以及Samsung 8**系列。在2015年7月1日,Linux作業系統在這些設備上的數據損壞已得到確認。

這些設備已被列入Linux核心中libata-core.c的黑名單,從而強制傳送非排隊的TRIM命令到這些設備,而不是排隊的TRIM命令:

•Micron M500,所有固件版本(僅MU07之前有此問題,但Linux尚未跟進)

•Crucial M500,所有固件版本,包括工廠重新認證的SSD(僅MU07之前有此問題,但Linux尚未跟進)

•Micron M510,固件版本MU01

•Micron M550,固件版本MU01

•Crucial M550,固件版本MU01

•Crucial MX100,固件版本MU01

•三星SSD 8**系列,所有固件版本

此檔案也已將SuperSSpeed S238列入常規TRIM的黑名單,因為發出TRIM會導致錯誤的塊丟失數據。

libata-core.c還有一個列出子系統維護者已確認正確實現DRAT和RZAT標誌(flags)的SSD,這不同於許多忽略它們的驅動器。白名單中的設備如下:

•Crucial多款SSD

•Intel多款SSD(不包括Intel SSD 510)

•Micron多款SSD

•三星多款SSD

•希捷多款SSD

ATA配置

ATA(英語: Advanced Technology Attachment,簡稱“ ATA”)與由集成驅動電子設備(英語: Integrated Drive Electronics,簡稱IDE)技術實現的磁碟驅動器關係最密切。

IDE是一種計算機系統接口,主要用於硬碟和CD-ROM,本意為“把控制器與盤體集成在一起的硬碟”。數年以前PC主機使用的硬碟,大多數都是IDE兼容的,只需用一根電纜將它們與主機板或適配器連起來就可以了,而目前主要接口為SATA接口。而在SATA技術日益發展下,沒有ATA的主機板已經出現,而且Intel在新型的晶片組中已經不默認支持ATA接口,主機版廠商需要另加晶片去對ATA作出支持(通常是為了兼容舊有硬碟和光碟驅動器)。

SATA(Serial ATA)於2002年推出後,原有的ATA改名為 PATA並行ATA配置Parallel ATA)。2013年12月29日,西部數據正式停止PATA硬碟供應,而希捷科技則已停售產多年,這意味著1986年設計的PATA接口在經歷27年後正式退出歷史舞台。

小型計算機系統接口

小型計算機系統接口(SCSI, Small Computer System Interface)是一種用於計算機及其周邊設備之間(硬碟、軟碟機、光碟機、印表機、掃瞄器等)系統級接口的獨立處理器標準。SCSI標準定義命令、通信協定以及實體的電氣特性(換成OSI的說法,就是占據物理層、連結層、套接層、套用層),最大部分的套用是在存儲設備上(例如硬碟、磁帶機);但,其實SCSI可以連線的設備包括有掃瞄器、光學設備(像CD、DVD)、印表機……等等,SCSI命令中有條列出支持的設備SCSI周邊設備。理論上,SCSI不可能連線所有的設備,所以有“1Fh - unknown or no device type”這個參數存在。

參見

•數據殘留

相關詞條

相關搜尋

熱門詞條

聯絡我們