感謝文文姐的好書推薦
第一章 SSD綜述
SSD(Solid State Drive)固態硬盤,以半導體閃存(NAND Flash)作為介質的存儲設備。
主要由:主控,內存,緩存芯片DRAM,PCB(電源芯片,電阻,電容等),接口(SATA,SAS,PCIe等)。主體為PCB。
存儲介質:1. 光學存儲介質:DVD,CD等光盤介質,靠光驅等主機讀取或寫入。
2. 磁性存儲介質:HDD。
3. 半導體芯片存儲介質:SSD。主要是:閃存,3DX Point,MRAM,RRAM等。
SSD相對HDD的優勢:性能好:能超過幾倍甚至幾百倍,特別是在隨機讀寫上。
功耗低:HDD為6~8W,SATA SSD為5W,待機時SSD可以降到mW。
抗震防摔:SSD內部沒有機械部件,而HDD磁頭和磁片發送碰撞,會產生物理損壞。
無噪音:因為SSD不需要HDD的馬達。
小巧:HDD一般3.5/2.5寸。SSD除此之外還有可以貼在主板的M.2,甚至16mm*30mm的芯片級別。
SSD的三大模塊:前端接口和相關協議模塊。中間FTL層(包含:壞塊管理,地址轉換,垃圾回收,磨損均衡)。后端和閃存通信模塊。
SSD前端負責和主機通信,接收數據和命令,返回狀態和數據給主機。采用如:SATA(ATA協議),SAS(SCSI協議),PCIe(NVMe協議)等接口與主機連接。
SSD的幾大核心參數:
1. 基本信息:容量,介質信息,外觀尺寸,重量,環境溫度,震動可靠性,認證,加密等。
2. 性能指標:連續讀寫帶寬,隨機讀寫IOPS,時延,最大時延。
3. 數據可靠性和壽命:可靠性,壽命。
4. 功耗:Power Management,Active Power和Idle Power。
5. 兼容性:Compliance,Compatibility。
基本信息:
1. 容量:對於128GB十進制和二進制中,二進制會比十進制多7%。一般稱二進制為裸容量,十進制為用戶容量,多的7%用於空間管理和存儲內部數據。
2. 介質信息:如壽命,擦除和讀取時間,溫度的影響等。如表1-6.
SLC單位存儲1bit速度快,壽命長,但價格為MLC的3倍。MLC單位存儲2bit,速度一般,壽命一般,價格一般。TLC單位存儲3bit,速度慢,壽命短,價格便宜。
3. 外觀尺寸:如2.5寸,3.5寸,M.2,PCIe,mSATA,U.2等標准。
4. 溫度:工作溫度0~7°,開機后。非工作溫度-50~90°,運輸時。
性能剖析:
1. 性能指標:IOPS:單位處理IO次數。吞吐量:每秒處理數據量。響應時間:時延,即發出到收到的時間。
2. 訪問模式:隨機和連續,隨機就是連續的命令LBA不連續。Block Size塊大小,一般隨機測試4k,順序測試512k。讀寫命令混合,將讀寫按照比例混合進行測試。
3. 時延指標:平均時延指總時間除以總命令。最大時延則是響應時間最長的,直接影響用戶體驗。
4. 服務質量:Quality of Service,QoS。通過記錄2個9(99%)以及5個9(99.999%)的查看分布。
5. 性能數據一覽:對SSD來說滿盤和空盤寫入速度相差很大(會觸發垃圾回收)。對HDD來說由於覆蓋寫,因此滿盤和空盤寫相差不大。
壽命剖析:總壽命是多少,能寫入多少數據量
1. DWPD:每天可以把盤寫滿多少次。如:200GB SSD 五年使用期限內對應壽命是3600TB,平均每天1972GB。相當於每天可以寫入10次。
2. TBW:SSD的生命周期內可以寫入的字節數。TWB=單盤容量 * NAND鞋擦出壽命 / 寫放大。 DWPD = TWB / (年限 * 365 * 單盤容量 )
數據可靠性剖析:
1. UBER:不可修復的錯誤比特率。即應用了糾錯機制后仍產生的錯誤數。原因在於:擦寫磨損,讀取干擾,編程干擾,數據保持。
2. RBER:原始錯誤比特率
3. MTBF:平均故障間隔時間。主要考慮失效率,由於不同環境區別很大,因此需要借助軟件進行測試。
功耗和其他剖析:
1. SSD產品功耗:空閑功耗(Idle):SSD沒有接受命令,但也不進入省電模式。Max active功耗:最大工作負載的功耗,如連續寫。
Standy/Sleep功耗:Standy,Sleep下,盡量把不工作的模塊關閉,一般100~500mW。 DevSleep功耗:這是在Standy和Sleep在降一級,配合操作系統完成休眠,一般10mW以下。
對於SSD的功耗模式需要和主機配對,當主機切換到某功耗模式下,SSD也進行切換。
S0:工作模式,OS可以管理SATA的Power State。
S1:低喚醒模式,系統上下文不會丟失,硬件負責維持。
S2:與S1相似,但處理器和系統Cache上下文會丟失。需要從系統的reset vector開始。
S3:睡眠模式,CPU不執行命令,SATA SSD關閉,除了內存之外的所有上下文丟失。保存一部分處理器和L2Cache配置上下文。
S4:休眠模式,CPU不執行命令,DDR寫入SSD中,所有上下文丟失。
S5:相似S4,但不會保存和恢復任何上下文,消耗電量很少,可通過鼠標喚醒。
2. 最大工作功耗與發熱控制:因為功耗主要在於主控和閃存,其也是發熱大戶。若熱量積累到一定程度,器件就會損壞,50~60度不加以控制概率就會增大,因此控制溫度需要設計降溫算法。
SSD溫度傳感器感受到70度,啟動算法,限制閃存后端並發寫的個數,但也帶來性能的下降。
SSD的兼容性:
1. BIOS和操作系統的兼容性:SSD上電后,主機BIOS開始自檢。與SSD發送連接,識別並讀取盤信息(產品號等),驗證格式和數據的正確性,讀取其他信息,直到讀取到MBR(主引導程序)
再讀取硬盤分區表(PDT),找到活動分區中分區引導記錄(PBR),並將控制權給PBR。(若任意一步出錯都會導致藍屏等)
兼容性認知:OS種類,主板上CPU南北橋芯片組信號和各個版本。BIOS各個版本。特殊應用程序各個版本。
2. 電信號兼容性和硬件兼容性:主機提供的電信號出於非穩定狀態,存在抖動但仍在誤差內。此時需要SSD設計,並能正常工作。
3. 容錯處理:即主機發生錯誤的條件下,若能提供足夠日志就更好了。
接口形態:為了統一規范,制定了Form Factor規范。
SATA SSD為消費級產品和企業級低端產品。
PCIe借助高性能,以及NVMe的的定制和普及,開始興起。
SAS SSD基本用於企業級,由於成熟的SAS協議和軟件生態,從HDD到SSD,雖然介質變了,但接口沒變。
mSATA與標准SATA相比體積減小,用於消費級筆記本,但M.2出現后,基本替代了M.2。
M.2作為超極本量身定制的接口標准,用於替代mSATA,具備小巧等特點。
U.2 起步於PCIe,后用於統一SATA,SAS,PCIe物理接口,減少下游SSD應用場合的接口復雜度。
2.5寸:主流企業的SSD,包括SATA,SAS,PCIe接口。由於閃存密度逐年增大,容量會越來越大。
M.2:B和M key,是兩種主流M.2的定義。B為Socket 2,M為Socket 3。M可以多支持PCIe 4通道。
BGA SSD:隨着高度集成化,封裝技術越來越成熟,PCB 2.5寸大小的存儲器可以放到16*20 mm^2 BGA中。
M.2 BGA相對M.2 節約15%空間,增加10%電池壽命,節約0.5~1.5mm的高度。具有更好散熱性(封裝后,由ball pin傳導走)
江波龍P900PCIe BGA SSD:率先發布目前世界最小尺寸的NVMe PCIe SSD(11.5mm*13mm)。容量方面可以提供512G~60G的選擇。支持PCIe接口,NVMe協議,主控配備硬件加速器。
支持微軟HMB功能,支持Boot Partition功能,采用了64層3D TLC,相對2D有更高存儲密度。
SDP(SATA Disk in Package):將SSD主控,閃存芯片封裝成一體化模塊,只需要加上外殼就成為了SSD產品。
相對傳統PCBA品質高,靈活性好,CKD適合,庫存管理輕松。同時SSD成品生產時間從15天縮短到1天。產能15k/天變為100k/天。
U.2:目的統一SAS,SATA,PCIe接口,方便部署。
固態存儲市場:SSD正在取代HDD。
HDD與SSD應用場合:SSD主要存放熱數據,需求小,但性能優先的。HDD存放溫和或冷數據。容量大價格優先的。
數據加速層:PCIe接口的高性能SSD
熱數據:普通SATA SSD和SAS SSD
溫數據層:高性能HDD
冷數據:HDD
歸檔層:大容量廉價HDD甚至磁帶。
第二章 SSD主控和全閃存陣列
前端:主機接口:用來與主機通信,主要為SATA,SAS,PCIe。
SATA為Serial Advanced Technology Attachment 串行高級技術附件。
SAS 為Serial Attached SCSI 串行連接SCSI。SAS可以向下兼容SATA,接口標准上看,SATA為SAS的子標准,SAS控制器可以控制SATA盤,SATA控制器不能控制SAS盤。
SAS由3種協議構成:SSP用於傳輸SCSI命令。SCSI管理協議SMP用於對連接設備的維護和管理。STP用於SAS和SATA直接的數據傳輸。 因此可以和SATA以及部分SCSI設備結合。
PCIe 作為高速串行計算機擴展總線標准。提供電源管理,錯誤報告,端對端的可靠性傳輸,熱插拔,服務質量(Qos)等功能。單道最高可達2GB/s,最多有32個通道。
前端接收串行比特數據流,轉為數據信號給前端后續模塊處理。其中涉及數據搬移會使用DMA。命令信息放到隊列,數據放到SRAM。若涉及加密壓縮會進行處理,但可能造成瓶頸。
以一條SATA Write FPDMA命令為例:主機發送寫命令,請求到達南橋AHCI寄存器,AHCI執行請求進行寫操作。
1. 主機在總線發出Write FPDMA命令FIS(實現異步傳輸而使用的封包)
2. SSD收到命令后,判斷內部寫緩存(Write Buffer)是否有空間去接受新數據,有則發送DMA Setup FIS到主機,否則什么也不發,主機處於等待。
3. 主機端收到DMA Setup FIS,發送不大於8k數據的Data FIS給設備。
4. 重復2~3直到數據發送完畢。
5. 設備發送Status FIS給主機,表示操作完成。Status可以是good 或 bad表示正常或者異常。
SSD接收命令和數據放到SSD內部緩沖區后,前端固件模塊需要進行解析,並分派任務給中端FTL,判斷是讀/寫命令,其實LBA位置和長度,是否有其他屬性。命令解析完放到隊列,排隊等待中斷FTL排隊處理。由於擁有了LBA和數據長度重要信息,可以准確映射到物理空間。
(多核CPU,軟件分為對稱多處理(SMP)多核共享OS和執行同一份代碼。非對稱多處理(AMP)多核分別執行不同代碼)
主控CPU:即SSD控制器SoC模塊,由一個或多核CPU構成。代碼存儲區為I-RAM,數據存儲區D-RAM。外圍模塊如UART,GPIO,JTAG,以及定時模塊等。
后端:ECC模塊和閃存控制器。
ECC模塊為數據編碼單元,為了保證數據正確性,給原數據進行校驗保護。包括BCH和LDPC,LDPC逐漸成為主流。
閃存控制器負責管理數據從緩存到閃存的讀寫。從閃存控制器角度看,為了並發可以配置多個通道,一個通道掛多個閃存(取決於SSD容量和性能)。
(閃存芯片 Die/LUN是一個閃存命令執行的基本單元,外部接口:8個IO接口,5個使能信號(ALE,CLE,WE#,RE#,CE#),1個狀態引腳(R/B#),1個寫保護引腳(WP#)。命令,地址,數據通過8個IO接口輸入輸出,寫入數據需要WE#,CE#信號拉低,數據在WE#上升沿鎖存,CLE/ALE區別數據還是地址)
-----------------------TODO SSD主控廠商-----------------------------------------
桂格(SiliconGo)SG9081主控
1. HAM+GoCache加速隨機讀寫IOPS:HAM作為硬件加速器,釋放了MCU的資源,加速了算法的實現。主控集中了GoCache高效實現了映射關系。
2. DMAC加速順序讀寫:在數據傳輸時不用一直占據MCU資源,DMA啟動后,將總線交給DMAC,此時MCU可以做其他工作。
3. LDPC+RAID提高可靠性,增強閃存耐久度和數據留存能力:由於2D向3D轉換,糾錯能力已經無法滿足了,LDPC+RAID可以提高穩定性。
企業級與消費級歸一化設計:通常企業級SSD更注重隨機性能,延遲,IO Qos的保障。消費級注重順序性能,功耗,價格等。
1. 成本方面:企業級SSD對控制器價格不敏感,因此需要注重消費級成本,優化硬件資源。
2. 性能方面:在數據中心對數據流做了大量優化,數據以順序方式寫入SSD,降低了企業級隨機性能的需求。
3. 壽命:主要原因在閃存的耐久能力。SSD控制器則能確保加強閃存的糾錯能力。
4. 容量:控制器需要較小的代價支持大容量的閃存。
5. 可靠性:企業級一般要求ECC與DIE-RAID兩次保護。隨着3D發展,消費級也開始提供DIE-RAID,因此目標趨於一致。
6. 功耗:消耗級如平板,筆記本等,對功耗要求嚴格,隨着企業 SSD大規模部署,低功耗也成為企業級的追求目標。
全閃存陣列AFA:包含兩個X-Brick(一個高級UPS電源,兩個存儲控制器,磁盤陣列櫃DAE(包含了多個SSD用SAS連接到存儲控制器)),一個Infiniband交換機(連接多個X-Brick)。
存儲控制器:配有兩個電源,兩個CPU(256G內存),兩個Infiniband控制器,兩個SAS HBA卡。
配置:內部容量10TB,可用容量7.5TB。但考慮去重和壓縮大約5:1。實際使用37.5TB。
性能:平均帶寬350~400MB/s,20k IOPS,最高20GB/s 200k IOPS。
硬件架構:EMC XtremIO完全根據閃存特性設計,一個X-Brick包含兩個存儲控制器,封裝了25個400G的SSD,原始容量10TB,擁有兩個電池備用電源。
擦除壽命為普通MLC長了一個數量級。X-Brick支持級聯,如Scale-Out架構可以達到4/8個
40Gbps Infiniband接口用於后端連接數據庫。陣列和主機控制端可以使用8Gbps的FC,或10Gbps的iSCSI。
同時采用為每塊數據Hash唯一值,來進行去重,剩下大量空間。一個X-Brick,4KB寫,100k IOPS。 4KB讀,250k IOPS。
軟件架構:XtremIO (XIO)硬件構造的核心在軟件。XIO軟件幾大殺器:
1. 去重提高性能,降低寫放大延長了壽命。2. 分區容量隨着使用自動增長(直到寫滿)。3. 先進的鏡像架構保障容量和性能不會受損。4. XDP數據保護:RAID6保護數據。5. VAAI集成。
XIO核心設計思想:
1. 一切為了隨機性能:任何節點訪問任何數據塊,不會增加額外成本。使得節點增加性能也會線性增長。
2. 盡量減少寫放大:由於SSD的寫放大,不僅導致壽命縮短,還會因擦除次數上升,導致質量下降,數據可靠性下降。XIO設計目的讓實際寫入數據量減少。
3. 不做全局垃圾回收:XIO使用的是SSD陣列,SSD內部有高性能企業級控制芯片,當前SSD主控非常強大,因此效率很高。不必全部做垃圾回收,節約了時間。
4. 按照內容存放數據:數據存放的地址由數據內容生成,跟邏輯地址無關。使得數據可以放在任何位置,提高隨機性能。讓數據隨機放置在整個系統中。
5. True Active/Active 數據訪問:LUN沒有所有者一說,所有節點都可以為任何卷服務,因此不會因為一個節點出問題而影響性能。
6. 擴展性好:性能容量都可以線性擴展。
XIO軟件運行在用戶態的優勢:
1. 避免內核態的進程切換。
2. 開發簡單,不需要借助內核接口,以及復雜的內存管理。
3. 不必受到GPL約束。Linux是開源系統,程序運行在內核必然運用內核代碼,按照GPL規定,必須開源,而在用戶態就不必了。
工作流程:
XIO分為6個模塊。三個數據模塊R,C,D,三個控制模塊P,M,L
1. P(Platform 平台模塊):監控系統硬件,每個節點都一個P模塊在運行。
2. M(Management 管理模塊):實現系統配置,如創建卷,LUN等。
3. L(Cluster 集群模塊):管理集群成員,每個節點運行一個L模塊。
4. R(Routing 路由模塊):將SCSI翻譯成XIO內部命令。負責接管FC和SCSI命令,將讀寫數據大小拆成4k,通過SHA-1算法計算Hash值。每個節點運行一個R模塊。
5. C(Control 控制模塊):記錄了映射表A2H(數據邏輯地址-Hash值),具備鏡像去重擴容等功能。
6. D(Data 數據庫):包含了另一個映射表H2P(Hash值-SSD物理存放地址)。可以看出了,數據的存放地址和邏輯無關,只跟數據有關。負責對SSD的讀寫,負責RAID技術。
讀數據流程:
1. 主機將命令通過FC或iSCSI接口發送給R模塊,包含了數據塊邏輯地址和大小。
2. R模塊將命令拆分成4KB大小,轉給C模塊。
3. C模塊查詢A2H表得到Hash值。轉發給D模塊。
4. D模塊查詢H2P表得到SSD的物理地址,讀取。
不重復的寫流程:
1. 主機將命令通過FC或iSCSI接口發送給R模塊,包含了數據塊邏輯地址和大小。
2. R模塊將命令拆分成4KB大小,轉給C模塊。
3. C發現Hash值沒有重復,插入表中,交給D。
4. D模塊分配物理地址,寫下去。
可去重的寫流程:
1. 主機將命令通過FC或iSCSI接口發送給R模塊,包含了數據塊邏輯地址和大小。
2. R模塊將命令拆分成4KB大小,轉給C模塊。
3. C模塊查詢A2H表,發現重復塊,轉給D模塊。
4. D模塊知道有重復數據,不寫了,引用次數加一。
這種情況下,復制數據僅僅計數修改一下即可。
EXSi和VAAI:對於虛擬化產品中VMware Server按照在操作系統之上。ESXi則內嵌在操作系統。相當於虛擬平台,上面有多個虛擬機。
VAAI:是虛擬化的標准語言之一,其實就是EXSi發送命令的協議。
復制流程:如圖2-32
1. EXSi虛擬主機用VAAI語言發送一個虛擬機(VM)復制的命令。
2. R模塊通過iSCSI或FC收到命令,選擇一個C模塊進行復制。
3. C模塊解析出命令內容,將VM地址0~6復制到7~D並把結果發送給D模塊。
4. D模塊查詢Hash表,發現數據重復,沒有寫數據,僅僅引用+1.
因此,R和上層打交道,C作為中間層,D與SSD打交道。對於R,C,D不在同一CPU下,模塊間通過Infiniband來通信,數據使用RDMA,控制通過RPC實現。Infiniband使得X-Brick增加,延遲也不增加。因為Hash會隨意落到C上,性能會線性改變。
應用場景:對於數據庫來說性能高,復制不占用空間,可以創建多個副本。對於虛擬機來說很多數據也是重復的。
帶有計算功能的固態硬盤:如帶有FPGA的SSD-CFS。采用PCIe 3.0 * 8性能可達5GB/s。FPGA提供計算加速,數據從SSD出來就已經算好,釋放了CPU。
對於人工智能來說,FPGA的人工智能硬件算法直接對SSD內部海量數據進行分析,並把結果發給主機。
第三章 SSD存儲介質:閃存
閃存器件原理:一般采用NAND閃存。由於閃存寫入之前必須擦除,不能覆蓋寫,所以需要垃圾回收。每個塊寫入次數有限,所以要做到磨損平衡。
但閃存是一種非易失性存儲器。掉電不丟數據。閃存基本單元Cell是一種類NMOS的雙層浮柵MOS管。如圖3-1.
在源級和漏級直接形成存儲電子的浮柵,上下被絕緣層包裹,因此不會丟失數據。
寫操作在控制層加正電壓,讓電子進入浮柵極。擦除在底部加正電壓,將電子吸出。如圖3-2.
對於一個存儲單元存儲1bit數據的閃存稱為SLC。2bit為MLC。3bit為TLC。甚至有研發存儲4個為QLC。
對於存儲狀態,將內部含有電子數進行划分,如MLC來說,低於10個電子為0;11~20個為1;21~30為2;多於30為3。
因此bit越多,閃存容量越大。但電子划分越多,控制的越精細,耗時越長。讀取時也要采用不同電壓進行讀取,因此性能TLC不如MLC,MLC不如SLC。
閃存芯片架構:將存儲單元按照組織結構進行組成。
一個閃存有若干DIE(或叫LUN),每個DIE有若干Plane,每個Plane有若干Block,每個Block有若干Page,每個Page對應一個Wordline,Wordline有成千上萬存儲單元。
DIE/LUN是接收命令的基本單元。1個LUN有多個Plane,每個Plane有獨立Cache Register和Page Register相當於一個Page大小,當讀寫數據時,將數據放到Cache Register。
Page Register則用於優化速度,使得讀時,在傳輸前一個數據到主控時,可以從閃存獲取下一個數據。
由於同一Block共用一個襯底,所以在擦除時,加一個強電壓,同一Block的電子都被吸取。
讀寫擦原理:
1. 擦除:擦除前浮柵上可能有電子,Pwell加20V電壓,由於量子隧道效應,電子從浮柵到達溝道。一個LUN上的MOS管公用一個Pwell,但其他不用擦除的Block的柵極電壓是懸空,不會有隧道效應。
2. 寫:寫入時要寫的單元Wordline為高電壓,Bitline=0V則成為0,不寫Bitline=2V成為1。
3. 讀:不讀的Wordline為5V,讀的為0V,Bitline端可以進行檢測。
三維閃存:隨着二維尺寸減少,干擾增加。開始采用高堆疊柵極結構來提高集成密度。
三維通過堆疊增加密度,但導致串電流減小,高低層特征差異增大。
由於層數增加,Block的page數增加,Block的讀取數增加,讀取干擾嚴重。若要降低干擾,只能降低電壓,減少電流,導致信號更弱。
單元模具厚度減小,尺寸不斷減少,干擾越來越強。
Charge Trap(CT)閃存:對於浮柵晶體管中間采用導體。CT則采用絕緣體。區別在於存儲電荷的元素不同。因此浮柵內電子可以移動,但CT內電子如同落入陷阱,很難移動。
由於浮柵對於下層絕緣層很敏感,若制程不斷變薄或者老化,會導致進出容易。但CT即使老化,電子也不易出來。
浮柵材料為導體。任何兩個導體中間有絕緣體都可能成為電容器,影響其他單元的電荷變化。隨着厚度減小,距離減小,影響越來越大。
因此CT對隧道氧化層要求不那么苛刻。有更小的單元間距。隧道氧化層磨損更慢。更節能。工藝更容易,小尺寸更容易實現。
3D XPoint:最新DDR4內存,讀寫速度可達61GB/s和46GB/s。PCIe單通道理論1GB/s或0.5GB/s。一般僅僅4通道,即4GB/s或2GB/s。SATA理論只有600MB/s。機械硬盤讀寫215MB/s和140MB/s。
當前的器件多之又多:
1. 憶阻器:ReRAM
2. 鐵電存儲器:FeRAM
3. 磁阻RAM:MRAM
4. 相變存儲器:PRAM,PCM
5. 導電橋接RAM:cbRAM,又稱可編程金屬元存儲器PMC
6. SONOS RAM:Silicon-Oxide-Nitride-Oxide-Silicon
7. 導電金屬氧化物存儲器:CMOx
如圖3-24, 目前比較成熟的是相變存儲器PCM-PRAM。
想變存儲器:原理則是如水從液體(不頂形態)變成固體(晶體),PCM通過微小的電阻讓玻璃融化變為晶體,如GXT在不同形態下電阻差距較大,因而出現了0/1。
寫的時候通過加熱完成相變,讀的時候通過測量Bitline的電壓值判斷電阻高低。
異步時序:對於閃存一般來說,異步傳輸速率慢,同步快。異步沒有時鍾,讀數據通過RE_n觸發,寫通過WE_n觸發。同步有一個時鍾信號,數據讀寫和時鍾同步。
CLE:CLE有效時,IOx發送命令。
CE_n:用來選通一個邏輯芯片(Target)。
WE_n:寫使能,用戶發給閃存,意味着發過來的寫數據可以采樣了
ALE:ALE有效時,IOx發送地址。
IOx:數據總線
時間參數如下:
twp:WE_n低電平的寬度。 twh:WE_n高電平的時間。twc:twp+twh的時間。tds:數據建立時間,8bit都達到穩定的時間。tdh:數據穩定的時間,可以用來采樣。
如圖3-32,可以看出數據寫入時,數據不能傳地址和命令,因此ALE和CLE都無效,CE有效,每個WE周期對應一次有效數據傳輸。
RE_n:讀使能,用戶發給閃存,意味着閃存准備好數據,等待用戶采樣。
RB/_n:Ready/Busy,閃存在內部讀取Busy_n有效,數據准備好后可以來讀Ready_n有效。
如圖3-33,對於讀取:用戶發送讀信號Ready拉高,意味着數據准備好了。發送RE_n每個RE_n周期,閃存發送數據到數據總線,供用戶采樣。
同步時序:閃存基本使用DDR(Double Data Rate)技術,每個時鍾周期傳兩撥數據。
CLE:時鍾,上升沿和下降沿有數據觸發。意味着100MHz的時鍾頻率,速率為200MT/s。
W/R_n:寫時高電平,讀時低電平。
DQS:用於區分數據傳輸周期,便於接收數據。讀數據時,DQS由閃存產生。寫數據時,有用戶產生。
DQ【7:0】:數據總線。
時間參數:tcals:CLE,W/R_n和ALE的建立時間。tdqss:數據輸入到第一個DQS跳變沿的時間。
如圖3-34,對於寫入ALE和CLE有效后,第一個CLK上升沿,數據准備傳輸。經過tDQSS時間后,DQS開始跳變,位於DQ數據信號穩定位置后。每半個時鍾周期,輸出一組數據。
如圖3-35,對於讀取只不過W/R_n是低電平。
閃存尋址:一個Target作為獨立工作芯片。包含多個LUN,每個LUN包含多個Plane,每個Plane包含多個Block。每個Block包含多個Page。
閃存采用行地址和列地址。列地址則是Page內部偏移。行地址為LUN,Block,Page地址。位寬與芯片容量有關。(Plane是在Block地址的最低位)
讀寫擦時序:讀時序:00~30h時間,傳輸了地址如2個列地址,3個行地址。命令發送后狀態轉為Busy,一段時間后轉為Ready,可以讀取。
寫時序:一般列地址為0,因為要把一個Page寫滿。發送地址后發送數據。
擦時序:在命令60h~D0h之間,發送LUN和Block即可。
閃存特性:
1. 閃存壞塊:閃存具有一定壽命,接近或超過最大擦除次數,會導致永久性損傷。
閃存中的存儲單元先天有一些就是壞的,隨着使用越來越多。必須ECC糾錯碼進行保護。
2. 讀干擾:當讀取閃存頁Page時,未選擇的頁需要加正電壓,使得未選中的MOS管是導通的。因此頻繁的加正電壓,可能導致電子吸入浮柵,形成輕微寫。因此讀干擾會影響同一閃存塊其他閃存頁。
3. 寫干擾:寫干擾也會導致比特翻轉。對於初始存儲單元都為1,只需要寫0的單元。因此閃存頁加正電壓后,即使不需要寫的也會被迫加上。
4. 存儲單元間的耦合:如之前提到的 電荷是導體,中間絕緣體,因此存在耦合電容。
5. 電荷泄漏:長期不使用存在電荷泄漏,導致非永久性損傷。
壽命:對於寫入后電壓值高,Biline不導通讀取0。未寫入電壓低,Bitline能獲得電流讀取1。一定要讓兩個峰值有足夠距離。隨着擦寫會導致三種故障:
1. 擦過的晶體管電壓變大,從-Vt向0靠近,導致電流變小,檢測不出
2. 寫過的晶體管電壓變小,從+Vt向0靠近,可能誤檢測為擦除
3. 寫過的電壓變大,可能其他單元讀取時,把整個Bitline關閉。
浮柵晶體管氧化層變薄,對浮柵極內部電荷也有影響。
一般解決辦法:
1. Wear Leveling:磨損平衡,讓閃存塊均衡擦寫。
2. 降低寫放大:寫放大越低,磨損速度越慢。
3. 用更好的糾錯算法:糾錯能力越強,允許出錯率越高。
MLC:擦除閃存塊約幾毫秒。讀寫以閃存頁為單位。包含4KB,8KB,16KB等。對於MLC和TLC,Page應該順序寫入:一個存儲單元有兩個閃存頁數據,相鄰單元存在耦合,因此寫后面需要保證前面寫完。
對於一個單元有2bit數據。必須先寫Lower在寫Upper,若寫入Upper時掉電,會導致Lower數據也丟失。同時對於寫Lower時間短,Upper時間長。
對於常識規定,若已經寫入的數據,應該就是安全放心的。但對於MLC,若寫入Lower后,再寫入Upper出現故障,也可能導致之前寫入Lower的數據損壞。
因此方式:1. 只寫Lower,適合土豪。2. 定期填充Upper,若發現Lower寫入,將Upper也寫入。3. 寫Lower時,將數據備份到其他閃存,當Upper寫入后,再將備份刪除。
4. MLC當做SLC使用,隨后將SLC數據以垃圾回收方式搬到MLC。
讀干擾:讀干擾會讓浮柵極進入電子,使電壓出現偏移。影響讀取,存在誤判。主要原因在於閃存塊上讀取次數以及閃存塊擦除次數。
可以在讀取次數達到閾值前,數據刷新一遍(讀取,擦除並寫回)。
閃存數據保存期:數據不可能永久保存,閃存中數據期限為Data Retention。超過期限數據出錯,標志為無法使用ECC糾錯成功。主要原因:
1. 焊接問題:虛焊或芯片故障,導致命令無法執行。
2. 讀寫擦失敗:基本命令執行失敗。
3. ECC糾錯失敗:錯誤率太高,超過了糾錯能力。Data Retention作為元凶。(原因則是電壓導入的電子,泄漏)
閃存數據完整性:閃存隨着使用以及存儲時間變長,容易發生比特翻轉,出現隨機性錯誤。隨着制程變小越發嚴重。
常用技術:1. ECC糾錯 2. RAID數據恢復 3. 重讀 4. 掃描重寫技術 5. 數據隨機化
讀錯誤來源:1. 擦寫次數增多:氧化層老化,電子進出容易,電荷發生異常。
2. Data Retention :電子丟失,電壓偏移發生誤判。
3. 讀干擾:讀一個wordline時,對其他閃存頁出現輕微寫。
4. 存儲單元之間干擾:浮柵極是導體,中間絕緣體,形成電容。
5. 寫錯誤:寫Upper時導致Lower錯誤。
重讀:對於電壓平移,因為只是平移,間隔還在,可以不斷改變參考電壓。甚至可以讀取附近確定狀態的電壓,再來判斷。
ECC糾錯碼:固態硬盤控制器有ECC糾刪模塊,部分閃存內部也集成了糾錯模塊。常用算法有BCH、LDPC等。用戶數據都寫在閃存頁(page)上,內部有預留空間由於ECC糾錯。
靜態ECC糾錯:即ECC模塊空間不變,糾錯能力也是不變的。但隨着閃存的使用,出錯概率逐漸變大。但預留空間也是不變的(OP,Over Provisioning)
動態ECC糾錯:ECC模塊空間越來越大,糾錯能力越來越強。甚至不同Die不同Page都有不同糾錯能力,對MLC來說,Lower比Upper更穩定一些,可以使用弱一些的ECC保護。
RAID:RAID內部就是閃存陣列,因此可以借鑒磁盤陣列。如RAID5,將多個Die進行異或做校驗值,這樣有一個出錯,仍可以進行恢復數據。
但固態硬盤架構不同磁盤陣列,很難實現。對於條帶來說,不能覆蓋寫,每次寫入都寫到新地方。如果條帶上某個Die被垃圾回收,整個條帶都需要重寫。同時為了寫滿一個條帶,更是增加了寫放大。
數據隨機化:對於不斷輸入全0或全1很容易導致電量不均衡,造成抗干擾能力下降,數據可靠性變差。如圖3-61可以看出每個單元都受到周圍4個直接相鄰的單元影響。
因此部分廠商采用加入干擾碼(對數據隨機化),讓寫入閃存的0和1盡量均衡。一般使用AES加密。如圖3-62,在數據進入閃存前進行加密。
第四章 SSD核心技術 FTL
FTL算法的好壞,直接決定了SSD在性能,可靠性,耐用性等方面的好壞。
FTL完成了用戶邏輯空間,到閃存物理空間的翻譯 、映射。除此之外,SSD中的FTL還有很多事情。SSD使用的存儲介質一般為NAND Flash閃存(除此還有RAM,3D XPoint)
閃存的特性:
1. 擦除才能寫入,不能覆蓋寫。因此寫入新數據時不能直接更改需要更改位置。FW需要維護一張邏輯地址到物理地址的映射表。當往新地址寫數據后,舊地址數據變為垃圾數據。FTL會進行垃圾回收。
2. 閃存塊都是壽命的。采用PE數衡量每個閃存塊擦除所造成的磨損。因此不能集中向幾個閃存塊寫數據。FTL需要做Wear Leveling讓數據均攤到每個閃存塊。
3. 閃存塊讀取次數有限,讀太多數據便會出錯,造成讀干擾。當某個閃存塊讀取次數到達一定閾值,FTL需要將數據從閃存塊上搬走。
4. 閃存的數據保持問題。由於電荷的丟失,閃存的數據會發送丟失。SSD若連接電源后,FTL會掃描閃存,發現是否有數據保持問題,如果有則需要搬動數據。
5. 閃存天生的壞塊。壞塊管理是FTL的任務。
6. MLC或TCL中Lower問題。對於Upper寫入會導致Lower失效。FTL需要擦去策略。
7. MLC或TLC讀寫速度不如SLC,但可以配合成SLC來使用。 FTL會利用該特性改善性能。
FTL分為Host Based(基於主機)和Device Based(基於設備)
Host Based:說明使用主機的CPU和內存資源。如圖4-1.
Device Based:說明在設備端實現。 如圖4-2.
映射管理:根據力度不同,存在基於塊的映射,也有基於頁的映射,還有混合映射。
由於塊比較大,映射表空間小,但寫入少量數據也會讀取整個物理塊,修改頁的數據,再寫入整個物理塊。用戶空間划分成Region,Region大小和塊大小相同。
頁為映射粒度,每個頁都有對應映射關系,因此需要更多空間存儲映射表,但性能更好。
混合映射,對於一個邏輯塊映射到一個物理塊,在塊內,每個頁不是固定的,采用映射的方式。
映射原理:用戶通過LBA訪問SSD。每個LBA代表一個邏輯塊(512B/4KB/8KB),將用戶訪問SSD的基本單位稱為邏輯頁。SSD內部以閃存頁為基本單元,讀寫閃存,稱為物理頁。
用戶每寫一個數據頁,SSD就會找到一個物理頁將數據寫入。記錄了映射。
由於閃存頁和邏輯頁大小不同,一般前者大,所以一般多個邏輯頁寫到一個物理頁。邏輯頁和子物理頁一一對應。
對於256GB的SSD,4KB大小的邏輯頁為例。用戶共有64M個邏輯頁,若映射關系為4B,約256MB。因此,一般來說映射表是SSD容量的千分之一。
SSD中的DRAM則用來存儲這張表。部分不帶DRAM的,采用二級映射。一級映射表常駐SRAM,二級映射小部分在SRAM,大部分在閃存。
HMB:映射表除了放在DRAM,SRAM,內存外,還可以放在主機內存。
SSD一種帶有DRAM用於存放映射和緩存數據,另一種不帶DRAM,緩存數據用主控的SRAM,映射表采用二級映射,占用部分SRAM。NVMe則允許使用主機的DRAM。
映射表的刷新:在SSD掉電前,需要將其寫入到閃存,下次上電初始化時再將其加載。為了防止異常掉電導致映射丟失,采用一定策略,在運行時就將映射寫入。
寫入觸發:1. 新產生映射累積一定的閾值。2. 用戶寫入數據量到達一定閾值。3. 閃存寫完閃存塊的數量達到一定閾值。 4. 其他。
寫入策略:全量更新,增量更新。
垃圾回收:作為FTL重要任務。
模擬場景:SSD底層有4個通道(CH0~CH3),連接4個Die(每個通道Die可並行),每個Die有6個塊,每個塊有9個小方塊(大小等於邏輯頁)24個塊中20個為SSD容量4個為預留空間。
順序寫到4個邏輯頁,分別寫到不同通道,增加並行性。數據將不斷交錯寫入,直到SSD寫滿。如圖4-16
盤雖然從用戶看來寫滿,但由於OP的存在,並未寫滿。這時繼續寫入必須刪除之前的內容。但由於不能直接覆蓋,因此需要先寫到其他位置(即OP)深色代表無效數據,當OP也寫滿,如圖4-18.則觸發GC(實際中在滿之前就會觸發)將深色數據垃圾回收,進行擦除。
但現實中,數據通常隨機寫入,如圖4-21,每個塊中都有部分垃圾,部分數據。因此通常采用選擇先將垃圾多的塊進行回收。多出的空閑塊,用戶就可以繼續寫入數據了
寫放大(WA, Write Amplification):由於GC原因,為了騰出空間,需要額外數據的搬移。 寫放大 = 寫入閃存的數據量 / 用戶寫入的數據量。
對於空盤寫放大一般為1.但如果存在壓縮,寫放大可能小於1.
寫放大越大,意味着寫入多,影響壽命。同時占用底層帶寬,影響性能。因此盡量讓WA小,可以采用壓縮方方法(主控決定),順序寫,增加OP。
影響寫放大因素:
1. OP:OP越大,WA越小。
2. 用戶寫入Pattern:順序寫入GC就小。
3. GC策略:挑選有效數據最少,垃圾數據最多的。控制GC產生空閑塊的數量。
4. 磨損平衡:為了平衡閃存擦除次數,需要進行數據遷移。
5. 讀干擾和數據保存處理:將數據搬移增加寫放大。
6. 主控:帶有壓縮與否
7. Trim:有沒有Trim。
垃圾回收實現: 1. 挑選源閃存塊。 2. 找出有效數據。 3. 將有效數據寫入目標閃存塊。
為了有利於挑選源閃存塊,需要維護閃存塊中有效數據量。甚至有的把閃存的擦寫次數也考慮進去(暗藏,磨損平衡)
找出有效數據時,若將Block全部讀取,浪費資源。因此可以在維護有效數據量的同時,用bitmap記錄有效數據,標識物理頁。當覆蓋寫時,不僅把當前bitmap置1,還需要把之前的清0
若沒有bitmap可以選擇將其全部讀取。但如何分辨呢?由於SSD寫入數據時,同時寫入了元數據(邏輯地址,數據長度,時間戳等),因此根據物理地址與邏輯地址映射,判斷是否和映射表一致可以判斷是否有效。
垃圾回收機制:可用內存塊小於閾值,SSD空閑,主機控制SSD進行垃圾回收。
Saber 1000HMS作為企業級SATA接口,具有主機控制SSD功能(Host Managed SSD)。使得在SSD空閑時,進行垃圾回收,提升了系統的穩定性。
Trim:對於用戶刪除文件,只是斷開了用用戶與操作系統的聯系,但在SSD內部,邏輯頁與物理地址映射還存在,認為數據有效。只有當操作系統在相同地方寫下數據時,才知道數據被刪除了。
Trim作為ATA命令,當用戶刪除文件,操作系統會發送Trim給SSD。之后SSD就可以刪除數據,不必當做有效數據進行遷移等。
在SCSI中叫UNMAP,NVMe中叫Deallocate。
FTL一般存儲這三張表,FTL映射表L2P記錄LBA對應物理頁位置。VPBM記錄每個物理塊上哪個物理頁有效。VPC記錄物理塊上有效頁的個數(垃圾回收時,排序找到數量最少的)。如圖4-36.
Trim工作:如圖4-37
1. 清除L2P table映射到空地址
2. 清除VPBM上對應的bit
3. 更新VPC的Count數
4. 重復1~3對每個LBA
5. 根據新的VPC重新計算GC優先級
6. 回收最少VPC的block
7. 擦除全是垃圾的block
磨損平衡:讓每個塊擦除保持均衡。SLC擁有十萬次,MLC幾千次,TLC一兩千甚至幾百次。
冷數據:不經常更新,基本只讀。熱數據:用戶頻繁更新,產生大量垃圾數據。年老的塊:擦除次數比較多。年輕的塊:擦除次數比較少。
動態磨損平衡:將熱數據寫到年輕的塊上。靜態磨損平衡:將冷數據搬到年老的塊上。
固件做靜態磨損平衡采用GC來做,但是選的不是有效數據少得,而是冷數據所在的閃存塊。
若冷數據(SWL)和熱數據(Host)甚至GC數據(熱數據)混合在一個Block內,會使熱數據無效后,冷數據也需要做GC,增加了寫放大。因此可以采用冷熱數據分離的方式。
掉電恢復:對於正常掉電,主機會通知SSD,比如SATA中:將buffer緩存的用戶數據刷入閃存。將映射表刷入閃存。將閃存塊信息寫入閃存。寫入SSD其他信息。處理完才會停電。
對於異常掉電,主機根本不會通知。簡單方法則是加電容,在掉電后,電容放電。或將內部RAM替換成掉電不丟失數據的東西,如3DX Point。
掉電會導致RAM映射表丟失,如果沒有映射表,就無法讀出物理地址。但可以進行重建。由於數據寫入時,順帶了元數據(LBA,時間戳,其他內容)因此可以全盤掃描,就能獲得所有映射關系。
對於全盤掃描可能花上幾分鍾甚至幾十分鍾。因此可以采用CheckPoint,定期將SSD中RAM的數據和SSD相關狀態寫入閃存。這樣只需要找到最后快照,並恢復后面部分映射即可。
壞塊:包括:出廠壞塊(從工廠出來就壞了),增長壞塊(隨着閃存的使用,好塊也變成了壞塊)。
壞塊鑒別:對於壞塊會將其第一個閃存頁和最后一個閃存頁的第一個字節和Spare區第一個字節上寫非0xFF的值。
用戶使用時,會先掃描所有塊,建立壞塊表。甚至存儲到特定區域,方便查詢。
壞塊管理策略:第一是略過Skip策略。第二是替換Replace策略。
對於略過策略,會直接寫到下一個塊上。對於替換策略則將好的塊進行替換(如 預留空間OP)。對於替換策略,需要維護一張重映射表。
對於略過策略可能導致並行度低於4,對於替換策略並行度不變,但如果某個Die比較差,整個SSD受限於那個壞的Die。
SLC Cache:由於SLC有更好的壽命,以及速度優勢。因此有些SSD用他來做Cache。
SLC Cache的優勢在於:1. 性能好 2. 防止Lower數據被損壞 3. 解決閃存缺陷,如MLC、TLC沒寫滿就讀可能讀到ECC錯誤。 4. 更多數據寫入量。
寫入策略:1. 強制寫入,必須先寫入SLC閃存塊再到MLC、TLC閃存。 2. 非強制:如果有SLC閃存,則寫SLC。否則可以直接寫MLC、TLC。
寫SLC Cache的優勢在於,MLC、TLC沒寫時滿發生Lower出錯,可以通過SLC恢復,只有無誤后再清楚SLC。
SLC的選擇:1. 拿出一些Block專門做SLC Cache。2. 所有MLC和TLC都可以作為SLC。3. 兩者混合。
RD和DR:RD是Read Distub,DR是 Data Retention。兩者都能導致數據丟失。
RD:對於讀閃存頁時,需要對其他Wordline也加入高電壓,出現輕微寫(1 -> 0)。由於是積累的效果,可以定期重新寫入。
DR:對於長時間,電子會穿過絕緣層,導致比特翻轉(0 -> 1)。
Device Based FTL:將FTL放入SSD主控。
在SATA,NVMe等協議的普及下,越來越標准化了。
缺點:FTL架構通用,不能具體做出定制化。控制芯片功能復雜,設計難度大,研發成本高。閃存更新快,需要控制芯片修改,成本高。企業級需要大容量,高性能,通用芯片支持有限。企業市場需要多種多樣。
Host Based FTL:將FTL放入主機驅動。
控制器大部分僅需FPGA,實現ECC糾錯和時序控制即可。
百度的軟件定義閃存:推出的SDP特點:
1. 沒有垃圾回收:使用大小為塊的整數倍,比如8MB。不需要垃圾回收,也不需要預留空間,沒有內部數據搬移的寫操作。
2. 沒有閃存級的RAID:互聯網公司一般有3個備份,不需要SSD的RAID了。
3. FPGA作為控制芯片:功能少:ECC,壞塊管理,地址轉換,動態磨損。實現了PCIe接口和DMA。
4. 每個通道向用戶開放:可以選擇寫入哪個通道。
5. 軟件接口層定義簡單:省略了文件系統,塊設備,IO調度,SATA協議等。直接發送同步命令到PCIe驅動。如圖4-57.
百度的軟件定義閃存,針對了自己的特性,保留了關鍵功能,節約了資源。
第5章 PCIe介紹
PCIe的速度:從PCIe版本1.0到3.0。速度從0.5,1,2GB/s,通道也存在1~32不等。因此若是3.0配上32通道速度可達64GB/s。
對於兩個設備之間的PCIe連接,叫做Link。具有全雙工特性(即擁有獨立的發送接收通道,並可以同時傳輸),如圖5-2.
SATA雖然也有兩個通道,但只能同時一個工作,因此為半雙工。
因此測出的速度是讀寫速度之和,若單值讀或者寫,速度應該減半。
計算方式:對於PCIe 1.0,比特傳輸速率為2.5Gbps,物理層采用8/10編碼(8bit數據傳輸10bit,多2位用於校驗)。帶寬=(2.5Gbps * 2(雙通道 ) ) /10 = 0.5GB/s。多個Lane再乘Lane個數
PCIe由PCI發展,express為快的含義。PCI采用的並行傳輸,PCIe采用的串行傳輸。
計算機的拓撲結構分為總線拓撲、環形拓撲、樹形拓撲、星型拓撲、網狀拓撲。
PCI采用的是總線拓撲,一條PCI總線掛在多個PCI設備,只有擁有總線使用權,才能發言。如圖5-6.(北橋下的PCI總線,掛載了以太網設備、SCSI設備、南橋等。)
PCIe采用的樹形拓撲,Root Complex(RX)作為根,代替CPU與內存以及PCIe系統中的設備通信。如圖5-8。而Swtich用於擴展鏈路,提供更多端口(Endpoint)來連接。
雖然PCIe采用點對點通信,但不同設備的數據格式可能不同,實際很少這么做。
PCIe定義了三層:數據從上到下都以包(Packet)的形式傳輸。如圖5-12
1. 事務層:創建(發送)或解析(接收)TLP(Transaction Layer Packet)、流量控制、Qos、事務排序等。、
2. 數據鏈路層:創建(發送)或解析(接收)DLLP(Data Link Layer Packet)、Ack/Nak協議(數據鏈路層檢錯和糾錯)、流控、電源管理等。
3. 物理層處理Packet數據物理傳輸,發送端數據分發到各個Lane傳輸(Stripe)。
Data作為上層命令(命令層、NVMe層),為其加上Header以及CRC校驗,形成了TLP。數據鏈路層加上包序列號,以及CRC校驗。最后物理層加上Start和End標號,在Lane上加入干擾碼,經過8/10編碼或128/130編碼,最后通過介質發送到接收方。
因此PCIe相對PCI更有生命,每個EndPoint都需要實現這三層。如果把數據接收和發送(掐頭去尾,檢驗CRC等工作)稱為脫衣和穿衣,那么RC和Swtich都需要做這種操作,傳輸過程可能有多次操作。
PCIe TLP類型:
1. Memory:內存訪問。物理設備可通過內存映射方式映射到主機內存,甚至存在映射到IO空間。但新PCIe設備只支持內存映射。IO映射將逐漸取消。(TLP常見)
2. IO:IO空間
3. Configuration:配置空間。都是主機(RC)發起的,往往只是上電枚舉和配置階段。(很重要,但不是常態)
4. Message:中斷信息、錯誤信息等。(非主流的)
對於請求需要相應,稱為Non-Posted TLP。不需要響應,稱為Posted TLP。只有Memory Write(ACK/NAK很大程度保障了正確)和Message是Posted。
對於拓撲結構中,除了EndPoint還有Switch,作為PCIe設備,但是配置種類不同,因此Configuration 分為Type 0/1.
如圖 5-17。對於PCIe設備C 發起Memory Read。 回到RC進行請求,RC將內存數據發送給設備C。
如圖5-18。對於設備B發起Memory Write。數據到達內存后即可,不需要返回。(對於TLP只能攜帶4KB數據,無論是讀返回,還是寫入,如果超過必須分割。)
PCIe TLP結構:包括Header(必須有:包含目標地址、TLP類型、數據長度)、Data(可選,如讀取數據時就沒有要發送的數據)、ECRC(可選,根據Header和Data生成)。
Header(4DW):1. Fmt(Format,TLP是否有數據,Header是3DW還是4DW)2. Type(TLP類型)3. R(Reserved等於0)4. TC(優先級,數字大優先級高)5. Atrr(屬性)
6. TD(是否包含ECRC),7. EP(有毒數據)8. (AT 地址種類)9. Length (數據長度)。如圖5-20
對於PCIe設備,主機想要訪問,必須映射到內存空間。Header地址為主機內存的映射地址。內存小於4GB用3DW,大於4GB用4DW。對於PCIe設備擁有唯一ID(總線(Bus)、設備、功能)缺點
PCIe配置和地址空間:每個PCIe設備都有一段空間,主機通過它獲得設備的信息。(對於PCI或PCI-X時代就有配置空間:64B的Header和192B的Capability)
進入PCIe時代,192B不足夠使用,因此將配置空間從256B擴展到4KB,前256B保持不變。
由於CPU只能直接訪問內存空間(或IO空間),不能直接操作外設。因此需要RC將內存想要訪問的外設數據,通過TLP讀到內存。
在機器上電時,系統會把PCIe設備開放的空間映射到內存空間,當CPU想要訪問時,只需要訪問對應的內存空間。RC若檢測該空間為PCIe設備空間的映射,則觸發TLP。
如圖5-29,則是Header。Device ID等記錄了設備信息。Base Address(BAR)用於分配映射空間。
而空間的大小屬性都寫在Configuration BAR上。通過讀取BAR,為其分配系統的內存空間和地址空間。(BAR前部分用於存儲內存地址,后部分為設備空間和屬性)
對於每個PCIe設備可能對用多個配置空間(他可能具有多個功能,如硬盤,網卡等)如圖,一條總線可以有多個設備,每個設備有多個功能。
因此,在PCIe系統,根據 Bus+Device+Function可以找到唯一的Function
TLP的路由:基於地址(Memory address),基於設備ID(Bus+Device+Function),隱式。如表5-6.
1. 地址路由:Switch負責轉發路由,路由信息存儲在Configuration。
BAR0和 BAR1與EndPoint一樣,對於上游端口(RC)和下游端口,每個作為Bridge,有一個Configuration,描述了下面設備空間映射的范圍。對於上游端口則是下游所有映射空間范圍。
因此收到TLP時,首先判斷是否是自己的,再判斷是否是下游設備地址范圍,若地址落到這些BAR中,則完成路由轉發,並向下傳遞。否則不接受TLP。
對於向上傳遞時,先判斷收到的是否是自己的,其次判斷是否為下游其他設備,最后只能扔給上游。
2. ID路由:ID=bus+device+function。其中Configuration等則是根據這種方式。對於EndPoint收到這樣TLP,會用其和自己ID進行比較,如果是則收下TLP。
對於Switch會記錄上游Bus(Pri),下游Bus(Sec),下游中最大的Bus(Sub)。對於請求先判斷是否為自己的,不是則判斷是否在Sec~Bus之間,是的話說明在其之間。
3. 隱式路由:對於部分Message與RC通信,不需要聲明ID等。
數據鏈路層:發送端:接收上層傳來的TLP,為其加上Seq(序列號),LCRC。然后轉給物理層。
接收端:接收物理層傳來的TLP,檢測CRC和序列號,若有問題則拒絕接收該TLP,並通知重傳。如果沒問題則去掉序列號和LCRC,並交給事務層,並通知發送端正確接收。
因此,數據鏈路層保障了正確傳輸,使用了握手協議(ACK/NAK)和重傳(Retry),除此之外還包括TLP的流量控制,電源管理等,需要借助DLLP,處於事務層是感知不到的。
如圖5-49,DLLP的作用。
發送端:數據鏈路層生成DLLP,交給物理層。物理層將其加SDP和技術標志(GEN 1/2加END,GEN 3不加),並傳給對方。
接受端:對DLLP掐頭去尾,並進行校驗。
對於DLLP,僅能支持端到端的傳輸,不需要路由信息(誰發出,給誰),因此也只能對於相鄰端口進行(如:RC與Switch上游Port,Swtich上游Port與下游Port,Switch下游Port與連接的設備EP1)。
四大類型DLLP:
1. 確保傳輸完整性:ACK/NAK。
2. 流控相關:DLLP。
3. 電源管理:DLLP。
4. 廠家自定義:DLLP。
所有DLLP大小為6B,加上物理層則是8B,不同類型DLLP,格式不同。
ACK/NAK:發送方會對TLP加上序列號和LCRC后,會把該TLP放到Replay Buffer中。接收端收到TLP后,進行校驗。無誤,則返回ACK給發送端,發送端清除在Replay Buffer相關的TLP
否則返回NAK DLLP,發送方知道出錯,重傳Replay Buffer相關的TLP。只有正確的TLP才會交個事務層。
對於發送方發送了10,11,12,13.(目前都在Replay Buffer中),接收到上一個成功接收TLP序號為11,期望下一個是12.
(1)CRC校驗:如果失敗,會發送一個NAK,其中ACKNAKSEQ設置為11(代表11之前都成功了)。發送端移除Buffer中1之前的,並知道12和之后需要重發。成功則直接下一步。
(2)檢查序列號:如果收到12,與預期相符,可以返回ACK,也可以不返回(不返回可以減少DLLP的傳輸,可以等若干個之后返回一個ACK)
如果收到13,說明12丟失了,發送NAK,其中ACKNAKSEQ設置11。發送端移除Buffer中1之前的,並知道12和之后需要重發。
如果收到10,說明發送端長期沒收到ACK,自動重發了。可以發送ACK,其中ACKNAKSEQ設置11。
TLP流控:由於接收端處理TLP速度可能趕不上發送速度,因此需要告訴發送端我有多少空間,發送端根據情況判斷發送數據還是Hold住,直到空間足夠。
僅針對TLP,DLLP不需要流控(才6B)。
電源管理:看第八章....。
物理層:由電器模塊(串行總線傳輸+差分信號(兩條線的差值作0/1,防干擾能力強,如果兩條線都受干擾,差值幾乎不變))和邏輯模塊組成。
邏輯模塊:物理層對於TLP/DLLP放到Buffer,並加上頭,尾,以及符號邊界,用以區分TLP和DLLP。對於多個Lane,會將TLP/DLLP分派到每個Lane獨立傳輸。並加上串擾(隨機數,減少干擾)
並用8/10編碼(GEN3是128/130),讓0和1的個數相當。嵌入時鍾信息。最后並串轉換發送到串行總線。
PCIe Rest:總線規定了兩個復位方式:Conventional Rest和Function Level Reset(FLR)。
其中Conventional Reset又進一步分為Fundamental Reset和Non-Fundamental Reset。其中Fundamental Reset分為Cold Reset和Warm Reset。而Non-Fundamental則為Host Reset。
Fundamental Reset:由硬件控制,重啟整個設備。對於Cold:Pwer Off/On Device的VCC。Warm:保持VCC下由系統觸發,比如修改電源管理。
FLR:對於PCIe link上的各種Function,如果某個Function出問題,將整個Link都Reset不太必要,因此可以直接讓該Function Reset。
PCIe MAX Payload Size和MAX Read Request:都在設備控制寄存器中。
MPS:控制一個TLP最大傳輸 大小,接受放方需要能處理MPS大小的數據包,發送方不能超過MPS。
PCIe協議允許最大為4KB,但是若有低MSP的,只能采用低MPS的大小。MPS設定不能超過任意設備的MPS處理能力。
MPS設置是在枚舉配置階段完成。
Max Read Requeset Size:用於控制Memory Reade的最大Size。最大4KB,可以超過MPS,但需要返回成多個小於MPS的Cpld。
PCIe的熱插拔:
早期PCIe SSD以閃存卡被廣泛使用,閃存卡的缺點:PCIe插槽有限。通過插槽供電單卡容量受限制。容易導致散熱不均出現宕機。不能熱插拔,必須停止服務,打開機箱,拔出閃存卡。
因此推出了U.2:支持熱插拔。對於U.2組成的陣列,通過面板知識燈判斷哪個SSD故障,可以直接更換。
對於熱插拔的PCIe SSD需要幾方面支持:1硬件支持,防止電流波峰導致硬件損壞,並能檢測拔盤操作,防止數據丟失。操作系統,確定熱插拔為操作系統還是BIOS處理。PCIe SSD驅動。
基本流程:
1. 配置應用程序,停止所有對目標SSD的訪問。
2. umount目標SSD上所有文件系統。
3. 卸載SSD,刪除注冊的塊設備和disk。
4. 拔出SSD。
鏈路層性能損壞:
1. Encode和Decode:如8/10編碼,保障0/1數量相近。帶來了20%性能損耗。對於GEN3已經采用了128/130,性能損耗幾乎可以忽略。
2. TLP Packet Overhead:TLP有效數據為Data,外層帶來了大約20~30B的額外開銷。
3. Traffic Overhead:進行時鍾偏差補償,定期發送Skip。Gen1/Gen2的Skip是4B,Gen3是16B。Gen2采用1538個symbol time(一個Byte發送的試卷)發送,只能在兩個TLP間發送。
4. Link Protocol Overhead:對於TLP要發送DLLP,造成了性能損耗。
5. Flow control:對於流量控制,顯然會占用帶寬。
6. System Parameters:MPS,Max Read Request Size,Read Completion Boundary(RCB)。其中RCB是因為允許多個CqID回復一個Read Request,因此需要在Memory進行對齊。
第六章 NVMe
HDD和早期SSD大多數使用SATA接口,跑AHCI。AHCI支持NCQ和熱插拔技術。NCQ最大深度32,即主機可以發送32條命令給HDD和SSD。
隨着閃存速度越來越快,性能已經轉移到接口上。因此出現了NVMe,運行在PCIe上的協議標准。
NVMe相對AHCI的優勢:
1. 低時延:影響硬盤存儲時延的三大因素為 存儲介質本身,控制器,軟件接口標准。
存儲介質采用閃存速度相對機械硬盤飛快。
控制器采用PCIe,主控與CPU相連,不需要南橋再連接CPU。
軟件協議NVMe縮短了CPU到SSD的指令路徑,減少了寄存器訪問次數。使用MSI-X中斷管理。並行多線程優化,減少了鎖同步操作。
2. 高性能:IOPS=隊列深度/IO延遲,故隊列深度與IOPS有較大關系(但不成正比,隨着深度增加,IO延遲也會提升)。AHCI最多隊列深度32,但PCIe通常到128甚至256才能發揮極限。
NVMe下,深度可達64K,隊列數量也從AHCI的1提高到64K。
3. 低功耗:看第八章。
NVMe作為主機與SSD的協議,在PCIe事務層協議之上。
NVMe作為命令稱和應用層協議,理論上可以適配任何接口協議,但原配是PCIe。
SATA速度不超過600MB/s甚至560MB/s。
跟ATA命令規范相比,NVMe命令數少了很多。(SATA時代,只有HDD用的命令也需要兼容實現,但沒必要的)。
NVMe的三寶:Submission Queue(SQ), Completion Queue(CQ), Doorbell Register(DB)。
如圖6-9,其中SQ和CQ位於主機內存。DB位於SSD控制器。
主機發送給SSD的命令存儲在SQ中,SSD將命令執行成功或失敗的狀態存到CQ中。因為發送的命令在主機SQ中,因此還需要寫向SSD的DB用於通知。
如圖6-10。1. 主機寫命令到SQ。2. 主機寫DB通知SSD。3. SSD控制器取指。4. 控制器執行指令。5. 寫入CQ。6. 產生中斷通知主機。7. 主機處理CQ。8. 處理CQ的結果,通過DB通知SSD。
SQ、 CQ、DB:對於SQ與CQ可以是一對一,也可以是多對一。但有SQ必然有CQ。
SQ與CQ,一種為Admin,一種為IO。Admin用於主機管理SSD。IO用於放IO命令,傳輸數據,由Admin創建。並且不能交叉使用。
如圖6-11。Admin只有一對SQ/CQ。IO的卻可以很多。(64K-1即65535對)。(對於NVMe over Fabrics,SQ和CQ只能一對一,並且IO SQ/CQ不是Admin創建。)
主機每個CPU核可以有一個或多個SQ(用於不同線程,甚至存在優先級),只有一個CQ。
隊列深度:Admin中2~4K。IO中2~64K。其中SQ中命令大小為64B,CQ中狀態大小是16B。
對於SQ/CQ,都作為環形隊列,因此包含頭和尾。DB則是用來記錄SQ/CQ的頭和尾,每個SQ或者CQ都有兩個對應的Head DB和Tail DB。DB存在SSD端的寄存器,記錄位置。
對於SQ,主機為生產着,向尾部寫入,SSD從頭部取出指令。CQ來說,SSD是生產者,主機是消費者。
如:
1. 開始SQ和CQ都為空,Head=Tail=0。
2. 主機向SQ寫入3條命令,SQ的tail變成3。通知SSD寄存器端的SQ Tail,值為3.(用於告知有新命令)
3. SSD將SQ中的3條命令取回,並將SQ的Head更新為3。寫入本地SQ Head寄存器。
4. SSD執行完兩條命令,將完成信息寫入CQ,並更新CQ的Tail,值為2.通知主機。
5.收到通知(中斷),取出兩條信息。告知SSD的CQ Head寄存器值為2。
因此 DB記錄了Head和Tail。對於SQ,SSD只知道頭在哪,尾巴在哪需要主機插入數據后並更新。對於CQ,SSD知道尾巴在哪,並告知主機。
對於主機只會寫入SQ Tail DB和CQ Head DB。如何知道其他的。因此,在SSD寫入CQ的狀態中會包含SQ Head DB信息。對於CQ Tail DB信息,則是通過每個狀態一個P位,對於執行完置0,未執行是1。CQ在主機中,因此挨個判斷一次即可。
尋址:PRP和SGL
對於主機向SSD寫入數據,需要告訴數據在內存中地址,即LBA。對於讀取,需要根據LBA查找閃存的物理塊,獲得數據。
因此無論讀寫,都需要內存地址。對於尋址方式一種為PRP(Physical Region Page,物理區域頁),一種SGL(Scatter/Gather List,分散/聚集列表)
RPR:將內存划分為物理頁(大小可以是4KB~128MB)。如圖6-22 PRP Entry則是64位內存物理地址,包含頁起始地址和頁內偏移。最后兩bit表示只能4字節對齊。
對於若干PRP Entry連接,構成了PRP鏈表。其中每個PRP必須是物理頁。即偏移為0,而且鏈表中不能有相同物理頁。
NVMe命令中兩個域:PRP1、PRP2代表數據所在位置和數據寫入位置。PRP1和PRP2可能是鏈表,也可能是數據。(如同C指針)
對於Admin來說只能用PRP來告訴SSD內存物理地址。對於IO命令除了PRP還可以用SGL。
SGL:SGL優勢在於,可以存儲任意大小的數據,不需要以物理頁為單位。
SGL作為數據結構,由鏈表構成,每個節點作為一個SGL段(Segment)組成,而每個SGL段又包含一個或多個SGL 描述符(Descriptor)。
SGL描述符作為最基本單位,描述了連續的物理內存空間:起始地址+大小。每個描述符16字節。分4種類型。
1. 數據塊。 2. 段描述符,作為鏈表記錄下一個SGL段所在位置。3. 末段描述符,用於鏈表倒數第二個段。 4. SGL位桶,由於跳過不需要讀的數據。
如圖6-27,主機需要讀取13KB(真正需要11KB),存放到3個不同內存地址,3KB,4KB,4KB。
第一個SGL段(本數據位置,下一個SGL段)。第二個SGL段(本數據位置,下一個SGL段(並設置了作為末尾段描述符),SGL桶記錄了跳過2KB)。第三個SGL段(數據位置)。
分析Trace:(...............TODO................)
對於一條讀命令如圖6-31。
1.(第1行) 主機需要從LBA 0x20E0448(SLBA)位置讀取128個DWORD的數據。讀到PRP1的地址。命令放在編號為3的SQ里(SQID=3)。CQ編號也為3(CQID=3)。
2. (2~3行)主機寫SQ的Tail DB通知SSD取命令。而由於所有EndPoint都會映射到內存中,因此Tail DB寄存器也被映射到內存中,只需要寫入映射地址就可以准確寫到寄存器地址。
3. (4~7行)SSD收到通知,去主機的SQ取指。可以看到,讀取了16DWORD
4. (8~12行)SSD執行讀命令,把數據從閃存讀到緩存,傳給主機。
5. (13~14行)SSD向主機CQ寫返回狀態。
6. (15~16行)SSD采用中斷的方式告訴主機處理CQ。
NVMe端到端的數據保護:(主機端到SSD的閃存空間)
對於主機與SSD的最小單元邏輯塊(LB)是512B~4096B,在主機格式化SSD時就確定了。
為了確保數據正確的,采用了元數據來保障數據。元數據的存在方式一般分為:元數據和邏輯塊數據在一起傳輸,或元數據和邏輯塊數據分開傳輸。NVMe只支持前者。
元數據包括:Guard(16bit的CRC),Application Tag(控制器不可見,主機使用),Reference Tag(用戶數據和地址(LBA)相關聯)
在傳輸過程,可以讓數據都帶上元數據,也可以選擇不帶,甚至部分傳輸地帶不帶。(對於不重要數據可以選擇不帶,減少帶寬的浪費)
副作用在於:每個塊需要8字節的保護信息,數據塊越小,帶寬影響越大。SSD控制器需要做數據校驗,影響性能。
Namespace(NS):對於閃存空間划分成N個LBA,成為一個NS。對於SATA SSD一個閃存空間只能有一個NS。但NVMe SSD一個閃存空間可以存着多個NS。每個NS有唯一的名字和ID。
如圖6-51,每個NS在主機看來就是一個獨立的磁盤。
SR-IOV:允許虛擬機之間共享PCIe設備。並且在硬件實現。單個IO(SSD)資源可以被多個虛擬機共享。如圖6-52.
除了多個NS,甚至可以有多個SSD控制器(不是一個SSD控制器有多個CPU,而是有多少實現NVMe功能的控制器)
如圖6-53。NVMe包含兩個控制器,內存划分為3份。NS A由控制器0獨享,NS C由控制器1獨享,NS B由兩個控制器共享。
除了NS,控制器可以多個,PCIe端口也可以多個。連接相同主機或不同主機。
如Z-Drive 6000采用了雙PCIe端口,可以連接獨立主機,如果一個數據通道出現故障,OCZ的主機熱交換技術可以讓另一個主機無縫低延遲接管任務。如金融,OLTP,OLAP等需要實時性非常高。
NVMe over Fabrics:
NVMe針對新型Non-Volatile Memory(如:閃存,3D XPoint等)而設計。用於低延遲(10us以內),對於全閃存陣列若還采用ISCSI(時延最低100us)無法充分發揮性能。
NVMe over Fabrics定義了各種通用的事務層協議:RDMA,Fibre Channel,PCIe Fabrics等。
目前的互聯方式分為:內存(Memory),消息(Message),消息內存混合(Memory&Message)。如圖6-62.
RMDA:通過網絡將數據直接傳輸到計算機的存儲區域。如圖6-63
1. 提供了低延遲,低抖動,低CPU使用率。
2. 最大限度利用了硬件,避免軟件棧的開銷。
3. 定義了豐富的可異步訪問的接口。
但由於網絡的傳輸模式和本地PCIe有大量差異,因此綜合了RDMA,FC等特點,提出了NVMe over Fabrics。解決幾個問題:
1. 提供不同互聯透明的消息和數據的封裝格式。
2. 將NVMe操作所需的接口映射到互聯網絡。
3. 解決節點發現,多路徑互聯的問題。
如圖6-66,作為一次IO傳輸過程。
1. 發送端驅動程序封裝請求派發給硬件
2. 發送端硬件將請求發送給目標的發送隊列
3. 目標端控制器處理IO請求,並准備完成請求派發給硬件。
4. 目標端硬件將完成請求發送給發送端。‘
由於發送請求和完成請求可以帶數據,降低了交互時間。
第七章 SSD測試
1. FIO:強大的性能測試工具。
線程:多少個讀寫任務並行執行,一般來說,一個CPU一個核心同一時間只能運行一個線程,除非使用時間切片划分給多個線程。
Linux采用Jiffes代表一秒划分了多少時間片,1000則是1毫秒,100則是10毫秒。
同步模式:一般來說主機發送一個命令到SSD僅需幾微秒,但SSD處理需要幾百微妙,若主機發送一個命令,線程就休眠等待,則稱為同步模式。
但SSD有很多並行單元,若采用同步模式,簡直是暴殄天物。
異步模式:為了提高並行性,一般采取異步模式。線程發送命令后繼續往下執行,SSD完成后通過中斷或輪詢方式告訴CPU,這時CPU再用回調函數來處理結果。
隊列深度:但是如果不斷發送命令,可能SSD也撐不住,因此采用隊列深度,限制最多有多少命令,一般64的隊列,如果隊列滿了就不能再發,等處理完有空位再繼續發送。
Offset:設置offset可以從某個偏移開始測試,比如offset=4G的偏移地址。
DIrect IO:對於內核維護了緩存,數據一般先寫到緩存在寫到SSD。讀也是先讀緩存,但機器一旦掉電就丟數據了,因此采用Direct IO,直接讀寫SSD。
BIO:Linux讀寫SSD設備使用的是BIO(Block-IO),包含了LBA,數據大小和內存地址等。
fio初體驗:fio -rw=randwrite -ioengine=libaio -direct=1 –thread–numjobs=1 -iodepth=64 -filename=/dev/sdb4 -size=10G -name=job1 -offset=0MB
fio:軟件名
rw:讀寫模式,randwrite是隨機寫,除此還有順序讀,順序寫等。
ioengine:libaio則是異步,同步是sync
direct:是否使用Direct IO
thread:使用phread-create創建線程,另一種是fork
numjobs:每個job一個線程,每個-name指定的任務就會開啟這么多線程,因此線程數=任務數*numjobs。
iodepth:隊列深度
filename:數據位置,可以是塊設備,文件名,分區,SSD設備。
size:每個線程寫入數據量
name:任務的名字
offset:從某個偏移地址開始寫
bs:每個BIO包含的數據大小。
output:日志輸出
FIO會為每個Job打出統計信息,可以看到帶寬,IOPS等。
延遲:slat是發出命令的時間,包含最短,最長,平均,標准差。clat是命令執行時間。
FIO可以設置verify來做數據校驗。
2. AS SSD Benchmark
SSD專用測試軟件,用來測試連續讀寫,4K對齊等,並給出綜合評分。
除了測試性能,還可以檢測固件算法,是否打開AHCI模式,是否4K對齊等。
3. ATTO Disk Benchmark
作為簡單易用的磁盤傳輸速率檢測軟件,用來檢測硬盤,U盤,存儲卡等速率。
4. CrystalDiskMark
用來測試硬盤或存儲設備的小巧工具,默認運行5次,取最好成績。
5. PCMark Vantage
衡量PC的綜合性能。
1. 處理器測試:數據加密解密,壓縮,解壓等。
2. 圖形測試:高清視頻播放,游戲測試等。
3. 硬盤測試:使用游戲,圖片等導入。
6. IOMeter
單機或集群IO子系統的測量和描述工具。
---------- TODO 測試儀器---------------
回歸測試
保障新的代碼不會影響舊功能。
-----------TODO PCIe,WA,耐久度測試,認證測試(哪天可以去認證都說了.....)----------------
第八章 電源管理
SATA電源管理可以讓SATA鏈路的PHY進入低功耗模式,與硬盤,SSD,CPU等其他部分的電源管理是獨立。
SATA提供了兩種低功耗模式
1. Partial:PHY處於低功耗模式,讓部分物理層(PHY)進入休眠模式,能夠在10us內被喚醒。在不太影響傳輸性能的情況下忙里偷閑。
2. Slumber:PHY處於更低功耗,可以關閉更多電路,恢復時間大約10ms。
Partial/Slumber可以讓功耗從Active的1000mW降低到100mW。
對於鏈路的電源管理,主機和設備都可以發起:HIPM(Host Initiated Power Management),DIPM(Device Initiated Power Management)。
對於主機發起PMREQ_P/PMREQ_S,設備同意則進入Partial/Slumber,否則拉倒。若想退出Partial/Slumber則通過OOB重新建立。
Listen Mode(監聽模式):支持用端口監聽新接入的盤,功耗只是Slumber。
Auto Partial to Slumber:讓鏈路不需回到Active,直接從Partial進入Slumber。
SATA超級省電模式
DevSlp:在Partial/Slumber下,盤必須保持工作模式,以便於把自己喚醒,SATA總線的發送模塊和接收模塊也需要保持工作狀態,因此省電效果不好。
DevSlp則將傳輸電路完全關掉,專門加入一個低速管腳來喚醒。DevSlp的功耗降到5mW,喚醒時間變成20ms。
SATA終極省電模式
RTD3:DevSlp時Vcc還在,因此還有功耗。因此主機想在長期Idle后把Power完全關掉。
通常是主機處於S0,SSD進入D3 Cold狀態,因此就是Runtime D3,簡稱RTD3
ACPI規定的Device Power State:(對於設備如SSD的規定)
1. D0:設備處於工作狀態,所有功能可用,功耗最高,所有設備都支持。
2. D0 active:設備完成配置,隨時准備工作。
3. D1和D2:介於D0和D3之間,D1比D2消耗更多電,能保存更多的設備上下文。D1和D2是可選的,很多設備不支持。
4. D3 Hot:設備進入D3,Vcc還在,設備可以被枚舉。
5. D3 Cold:設備完全切斷電源,重新上電需要初始化設備。
系統電源狀態:(主機的規定)
1. S0:工作模式,操作系統可以管理SATA SSD的電源狀態(D0或D3都可以)。
2. S1:低喚醒模式,系統上下文不會丟失。
3. S2:與S1相似,但處理器和系統的Cache上下文會丟失。
4. S3:睡眠模式(Sleep),CPU不運行命令,SATA SSD斷電,除了內存之外所有上下文丟失,硬件會保存一部分處理器和L2 Cache配置上下文。
5 S4:休眠模式(Hibernate),CPU不運行命令,SATA SSD斷電,內存寫入SSD,系統上下文丟失,操作系統負責保存與恢復。
6. S5:Soft off state,類似S4,但操作系統不會保存和恢復系統上下文,消耗很少電,可通過鼠標等設備喚醒。
PCIe省電模式:ASPM
ASPM讓PCIe在某種情況下,能給從工作狀態(D0)通過把自身PCIe鏈路切換到·低功耗模式,並通知對方也這么干,從而達到整條鏈路低功耗的目的。
ASPM的低功耗模式有兩種,L0s和L1。如圖8-9
1. L0:正常工作狀態。
2. L0s:低功耗模式,恢復時間短。
3. L1:更低功耗模式,恢復時間長。
4. L2/L3Ready:斷電前的過渡狀態。
5. L2:鏈路處於輔助供電模式,極省電。
6. L3:鏈路完全沒電,功耗為0.
7. Ln:剛上電,還未完成前鏈路所處狀態。
其中鏈路寄存器中可以進行設置L0s/L1 或讀取當前狀態
PCIe其他省電模式:
處於L2下,所有時鍾和電源全部關閉,省電效果很好,但是恢復時間達到毫秒級。
因此需要處於L1和L2之間的模式:L1.1和L1.2。區別在於Common Mode Voltage是否打開。
-----------------TODO NVMe電源控制----------------
第九章 ECC原理
對於實際通信中,information bits表示有效信息長度,channel use表示實際傳輸長度。
Code rate=(information bits) / (channel use)
對於三副本則是1/3.Code rate越小 冗余越大。 Shannel揭示了,每個傳輸通道都有C,若 Code rate < C,則理論錯誤率可以趨近0.
一個完整的通信系統模型:信息由信息源產生,發送器發出信號,經過包含噪音的信道,到達接收器,再發往目的地。如圖9-1.
二進制編碼的系統,兩種常見Channel模型:
1. BSC(Binary Symmetric Channel,二進制對稱信道):如果出錯,收到的0可能是1.收到1也可能是0
2. BEC(Binary Erasure Channel,二進制擦除信道):可能會丟失bit,但是收到的0肯定是0,收到1肯定是1。但傳輸出錯可能導致接受者收不到信息。
在BSC中0,1組成的二進制信號,0,1各有p概率翻轉。在BEC中,信號可能變成無法識別,但是不會翻轉。
對於SSD來說,一般采用BSC模式,因為容易翻轉。為了使得信息准確到達,采用編碼。如圖9-4.將ke位編碼成n位,傳入信道。
糾錯編碼:目的讓編碼后和編碼前有足夠大的區別。
編碼距離:對於0/1串來說就是不同的位數。
對於00,01,10,11若采用重復編碼
00變為00000000
01變為01010101
10變為10101010
11變為11111111
對於接收到信號00010000,發現編碼距離最近的是00000000,距離是1。
CR=H(y)={0, 1}。y為信號,H為特定的處理,CR為結果,其中0是通過,1是失敗。
奇偶校驗:計算二進制中1的個數,作為一個位校驗位,即SPC(single bit parity check code)當存在奇數個翻轉,就會查出錯誤,但不會糾錯。
校驗矩陣H和生成矩陣G:由於SPC只對奇數個翻轉檢測,因此可以設立多個條件,建立方程組。
對於長度n位,其中r位校驗碼,n-r位有效位。
對於線性分組編碼,原始信號u,可以通過線性變化生成糾錯碼c,其中G是生成矩陣,c=uG。(c為n bit信號,u為k bit信號, G為k * n矩陣,H可以推導G的生成)
LDPC:低密度奇偶校驗碼。其中1的分布很稀疏。
又分為正則和非正則,其中正則保證每行有固定J個1,每列有固定K個1。如圖,為正則矩陣H,右側為校驗方程。
Tanner圖:用於直觀表示矩陣。一種節點為b節點(bit node),一種為c節點(check node)。如果bi參與了cj方程的校驗則將其連線。如圖9-6.
低於LDPC解碼:分為硬判決和軟判決。
Bit-flipping算法:作為硬判決的經典算法。
對於一個信號參與的大量校驗方程失敗,說明該bit大概率出現錯誤。
Bit-flipping 解碼方式:對於n位信號y(y1, y2....yn),矩陣H。畫出Tanner圖,n個b節點,r個c節點。
1. 每個b節點向連接自己的c節點發送自己bit。第一次為yi。
2. 每個c節點對於受到的所有b節點信息,進行校驗。
2.1 如果成功,則將b節點消息發送回去。
2.2 如果失敗,則將b節點消息取反發送回去。
3. 每個b節點和多個c節點連接,可能受到0或者1,因此采用少數服從多數的投票方式保存自己的bit。
4. 如果本次所有校驗方程都滿足(即第2步都成功)或迭代次數超過上限,則停止。否則跳到第一步。
對於Bit-flipping有很多細節值得討論:如b節點更新,一次更新一個還是多個,若采用多個可能無法收斂,若采取一個,速度太慢。折中辦法是先更新多個,數量少后更新單個bit。
和積信息傳播算法:作為軟判決的經典算法。
算法的基礎為概率論。
條件概率P(A|B):在B事件發生的條件下,A發生的概率。
P(B|A) = P(A, B)/P(A)。其中P(A)是A發生的概率,P(B)是B發生的概率。
P(A, B)是A和B共同發生的概率。
貝葉斯公式:P(B|A) = P(A|B) * P(B) / P(A)
邊緣概率:從多元隨機變量中的概率分部得出只包含部分變量的概率分布。
P(A) = ∑B ∑C ∑D f(A, B, C, D) (就是說A發生的概率 = B,C,D在任何情況下A發生的概率之和)
P(A | B=1) = ∑C ∑D f(A, B=1, C, D) (就是說B=1的條件下A發生的概率 = B為1的條件下,C,D在任何情況下A發生的概率之和)
貝葉斯網絡:是一種推理性圖模型。
例如:x, y, z, w代表隨機事件,w為是否吸煙的概率,x是職業是煤礦相關的概率,y是是否為咽炎的概率,z是是否為肺部腫瘤的概率。如圖9-12
其中關系P(x, y, z, w) = P(w) * P(x) * P(y | w) * P (z | w, x )。
其中P(y|w=1)代表吸煙得咽炎的概率,P(z |w ,z)則代表 是否吸煙以及是否在煤礦工作得肺部腫瘤的概率。
因子圖:無向的概率分部二部圖。因子則為事務內部約束所表現的邏輯形式。
如下圖所示的聯合概率,其因子圖如圖9-13.
----------------------------------TODO 講了一堆公式最終成功完成了計算-----------------------------------------------------
LDPC編碼來說,要先確定H矩陣,才能確定G矩陣。
H矩陣的注意:
1. 保持稀疏,每行每列1的個數固定或者接近固定。
2. 考慮生成矩陣的計算復雜度。
3. 減少小環的個數。如圖9-25,其中一個出錯,很難判斷是哪個錯誤了。
LDPC在SSD中的糾錯流程,如圖9-29.