固态硬盘测试
固態硬盤
固態硬盤(Solid-statedrive,SSD)又稱為點子盤,是一種使用固態存儲介質來存儲數據的非易失性存儲設備.它與傳統硬盤的最大區別在于內部沒有移動的磁頭,所以在進行隨機數據存取的時候不再需要大量的移動磁頭的時間,同時也將由于磁頭移動所帶來的噪聲也一并消除.固態硬盤一般采用的接口與傳統的硬盤一致,這樣就大大方便了現有設備的升級.
結構
SSD一般由以下三個模塊組成:
存儲介質
存儲介質分為三類:第一類,基于NANDflash,這樣它就可以在無電源的情況下保存其內部所存儲的數據.第二類,基于RAM.這一類往往速度很快,卻需要提供額外的電源來保證在主電源斷掉的情況下依然能夠保存其內部的數據.第三類,混合型.這一類通常包含一個很大容量的傳統硬盤,并使用SSD作為其cache.然而這種硬盤卻不適合在數據密集型的情況下使用.
控制器
控制器用來執行由主機發過來的命令和日常的FLASH維護工作,其一般為一顆嵌入式的微處理器.它主要執行以下功能:
*錯誤校驗(Errorcorrection)
*磨損均衡(Wearleveling)
*壞塊重映射(badblock mapping)
*讀寫緩存(readand write caching)
*垃圾回收(garbagecollection)
*加密(encryption)
主機接口
這部分常集成在控制器中,通常采用的是HDD是用的那些接口,如:SerialATA,PCI Express,USB等
Flash劃分
晶體管是NANDFLASH的基本組成部分,一個單元能夠存儲一位或者兩位數據.當它存儲一位數據時稱為SingleLevel Cell(SLC)閃存,當它存儲兩位數據的時候稱為MultiLevel Cell(MLC)閃存.
SLCflash (left) vs. MLC flash (right)
MLC的寫操作比SLC慢,但MLC比SLC便宜且容量更大.所以SLC一般用在企業級的服務器上,MLC一般應用于個人桌面領域.
一組如上的基本單元形成一個個的pages,page是能夠在NANDflash上能夠讀寫的最基本單元.一個Page的典型值為4KB.一組pages又組成一個個的blocks,一般在一個block里包含有128個pages(所以一個block的大小一般為512KB).block是能夠在NANDflash上進行擦除的基本單位.所以NANDflash上進行讀寫的單位是page,而進行擦除時的單位卻是block(即128個page).
Pageand Block
問題
當NANDflash的page都還是空的時候,我們能夠一個接一個page地寫數據,但我們卻不能直接重寫一個page.所以不通過擦除的方式,我們能夠一個page接一個Page地將整個flash寫完.而當我們寫完了flash的所有空間后想重寫某一頁的數據時,就需要將這一頁所在的block全部拷貝到緩存里,將該block全部擦除,將緩存里的我們需要修改的頁面進行修改,再將這一整個block寫回.也就是常說的read-erase-modify-write過程,所以我們能夠一次讀寫4KB,卻一次只能擦除512KB.
現代的操作系統以logicalblockaddressing(LBA)的方式與驅動器進行交流.OS知道哪些LBA是可用的,哪些是不可用的.當刪除一個文件時,指向該文件的那些LBA被標記為空閑,而實際存儲在驅動器上的數據并未被刪除.直到OS決定將再使用這些LBA時,這些LBA指向的實際存儲區域才會被重寫.
下表是OS對于常見文件操作的行為:
| Actionin the OS | Reactionon a HDD | Reactionon an SSDFileCreate |
| FileCreate | Writeto a Sector | Writeto a Page |
| FileOverwrite | Writenew data to the same Sector | Writeto a Different Page if possible, else Erase Block and Write to theSame Page |
| FileDelete | Nothing | Nothing |
HDD與SSD此處最關鍵的區別在于重寫一個文件的時候.HDD能夠直接在原來的位置上進行重寫,而SSD卻需要一個干凈的頁面來寫新數據.在SSD中那些在重寫后無效的頁面只是被標記為無效的而未進行擦除.
問題示例
假定我們有一個參數如下的SSD:
PageSize4KB
BlockSize5 Pages (20KB)
DriveSize1 Block (20KB)
ReadSpeed2 KB/s
WriteSpeed1 KB/s
我們先存4KB的文本文件:
OurSSD. The yellow boxes are empty pages
接下來我們繼續存一張大小為8KB的圖片:
Thepicture is 8KB and thus occupies two pages
接下來我們刪掉那個4KB的文本文件.再存儲一個12KB的圖片,這時OS認為磁盤有12KB是空閑的,而SSD卻認為只有8KB是空閑的,另外那4KB屬于無效的page.
Problem.We don't have enough empty pages.
根據前文的規則,我們此時不能直接進行寫操作,而要將該block全部拷貝到cache中,開始前述的read-erase-modify-write操作,如下圖:
read-erase-modify-writecycle
我們算一下這一次的寫速度.這款SSD寫速度為1KB/S,讀速度為2KB/S.寫12KB的數據本來需要t1=12s,而實際上我們讀了12KB后又寫了20KB的數據,所以實際上消耗了t2=26s.于是這塊SSD的寫速度實際上已經從1KB/S降到了0.46KB/S.
解決方法
這里有兩種解決方法.
方法一:添加額外的存儲空間
給SSD添加額外的存儲空間.例如在前面一節的例子中當我們聲稱我們只有20KB的空間時,實際上有24KB的存儲空間.這樣在前面一節存儲12KB的圖片時,我們的空間就足夠了.如下圖:
方法二:TRIM命令
該命令需要OS和SSD上的固件同時支持時才有效.當刪除一個文件時,OS通過發送TRIM命令給SSD來告訴SSD哪些LBA指向的page已經失效了.SSD上的控制器將會在合適的時機將那些包含這些pages的blocks拷貝到cache中,然后將失效的頁面刪除并回寫到干凈的blocks中.
于是在前述的示例中,當刪除了4KB的文本文件后,OS將會通過TRIM命令告知SSD驅動器.
然后再存入12KB的圖片文件:
這一次我們就順利的寫進去了這個12KB的圖片文件.
然而這種方法只能減輕上述現象帶來的問題,而不能完全去除:當重寫一個文件時,TRIM命令就失效了.
安全擦除
基于前文同樣的原因,當格式化SSD磁盤的時候并不會真正清楚SSD里所存儲的內容.所以需要對SSD進行恢復的時候,最好進行安全擦除,將SSD上所有的page都恢復到干凈的狀態,這時SSD將具有最快的速度.
SSD性能指標
SSD有如下的性能指標:
-
順序讀
-
順序寫
-
隨機讀
-
隨機寫
-
混合讀寫
-
每秒IO次數(IOPS)
-
讀寫延時
測試
影響條件:distkcache
內核會對之前讀寫過的文件進行緩存,若在讀寫若一個文件之后對其進行讀操作將返回內核緩存的文件(存放在內存中),從而對測試結果產生影響.從內核2.6.16起提供了一個接口來(/proc/sys/vm/drop_caches)對該緩存進行清除.具體命令如下:
-
freepagecache:
-
echo1 > /proc/sys/vm/drop_caches
-
freedentries and inodes
-
echo2 > /proc/sys/vm/drop_caches
-
freepagecache, dentries and inodes
-
echo3 > /proc/sys/vm/drop_caches
影響條件:隨機數
如前一節所說,所有讀寫都會被內核緩存,所以當對文件進行隨機讀寫的時候隨機的偏移有重復的時候將會得到不正確的結果,故要求所有隨機偏移不重復.
影響條件:寫同步方式
寫同步的方式有以下幾種:
-
sync()
該方式將所有內核對文件的緩存放到一個隊列里,稍后將全部寫回磁盤.返回時并不保證所有修改已寫回磁盤.
-
fsync()/fdatasync()
該方式將內核對由參數指定的文件的緩存放到一個隊列里,稍后將全部寫回磁盤.返回時并不保證所有修改已寫回磁盤.
-
O_DIRECT
該方式在寫操作時直接操作硬盤,并不經過內核的緩存,返回時保證已經寫回了磁盤.故而能夠較好的反應磁盤的寫速度.
TRIM
從內核2.6.33起開始支持TRIM命令,用戶空間的程序有如下兩個:
-
fstrim
-
hdparm > v9.31
Security Erase
通過執行SecurityErase可以將SSD恢復到出廠設置,所有的內部pages都將處于干凈的狀態,在這個時候進行寫操作意味著將有最快的效率.執行該操作需要SSD固件的支持,能夠執行其操作的方法有3個:
HDDerase
該軟件需要在純dos環境下運行,需要下一個dos包以及syslinux包里的memdisk文件,grub2命令行如下:
setroot=(hd0,1)
linux16/memdisk
initrd16/dos/msdos71b.img
以上具體參數根據情況修改
PartedMagic
說partedMagic是一個分區工具,實際上是一個基于linux系統的集系統修復硬盤維護等的一個環境.官方推薦使用UNetbootin來燒寫至USB,但可以將其解壓到U盤上并直接使用grub2引導之:
setroot=(hd0,1)
linux/pmagic/bzImage [edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rwloglevel=0 max_loop=256 keymap=us] root=/dev/sdb1
initrd /pmagic/initrd
當解壓后的pmagic不是放在主目錄下時,會提示找不到PMAGIC_XXXX.SQFS,此時只需在上面的linux那一行后添加上directory=[pmagic所在的目錄]即可.
當partedmagic啟動后,選擇程序里的erasedisk并進行其他操作即可.若提示SSD已經frozen需要sleep點擊并5~10秒后按power重啟喚醒(這一步在6T上沒有操作成功-_-),或者通過下一節提到的方法進行操作.
Hdparm
先執行hdparm-I /dev/sdx,查看是否有如下輸出:
| Security:
Masterpassword revision code = 65534
supported
not enabled
not locked
frozen
not expired:security count
not supported:enhanced erase
|
如果有frozen部分必須先讓其顯示為notfrozen才可進行下面的操作,至于解開frozen可以在Linux起來后再插上SSD可以.
接下來鍵入以下命令即可進行安全擦除:
hdparm–user-master u –-security-set-pass test /dev/sda
hdparm–user-master u –security-erase test /dev/sda
擦除成功后,SSD將重新回到frozen模式.
總結
- 上一篇: 如何快速创建一个“2010 年自动交易锦
- 下一篇: 微服务编排引擎Cadence简介