您當前的位置:首頁 > 體育

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

作者:由 Einskai Lin 發表于 體育時間:2019-11-30

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?知乎使用者2019-12-02 01:53:48

【4K不對齊這個問題,其實已經不再是問題】

4K不對齊這個問題,現實中有兩個主要原因。

有一種是比較常見也很容易避免的:

有人在格式化時候選擇分配單元小於4K。

這種情況也會被識別為4K不對齊。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

不過07年以後的Windows預設值都滿足4KB大小,Win10更新某個版本以後甚至遮蔽了4096以下分配。

不給你犯錯誤的機會。。。

襠燃總有人犯錯誤············這就要自己檢討一下自己的分割槽、安裝系統的手法是不是太過風騷了。

避免這種4K不對齊,對win7和win10而言,

非常簡單:

用映象安裝時分配單元直接預設就行。根本就不需要你手動去選。

既然這個問題已經是想犯錯都難的問題,那麼:探討也就沒什麼意義了。

還有一種才是【真-4K不對齊】

作業系統無法正確識別4K扇區,也不自動對齊正確扇區,導致SSD出現額外讀寫負擔。

【誰有發出讀寫指令的最高權力】

題主認為:SSD明知自己在進行2個4K“扇區”的讀寫,造成額外的讀寫,影響效能還減少壽命,卻還要不得不這麼做。

給SSD加這個功能不就行了嗎?

這就涉及一個問題:

錯不是SSD出的,而是作業系統不能正確做出指令。

比如:你是一個國軍士兵,常凱申讓你把機槍往左挪10米,

哪怕那是個水坑,你也得執行。

因為你沒有指揮權。。。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

那麼,對SSD廠來說——命令是你下的,後果也必須是你負責。

我只管執行,罪不在我。

(反正你把硬碟搞壞了,也是你的責任)

開始覺得這個問題似乎又是個小白問題。

但是仔細推敲,發現這個看似簡單的小白問題,卻還有很多細節需要從頭梳理。。。。

以下為太長不看系列。。。

【一】網上常見說法

網上有一個比較公認的說法:

4K對齊_百度百科

通常網上說法是NTFS自用檔案佔用63個512B扇區,正好讓前8個4K硬碟扇區缺一個512B扇區,導致某一個4K硬碟扇區被兩個作業系統分配單元佔用。

讀寫操作時候自然要產生額外讀寫操作,影響效能。

首先明確一個意識:

作業系統OS顯然具有對硬碟的最高指揮權。

而不是硬碟反過來指揮作業系統。

槍指揮人,還是人指揮槍,這是大原則問題。

微軟OS實行指揮權的代理人,是NTFS檔案系統。

NTFS透過LBA地址來指揮硬碟的扇區。

早期硬碟在採用512B物理扇區,每個扇區都有1個LBA地址。

NTFS作為檔案系統,

使用“簇”(檔案叢集)來統帥下面的LBA——預設1個簇4KB,透過8個LBA地址控制著8個512B硬碟扇區。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

4K不對齊,其實早就存在,只是一直不是個問題。

從下圖可以看出,哪怕4K不對齊,對512B扇區的硬碟也沒啥影響。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

512B扇區,最早從1980年代就確立起來,30多年來一直正常執行,光碟、硬碟、甚至軟盤都在使用這套標準。

但是到了2010年以後,出現了變化:硬碟廠開始普及4K扇區。

產生的後果就是:

如果NTFS的4K簇不對齊硬碟4K扇區,

就會產生跨界錯位。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

而這1個簇一旦出現讀寫操作,就會牽動2個4K扇區工作——造成額外的讀寫量,既增加了硬碟負擔,也造成使用者體驗下降。

於是題主指出:SSD明知自己在兩個4K扇區上折騰,為何不糾正OS帶來的錯誤呢?

可是我們很清楚——

【1】SSD沒有最高指揮權。

哪怕作業系統給你的這個命令是錯誤的,SSD也無權自主修正,而且必須堅決執行。

【2】修正這個問題的成本太大

給每一個SSD增加修正4K不對齊功能,涉及太多韌體修改和引數識別,幾乎是全行業的整改。

顯然不如讓巨硬給自己打個補丁。

實際上淘汰512B扇區的決定,早在2000年就進行了。

但是直到2007年,三星和東芝才初步實現了4K物理扇區。

2010年,國際磁碟驅動器裝置與材料協會IDEMA 才正式確立了4K扇區的統一地位。

這就導致老系統不能正確識別4K不對齊問題。

希捷統計了WindowsXP至Windows10對4K扇區和分割槽的對應情況。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

https://www。seagate。com/cn/zh/tech-insights/advanced-format-4k-sector-hard-drives-master-ti/

明確指出:XP和Vista(SP1之前)都無法識別4K扇區,也不能建立正確分割槽(也就是不能4K對齊)。

從VistaSP1之後,所有Windows系統都能預設進行4K對齊。

【二】希捷對4K不對齊的解讀

首先希捷沒有提出是NTFS佔63扇區導致的問題,

而是指出每個分割槽之間,都有一定間隙區域。

進入4K硬碟時代,導致每個分割槽的起始點,都要對齊正確的LBA。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

意味著:

哪怕第1分割槽的起始位置正確(4K對齊),

如果第2分割槽起始位置不正確,那麼第二分割槽也可能會不對齊。。。

一個4K扇區對應八個LBA,

只能與第一LBA對齊,才算正確4K對齊。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

因此,希捷指出:

LBA起始點,可能出現在1個4K物理扇區所對應的8個LBA任意位置。

那麼就意味著有7種不對齊的可能,並不一定是NTFS自帶檔案佔用導致的問題。

任何不正確指派起始點的分割槽操作,

都會導致4K不對齊。

那麼,我們讓4K硬碟模擬512B扇區,不就可以重新回到當年不對齊也能用的時代嗎?

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

但是,

4K扇區硬碟確實可以模擬512B扇區,但是代價太大。

硬碟必須首先讀取包含主機寫入請求目標位置的整個 4K 扇區,將現有資料與新資料合併,然後重新寫入整個 4K 扇區。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

硬碟必須執行額外的機械步驟:讀取 4K 扇區、修改其內容,然後寫入資料。此過程稱為“讀取-修改-寫入”(read-modify-write)迴圈。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

這種先讀舊資料,再新舊資料整合,最後再寫入的過程,

對機械硬碟來說,問題不算特別嚴重——因為機械盤是磁性記憶原理,

機械盤可以直接覆蓋寫入。

效能損失不大,壽命損失輕微。

但是對SSD來說卻是滅頂之災:

SSD要先進行擦除,再進行寫入

——而且SSD並不只擦一個“扇區”page,而是一次擦除整個Bloack(1個Block往往有512個page“4K扇區”······)

SSD需要先擦掉整個Block,大約2MB大小。

擦之前先讀取整個Block到整合區,或挪到SSD其他儲存區,

再寫入這幾個512B檔案。。。

這麼大折騰,

顯然對SSD的壽命和效能都會造成嚴重傷害。

其實,

4K不對齊,只是嚴重影響SSD效能很多因素裡的一個因素。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

還有一個就是SATA選擇IDE模式

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

襠燃,如果遇到IDE+4K不對齊,雙重debuff下,SATA SSD的速度會極其慘烈。。。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

不過要注意:

並不是所有的SSD都對4K不對齊特別敏感——比如有人測試的某些NVMe固態,故意把分配單元選小,

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

哪怕出現這一種4K不對齊,對它們的效能損失非常小。。。。

因為,4K不對齊會對SSD效能造成損失,可是並不一定全都造成嚴重損失。

自動對齊

前面提到Vista SP1以後的系統也可以進行自動4K對齊。

很多時候反而是人為選擇了小於4K的分配單元,導致出現不對齊問題。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

襠燃隨著win10最新版的到來,這些問題都是浮雲了——

win10最新版,已經徹底遮蔽了4096以下分配單元。

你只要老老實實裝系統,自己別瞎操作,基本上不會遇到第二類4K不對齊問題。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

之後是閒扯階段············

【SSD的動態儲存】

我們暫且把SSD真實物理儲存空間,叫做:物理層

把作業系統識別出來的儲存空間,叫做:邏輯層

SSD的邏輯層地址與物理層地址總是變動對應的。

就像由一群沙丁魚組成的“魚陣”——前排的魚可以慢慢落到後排,而後排的魚也可以挪到前排,甚至可以瞬間前排變後排,後排變前排。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

但是沙丁魚群再怎麼變化,最小變動級別也是變動一條魚,而不是一片魚鱗。

SSD的最小儲存讀寫單元,是4KB的Page,而不是1bit的NAND單元。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

【作業系統眼中的世界】

SSD底層單元雖然如同小學生放假,幹啥的都有·········

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

但到了作業系統那裡,這些小學生都被編好順序排好隊,每個單元都有自己的編號。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

這就是FTL的功勞——

機械硬碟MHD由於磁軌轉動,他的物理層,先天就可以按1、2、3······順序排好了順序。

而SSD物理層是不連續的,就需要有一個轉換層,讓不規則的物理層能在邏輯層上表現成連續的。

這樣一來,在作業系統層面進行的分配,一旦出現4K不對齊,也一樣對導致跟MHD同樣的4K不對齊問題。

因為4K不對齊的根本原因,是邏輯層的分配單元佔了倆物理層單元。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

機械硬碟物理層本就是按順序排列,所以不需要亂序整理

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

SSD內部對應並不是嚴格順序,1號簇可能實際對應1號,也可能是999號,因此需要FTL從新整理出一個虛擬順序,方便作業系統使用

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

假如2號邏輯層簇不對齊,就會導致3號邏輯簇對應的物理簇成了兩個,從而產生4K不對齊

所以,從上面三圖我們可以看到,哪怕SSD內部空間Page是靈活不規整的,但是FTL總會報告給作業系統一個規整的順序。

而作業系統分配時出現問題,就會連帶SSD也出現4K不對齊。

所以,SSD沒有指揮權,也不能有指揮權——不然這個SSD就成精了。

SSD只能忠誠地執行NTFS交給他的任務——讓它把機槍往左挪動10米,就只能照辦。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

哪怕你的OS作業系統是個運輸大隊長,

你也只能當個杜長官,忠誠執行命令。

有人說:這是分割槽軟體的鍋,不怪作業系統。

但是不得不承認:

無論是DiskGenius還是巨硬系統自帶的分割槽程式,

只要你做Windows系統,最後都遵守NTFS分割槽法則。

而舊系統NTFS問題導致的4K不對齊,也必然跟著你。。。。

所以,只怪分割槽程式不怪作業系統,最後成了

降漢不降曹

············

然而曹老闆看得開:我就是漢相,降漢就是降曹·············

【512B】

在BIOS裡,SSD顯示的扇區為512B而不是4K。

實際上,這裡扇區的概念已經成了【儲存空間的分割單位】,並不是機械盤芯上的一個扇形區域。。。

這裡的512B,其實是為了最大相容性,硬碟模擬出來的——嗯,4K扇區的機械盤也都能實現。

但是真正遇到512B系統分配單元時,為了實現512B扇區功能,機械盤要犧牲效能:

為了讓8個模擬512B扇區能正常工作,4K扇區就要反覆進行“讀取-修改-寫入”(read-modify-write)迴圈。

同樣,對SSD而言:如果系統是512B簇,那麼4K Page也要面對多次R-M-W迴圈,同樣也會影響使用效能。表現也是4K不對齊·········

所以,

無論是機械盤還是SSD,只要是4K扇區盤,最好都要做好4K對齊。

【TRIM監獄】

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

SSD就像一個監獄,在韌體監規下,SSD主控管理著很多個NAND牢房。

在這裡,有用的資料和沒用的資料都被當做犯人關押著。。。

每個牢房能住4K個犯人,每層大約128個牢房。

沒用的資料,比如剛剛被我們刪除的檔案。就像被判死刑但是還沒執行的死刑犯。

雖然它已經“死了”,但是它依然活著。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

為何沒有立即執行?

原來:NAND牢房有個特點,犯人不會自己清理房間。

每次大掃除,牢頭主控都會把犯人趕到新的乾淨樓層裡。

襠燃牢頭不是你家保姆,

它老人家大掃除的方法簡單粗暴:放一把火,直接燒“乾淨”整個舊的髒樓層。

因此,一般的牢房也就能經受幾千次牢頭清掃···········也有秦X級高檔牢房能承受幾萬次衝擊。

為了槍斃一個死刑犯,善後工作就要燒128間房一次··········執法成本太高。

因此,如果只有一個兩個死刑犯,獄卒主控會把它們跟活刑犯一起趕到新樓層。

但是慢慢的,這種應死未死的死刑犯太多了,佔著房間不拉屎,減少了可供住宿的牢房數量,嚴重影響新犯人進監獄的速度了。

可是主控並不一定能及時地把這些人摘出來··········

最後作業系統法院釋出【TRIM指令】:

所有沒被執行的死刑犯,不會再送乾淨牢房了,直接跟著舊樓層的垃圾一起就地焚燒清理,

死刑-善後-清理一條龍服務。

主控隨即貫徹這個加急名單。

而巨硬系統一般規定:一週執行一次。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?木頭龍2019-12-02 12:29:43

理論上的確是可以的,但沒有固態這麼做,是因為作業系統、應用軟體已經自動對齊了。

稍微新一點的作業系統、分割槽軟體都是自動4K對齊的,你非要用一個老舊的XP、Ghost之類的軟體,主控表示它也沒辦法——雖然固態明明是4K大小的頁,卻非要向BIOS報告自己的扇區大小是512B就是為了以防你用古董主機板或者這些古董作業系統/軟體不能處理大於512B的扇區。

主控的演算法已經很複雜了,什麼TRIM,磨損平衡,定期GC,TLC流行後還要搞SLC Cache——TLC剛普及的時候就時不時爆出某某固態掉盤——往往就是因為演算法過於複雜出現了BUG,再搞這麼一個自動對齊,複雜度是指數增長的,估計掉盤的就更多了……

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?木村·星辰2019-12-06 20:16:03

因為韌體管理的最小單位是4K,對於第一個塊寫3K,第二個塊寫1K這種情況是沒辦法處理的,沒辦法把寫入的位置平移小於4K的距離,也沒辦法合併3K和1K。韌體能做的只是一個4K打包起來整個處理。

需要4K對齊的根本原因是NTFS的最小操作單位是512B,並且NTFS開頭需要63個512B,導致起始位置就不對齊。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?沈萬馬2022-04-28 01:04:40

根本原因是不對齊可以有很多方法,控制器不知道該怎麼彌合各種方法同時存在時產生的那些“碎片”。

我們可以讓控制器認識一些常見分割槽操作模式,這個其實很難,但可以做到。其實很多廠家不做實際上是卡在這裡,但我們就硬說它是個成本很高的技術但能做出來吧。接下來就是到底應該怎麼處理分割槽間碎片。

比如前一個分割槽偏移了512,後一個偏移了1024,那這多出來的512的碎片物理上放在哪裡好?放一個塊的話,這個塊只用了512是不是有點浪費。就算把好幾個碎片用特殊邏輯堆在一個塊裡,它也就是個1KB級別的塊,又需要控制器特殊邏輯處理,總是有些高成本低效用的意思。

又不可能武斷地說這些“碎片”不能用,因為確實有不常見但使用這些空間的軟體。至少,對一些應用邏輯來說,分割槽只是硬碟上的資料,那麼碎片不碎片的對它們來說無所謂。

然後如果使用者刪分割槽重建了之後換了一種方式偏移怎麼辦?怎麼合併碎片?

有聰明的小朋友肯定想到那我們設定一組專門的API,讓驅動能和SSD商量怎麼辦不就好了?聰明,所以已經有人做了。而且,都已經需要驅動了…這個對齊問題是不是比裝驅動還是容易一點的?

總之就是太麻煩而且不可能做到效果好,所以沒人做。更何況這個問題已經是歷史問題了。

固態硬碟(SSD)內部空間由韌體管理,為什麼不在韌體處理這步自動對齊扇區,而在分割槽的時候對齊呢?泥偶2022-04-28 01:26:24

可以。只要 SSD 韌體禁用 512e (512-byte Emulation) 模式,就不會再有 4K 對不齊這件事了。代價就是不再向後相容。

標簽: 4K  扇區  對齊  SSD  512B