文章目錄
- 1. What is SGL?
- 2. sgl內存傳輸的原理
- 2.1 核心思想
- 2.2 sgl數據結構
- 2.3 摘鏈和掛鏈
- 3. 零拷貝技術
- 3.1 問題背景
- 3.2 零拷貝的核心思想及實現方式
- 4. sgl在存儲行業的應用
1. What is SGL?
sgl(Scatter-Gather List)內存傳輸技術,是一種高效管理非連續內存數據傳輸的方法。
核心思想:通過一個鏈表或數組描述多個分散的內存塊,使得硬件可以一次性完成對這些非連續內存區域的讀寫操作,無需CPU介入數據拷貝。
2. sgl內存傳輸的原理
2.1 核心思想
主要聚焦在分散、聚集、零拷貝上:
- 分散-聚集 Scatter-Gather
- 分散:將數據從一塊連續緩存區拆分為多個塊,寫入多個非連續的內存區域;
- 聚集:從多個非連續的內存區域讀取數據,合并為一塊連續的流。
- 零拷貝 zero-copy
- 零拷貝是避免數據在內存中的多次拷貝(如用戶態和內核態之間、內核與設備之間),直接通過內存地址描述符完成傳輸。
2.2 sgl數據結構
以sgl鏈表為例,每個條目(Entery)包含的內容:
- 內存塊的物理地址
- 內存塊的長度
- 指向下一個節點的指針
整體結構:通常以鏈表或數組的形式組織多個條目,比如:
sgl entry1 : 地址0x1000,長度512B,指向entry2的指針
sgl entry2 : 地址0x2000,長度1024B,指向entry3的指針
sgl entry3 : 地址0x3000,長度256B,NULL
2.3 摘鏈和掛鏈
摘鏈是從SGL鏈表中移除一個或多個節點的操作,通常用于以下場景:
- 傳輸完成:當某個節點對應的內存數據傳輸完成后,釋放該節點資源;
- 錯誤處理:傳輸過程中發生錯誤,需要中斷并清理部分已經處理的節點;
- 動態調整:根據傳輸進度動態縮減SGL鏈表的規模
掛鏈是將新的節點添加到SGL鏈表中的操作,通常用于以下場景:
- 動態擴展傳輸:傳輸過程中需要追加新的內存塊;
- 預構建SGL:初始化時逐步添加多個內存塊節點;
- 錯誤恢復:重傳時需要重新掛載節點
掛鏈和摘鏈也伴隨著加減計數:
- 加計數:新增SGL條目、或擴展傳輸范圍時,進行加計數;
- 減計數:完成條目傳輸、釋放資源時,進行減計數。用于標記已經傳輸的數據塊,釋放內存或復用緩沖區,避免資源泄露
3. 零拷貝技術
零拷貝zero-copy技術,是一種優化數據傳輸效率的方法,旨在消除或減少數據在內存中的冗余拷貝操作,從而降低CPU開銷、節省內存帶寬并減少延遲。該技術廣泛應用于網絡通信、文件傳輸、存儲系統和高性能計算等領域。
3.1 問題背景
傳統數據傳輸存在的問題:
例如從文件讀取數據并通過網絡發送:
- 文件數據從磁盤讀取到內核緩沖區(page cache);
- 數據從內核緩沖區拷貝到用戶態緩存區(應用層內存);
- 數據從用戶態緩沖區再拷貝到內核的網絡緩沖區(socket buffer);
- 最后通過網卡發送數據。
該方式存在的問題:
- 多次數據拷貝:數據在內核態和用戶態之間來回復制;
- cpu開銷高:cpu需要參與數據搬運,占用大量計算資源;
- 內存帶寬浪費:冗余拷貝消耗內存帶寬,影響系統整體性能。
3.2 零拷貝的核心思想及實現方式
零拷貝技術,通過繞過用戶態,直接在內核態或硬件設備間傳輸數據,減少甚至消除數據拷貝次數。
零拷貝的實現方式,大概有:
- 內存映射 Memory Mapping,mmap
- 原理:將文件直接映射到用戶態進程的虛擬內存空間,進程通過指針直接讀寫文件,無需通過
read()/write()
系統調用 - 實現流程:調用
mmap()
將文件映射到用戶空間;進程直接操作映射的內存區域,修改會自動同步到文件。
- 原理:將文件直接映射到用戶態進程的虛擬內存空間,進程通過指針直接讀寫文件,無需通過
- sendfile()系統調用
- 原理:直接在兩個文件描述符(如文件到socket)之間傳輸數據,全程在內核態完成
- 實現流程(以Linux為例):調用
sendfile()
;數據從文件的page cache直接拷貝到socket緩沖區;網卡通過DMA從socket緩沖區讀取數據發送
- 硬件輔助的零拷貝
- 原理:結合DMA控制器和SGL,設備直接訪問多個非連續內存塊,無需CPU拷貝
- 實現流程:構建SGL描述數據的內存地址和長度;網卡或磁盤控制器通過DMA按SGL直接讀寫內存
4. sgl在存儲行業的應用
以分布式存儲與對象存儲為例,對象存儲系統需要將大對象拆分為多個分片存儲在不同節點:將對象分片的存儲節點地址和偏移量寫入sgl,客戶端或服務端通過sgl并發讀寫多個分片。
再例如,文件數據在內存中可能分散在多個page cache頁(例如大文件被拆分為多個4KB頁):文件系統將文件的page cache頁地址構建為sgl,存儲設備通過sgl直接讀取這些頁,無需合并到連續內存。
sgl內存傳輸技術通過消除數據拷貝、直接操作非連續內存塊,成為存儲行業高性能I/O的核心技術