<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在Arm平臺上進行SPDK NVMe over TCP優化呢?

Arm社區 ? 來源:Arm社區 ? 2024-04-01 09:53 ? 次閱讀

什么是 SPDK?

隨著存儲介質在 I/O 性能方面不斷演進,存儲軟件占用的總事務時間百分比變得越來越大。提高存儲軟件棧的性能和效率至關重要。存儲性能開發套件 (SPDK) 是一個開源軟件框架,它提供了一組庫和工具,用于根據特定需求編寫高性能、可擴展的用戶模式存儲應用。SPDK 全面釋放現代存儲硬件的潛力,例如非易失性存儲器 (NVM) 設備、固態硬盤 (SSD) 和網絡存儲設備。

SPDK?的工作原理是什么?

傳統的內核 I/O 棧由于上下文切換、數據復制、中斷和資源同步等原因帶來了開銷。SPDK?大幅減少了 I/O 處理期間的開銷,其方法如下:

使用存儲應用的用戶模式,而非內核模式。設備綁定 UIO 或 VFIO 驅動程序后,SPDK 運行用戶空間中的設備,從而消除了成本高昂的上下文切換。應用利用?SPDK 庫,直接通過用戶空間驅動程序與設備通信。

以輪詢模式而不是中斷模式運行。在初始化期間,SPDK 會在每個核心上創建一個線程,稱為 ?Reactor(圖 1)。用戶在此 Reactor 上注冊輪詢器來輪詢硬件是否完成,而不是等待中斷。這樣就降低了中斷處理開銷和延遲。

使用無共享線程模型。每個 SPDK 線程都獨立運行自己的一組數據結構和資源,從而避免了同步開銷。每個 Reactor 上會創建一個事件環,以進行必要的線程通信。

be747c1a-edb2-11ee-a297-92fbcf53809c.png

圖 1:SPDK 線程模型

SPDK 框架

如圖 2 所示,SPDK 包含多層。

be9214b4-edb2-11ee-a297-92fbcf53809c.png

圖 2:SPDK 架構

硬件驅動程序:快速非易失性存儲器 (NVMe) 驅動程序是 SPDK 的基礎組件。這是一個 C 庫,用于與 NVMe 設備之間進行直接零拷貝數據傳輸。virtio 驅動程序允許與 virtio 設備進行通信。

塊存儲:SPDK 提供豐富的后端存儲設備支持,包括以 NVMe SSD、Linux 異步 I/O (AIO) 作為支持的 NVMe 塊設備,以便讓 SPDK 能夠與 HDD?和?ceph RBD 等內核設備交互,從而將 ceph 作為 SPDK 的后端設備。

塊存儲服務:SPDK 塊存儲服務層為附加客戶功能提供靈活的 API,這些功能包括?RAID?和塊層壓縮。

塊存儲協議:塊存儲協議使得 SPDK 能夠通過不同的傳輸協議將其后端存儲提供給遠程客戶端、虛擬機或其他進程。iSCSI target 是在 TCP/IP 連接上實現了傳輸塊級 SCSI 數據的既定規范。NVMe over Fabrics (NVMe-oF) target 是 NVMe-oF 規范在用戶空間的一個實現,即在網絡上呈現一個快設備。Vhost target 使得 SPDK 能夠為基于 Qemu 的虛擬機或 Kata 容器提供后端存儲。Vfio-user 允許 SPDK 將虛擬的 NVMe 設備提供給虛擬機,后者利用現有的 NVMe 驅動程序與設備進行通信。

文件存儲服務:SPDK 在其塊分配器 Blobstore 上還提供了一個名為 BlobFS 的文件系統。它可作為?MySQL?和?Rocksdb?的存儲后端,從而使整個 I/O 路徑都位于用戶空間中。

什么是 NVMe over TCP?

NVMe 是一種專為 SSD 而設計的協議,旨在通過 PCIe 接口來顯著提高性能。NVMe over PCIe 是 NVMe 協議的初期目標,用于本地 NVMe SSD 訪問。它通過 PCIe 接口協議將命令和響應映射到主機的共享內存,以此來傳輸數據。

NVMe-oF 支持通過網絡來遠程共享和訪問 NVMe 存儲設備,例如以太網或光纖通道。NVMe-oF 是?NVMe over PCIe 的擴展。NVMe-oF 利用基于消息的模型或組合模型在主機與目標存儲設備之間通信。所支持的傳輸協議包括光纖通道 (Fibre Channel)、RDMA (Infiniband、ROCE、iWARP) 和 TCP(圖 3)。

bef7a6f8-edb2-11ee-a297-92fbcf53809c.png

圖 3:NVMe over Fabrics 模型

SPDK 支持 RDMA、TCP 和光纖通道傳輸。它由 initiator 程序框架和 target 組成(圖 4)。如果 initiator 程序(主機)和 NVMe SSD 位于同一服務器內,則直接通過 PCIe 訪問設備。否則,啟動程序必須通過結構來訪問遠程目標設備。

bf0c7358-edb2-11ee-a297-92fbcf53809c.png

圖 4:SPDK NVMe over Fabrics 框架

在多種結構選項中,NVMe over TCP 允許用戶跨標準以太網使用 NVMe。得益于成熟 TCP/IP 棧的穩定性和可移植性,這可實現更低的部署成本,并降低設計復雜性。

我們將重點關注 SPDK NVMe over TCP,它集 NVMe over TCP 和 SPDK 工作機制的優點于一身。?

使用 TCP 傳輸時(圖 5),每個主機端 NVMe 隊列對都有一個對應的控制器端隊列對,后者被映射至自己的 TCP 連接。該 NVMe 隊列對將會分配給單獨的 CPU 核心。命令包 (Command Capsules) 被封裝到 TCP 協議數據單元 (PDU) 中,并通過 Linux 系統調用(包括?sendmsg),經標準 TCP/IP 套接字發送出去??刂破鞫藦奶捉幼志彌_區讀取接收到的數據并構建接收 CMD 包。這其中就包括用于進一步處理的請求信息。處理完請求后,會生成一個 RSP 包并通過套接字發送出去。響應數據到達主機端套接字緩沖區,該緩沖區已被封裝到接收 CMD 包中。

bf33aa18-edb2-11ee-a297-92fbcf53809c.png

圖 5:NVMe over TCP 數據路徑

Arm 平臺上的優化工作

SPDK NVMe over TCP 是一個高性能解決方案,它通過 TCP/IP 網絡將 NVMe 存儲提供給遠程客戶端。雖然 SPDK 是無鎖的,并且 NVMe 驅動程序位于用戶空間內,但基于內核的 TCP/IP 棧并不是無鎖的。因此,內核與用戶空間之間的系統調用和內存復制是不可避免的。為了有效利用 TCP/IP 棧,SPDK 引入了多項優化,包括:

批量寫入

管道緩沖

零拷貝

我們的優化工作基于現有的實現,旨在進一步提高 SPDK NVMe over TCP 性能:

調整系統配置

改進數據局部性

平衡零拷貝和非零拷貝

減少功耗浪費

配置優化

正確的系統配置對于 SPDK 來說至關重要。平臺會根據架構和功能進行配置,包括:

Linux 內核設置

PCIe 參數

NIC 參數

Linux 內核命令行設置

Hugepage:SPDK 依賴于數據平面開發套件 (DPDK)?庫來管理組件,包括大內存頁和緩沖池。DPDK 支持 2MB 和 1GB,以涵蓋大內存區域,同時不會出現過多 TLB 未命中的情況,從而提供更好的性能。

核心隔離:將 CPU 與內核調度程序隔離開,以減少上下文切換。

Iommu.passthrough:如果 IOMMU 可用,SPDK 建議使用?vfio-pci 驅動程序。否則,請使用?uio_pci_generic 或 igb_uio。要使用?uio_pci_generic 或 igb_uio 驅動程序,應禁用 IOMMU 或將其設為直通模式。如果未設置 iommu.passthrough,vfio-pci 驅動程序將對 DMA 使用 I/O 虛擬地址 (IOVA)。這對于?IOMMU 的轉換更為安全。如果在 GRUB 命令行中添加“iommu.passthrough=1”,則對 DMA 使用物理地址。這樣可以提高性能。

例如,對于四個?1G 的大頁,請將以下參數添加到 GRUB 命令行中。SPDK 運行在 CPU 核心 0-7 上,而 IOVA 為物理地址。

bfdc98c6-edb2-11ee-a297-92fbcf53809c.jpg

PCIe 參數調整

PCIe 最大有效負載大小 (PCIe Max Payload Size) 決定了 PCIe 數據包的最大大小。制造商會設置最大 TLP 有效負載大小,該值還取決于所連接的設備。將“pci=pcie_bus_perf”添加到內核命令行,以確保使用 PCIe 最大有效負載大小。

PCIe 最大讀取請求 (PCIe Max Read Request) 決定了所允許的最大 PCIe 讀取請求。PCIe 最大讀取請求的大小可能會影響待處理請求的數量。請根據工作負載進行調整。

使用以下命令設置最大請求大?。?/p>

bff3b27c-edb2-11ee-a297-92fbcf53809c.jpg

NIC 參數調整

NIC 隊列數和隊列深度

通常情況下,NIC Rx/Tx 隊列數的設置與 CPU 數量相同。隊列大小需要適當,因為較小的隊列可能會導致數據包丟失。如果環的大小超過了緩存,則較大的隊列可能會導致緩存利用率較差。請根據系統資源和工作負載進行調整。

c0044e34-edb2-11ee-a297-92fbcf53809c.jpg

硬中斷關聯

IRQ 關聯是一項 Linux 功能,它會將一些 IRQ 分配給專用處理器。正確的 IRQ 關聯設置可提高服務器工作效率。對于大多數情況而言,NIC 的 IRQ 應綁定至 NIC 所在的同一 NUMA 節點。Irqbalance 是一個 Linux 守護進程,它有助于平衡所有 CPU 之間的中斷所產生的 CPU 負載。要設置 IRQ 關聯,應首先停止 irqbalance 服務。

例如,在 64 核系統的上層 32 核上,請將以下命令用于 IRQ 40:

c017342c-edb2-11ee-a297-92fbcf53809c.jpg

硬中斷合并

中斷合并[1]是一種控制設備何時引發中斷的方法。在產生中斷之前,NIC 會收集入站數據包并等待達到特定閾值。這樣便減少了 CPU 必須處理的總中斷數,從而導致吞吐量提高、延遲增加以及 CPU 使用率降低。

請使用以下命令啟用自適應 irq 合并:

c02c5456-edb2-11ee-a297-92fbcf53809c.jpg

根據用例,使用?ethtool -C 設置 irq 合并:

c03d74c0-edb2-11ee-a297-92fbcf53809c.jpg

參數為:

rx-usecs:在數據包到達后會延遲 RX 中斷的?usecs?數量

rx-frames:在 RX 中斷之前所接收到的最大數據幀數

rx-frames-irq:在主機處理中斷時,在生成 RX 中斷之前所接收到的最大數據幀數

軟中斷合并

NAPI[2] 是一種減少網絡設備在數據包到達時所生成的 IRQ 數量的機制。它會注冊一個輪詢函數,NAPI 子系統調用此函數可收集數據幀。

設置“net.core.netdev_budget”和“net.core.netdev_budget_usecs”可限制在一個 NAPI 輪詢周期內輪詢的數據包數量。Netdev_budget 是在一個輪詢周期內從所有接口獲取的最大數據包數。即使 netdev_budget 尚未耗盡,輪詢周期也不得超過 netdev_budget_usecs 微秒。而?dev_weight 是內核在 NAPI 中斷上可以處理的最大數據包數,它是一個 Per-CPU 變量。

c04b4e10-edb2-11ee-a297-92fbcf53809c.jpg

請參閱?Linux 網絡性能參數[3],獲取更多信息。

TCP 套接字緩沖區

默認情況下,TCP 套接字緩沖區大小是根據系統內存自動計算的。較小的套接字緩沖區可能會導致接收數據時丟包,以及發送數據時頻繁寫操作阻塞。要調整緩沖區,請使用以下命令:

c05ae6cc-edb2-11ee-a297-92fbcf53809c.jpg

數據局部性優化

在 TCP 內核空間中,當數據到達 NIC 且 NIC DMA 數據包到達 RAM 時,會根據 RSS 中的哈希函數選擇一個接收環。數據包的引用被排入環形緩沖區中。系統會發起硬 IRQ,由 CPU 負責處理。如果設置 IRQ 綁定,則是所分配的 CPU,否則 irqbalance 服務會選擇一個。默認情況下,軟 IRQ 會在與硬 IRQ 相同的 CPU 核心上觸發;硬 IRQ 會觸發 NAPI,以從接收環形緩沖區輪詢數據。該數據包的處理是在?CPU 核心中進行的,直到被排入套接字接收緩沖區中。

在 SPDK NVMe over TCP 中,每個來自客戶端的連接在啟動期間都會分配給一個 Reactor(CPU 核心)。此連接的套接字讀/寫是在該 CPU?核心上完成的。所以,內核空間與用戶空間之間存在語義差距,這與?CPU 核心親和性有關。

為了保證 CPU 核心處理內核空間中的此套接字數據與用戶空間中讀取此套接字的核心 (SPDK) 完全相同,在 SPDK NVMe over TCP 中,我們引入了基于 CPU 親和性的套接字處理[4]?。它將獲取套接字的 CPU 親和性,并確定在連接啟動期間應將此套接字分配給哪個 CPU 核心。例如,當新連接(套接字 A)啟動時(圖 6),我們會獲得套接字 A 的 CPU 親和性。這里是?CPU 核心 1,它負責該套接字數據包的內核空間處理。然后在 SPDK 中,套接字 A 會被分配給核心 1 中的輪詢組,以后套接字 A 的讀/寫將會在核心 1 上執行。

c073de02-edb2-11ee-a297-92fbcf53809c.png

圖 6:TCP 數據接收流程

例如:對于六個 P4600 NVMe 盤的服務器,它使用八個核心,NIC IRQ 被綁定至這八個核心,而客戶端程序使用 24 個和 32 個核心。這個優化使隨機寫入性能提升 11% - 17%。

零拷貝優化

對于使用套接字發送數據時,MSG_ZEROCOPY[5]?標記可以使能零拷貝。該功能目前主要針對 TCP 套接字實現。然而,零拷貝并不是沒有代價的,因為它會在頁面固定期間導致額外的頁面記錄和完成后通知的開銷。

在 SPDK NVMe over TCP 中,零拷貝可以在啟動期間進行啟用或禁用。啟用后,不論大小,所有數據均通過零拷貝發送。這對于小數據(例如回復請求)的性能有負面影響。因此,平衡內存復制開銷與頁面固定開銷至關重要。動態零拷貝[6]的引入是為了設置數據發送的閾值,以確定是否通過零拷貝發送數據。任何大于閾值的數據由零拷貝發送,其他數據則不然。

例如,?在 16 個 P4610 NVMe SSD、兩個客戶端,且客戶端與服務器端程序的配置與?SPDK 報告[7]相同的測試環境中,對于 posix 套接字 rw_percent=0 (randwrite),經測試,128 隊列深度、服務器端 1 至 40 個 CPU 核心下的性能提升可達 2.4% - 8.3%。當讀取百分比大于 50% 時,其影響并不明顯。對于 uring 套接字 rw_percent=0 (randwrite),經測試,128 隊列深度、服務器端 1 至 40 個 CPU 核心下的性能提升可達 1.8% - 7.9%(圖 7)。當讀取百分比大于 50% 時,性能提升可達 1% - 7%。

c0d8fbac-edb2-11ee-a297-92fbcf53809c.png

圖 7:qdepth=128 時的 4KB 隨機寫入性能

功耗優化

以前在 SPDK 中,無論要處理的工作負載數量如何?,CPU 核心上的每個線程都工作在輪詢模式下。然而,如果工作負載隨時間變化較大,可能會造成功耗浪費。為了解決這個問題,我們引入了動態調度程序框架,以實現節能并降低 CPU 占用率。

調度程序框架會動態收集每個線程和 Reactor 的數據,并執行包括移動線程、切換 Reactor 模式和設置 CPU 核心頻率等在內的操作。例如,如果 Reactor 1 到 Reactor N 中的輪詢器空閑,則相應的 SPDK 線程將遷移至 Reactor 0(圖 8)。然后,Reactor 1 至 Reactor N 切換至中斷模式。Reactor 0 的 CPU 頻率會根據該 Reactor 的繁忙程度進行調整。我們將這稱之為?CPU 頻率調節。

c0f3a164-edb2-11ee-a297-92fbcf53809c.png

圖 8:SPDK 動態調度程序解決方案

Linux 內核通過 CPU 頻率調節 (CPUFreq) 子系統支持 CPU 性能調節。它由三個模塊組成:

核心

調節調控器

調節驅動程序

調節驅動程序與硬件通信。cppc_cpufreq 驅動程序適用于大多數 AArch64 平臺。該驅動程序使用 ACPIv5.1 規范中所述的協作處理器性能控制 (CPPC) 方法。CPPC 是以 CPU 性能值的抽象連續量表為基礎的。這樣就允許遠程功耗處理器靈活地進行優化,以提高功率和性能。

為了啟用 AArch64 上的 CPU 頻率調節,cppc_cpufreq 驅動程序支持[11]被添加到? DPDK Power Library(DPDK 功率庫)中。SPDK 利用它來調節 CPU 頻率,也利用它來獲取頻率信息供調節使用。選項包括 highest_perf、nominal_perf?以及?scaling_max_freq、scaling_min_freq?等等。它為用戶提供了?API,用于設置 CPU 頻率和啟用或禁用加速技術。請參閱?DPDK Power Library[12],獲取有關 API 的更多信息。

結論

本文介紹了?SPDK、SPDK NVMe over TCP 以及如何對其進行優化,其中包括系統配置優化、數據局部性優化、內存零拷貝優化和功耗優化。它們可用于解決對性能至關重要的存儲問題。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 以太網
    +關注

    關注

    40

    文章

    5129

    瀏覽量

    166585
  • SSD
    SSD
    +關注

    關注

    20

    文章

    2719

    瀏覽量

    115736
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1279

    瀏覽量

    78410
  • 固態硬盤
    +關注

    關注

    11

    文章

    1378

    瀏覽量

    56572
  • 非易失性存儲器

    關注

    0

    文章

    106

    瀏覽量

    23289

原文標題:在 Arm 平臺上進行 SPDK NVMe over TCP 優化

文章出處:【微信號:Arm社區,微信公眾號:Arm社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    想要學習在DSP的平臺上進行圖像處理,求推薦入門教材。

    各位大神,本人想要學習在DSP的平臺上進行圖像處理,但基礎比較差。圖像處理的算法是有基礎的,但是總覺得這兩者結合很困難,希望大神告訴我下有什么好方法入門,或者看哪些教材
    發表于 05-20 10:29

    Linux平臺上如何進行通用計算并行優化

    Linux平臺上如何進行通用計算并行優化
    發表于 03-12 07:43

    何在STM32的平臺上設計搭建濾波器?

    何在STM32的平臺上設計搭建濾波器?
    發表于 09-29 07:58

    何在stm32f103上進行匯編語言測試

    何在stm32f103上進行匯編語言測試?有哪些步驟?
    發表于 10-08 08:45

    何在RK3288平臺上去編譯uboot命令

    何在RK3288平臺上去編譯uboot命令?如何在RK3288平臺上去編譯kernel命令
    發表于 02-10 06:38

    何在SDK平臺上通過lua語言去開發nodemcu硬件

    什么是nodemcu?如何在SDK平臺上通過lua語言去開發nodemcu硬件?
    發表于 02-15 06:26

    怎樣在阿里云物聯網平臺上進行單片機程序的編寫

    阿里云物聯網平臺是怎樣設置的?怎樣在阿里云物聯網平臺上進行單片機程序的編寫?
    發表于 02-22 06:04

    何在rk平臺上調試一款32寸的LVDS屏幕

    何在rk平臺上調試一款32寸的LVDS屏幕?
    發表于 03-03 10:31

    何在RK3399這一 Arm64平臺上搭建Tengine AI推理框架

    Tengine是什么?如何在RK3399這一 Arm64平臺上搭建Tengine AI推理框架?
    發表于 03-04 12:31

    何在RK3399平臺上實現4G語音通話和短信功能

    何在RK3399平臺上實現4G語音通話和短信功能?有哪些步驟?
    發表于 03-07 07:48

    何在Android 4.3平臺上進行藍牙低功耗開發操作?(1)

    在Android 4.3平臺上進行藍牙低功耗(BLE)開發 第一部分
    的頭像 發表于 08-22 01:33 ?2603次閱讀

    Solarflare公司正在推廣使用基于以太網的NVMe-over-Fabrics

    Solarflare聲稱,使用以太網的NVMe-over-TCP為IT部門提供了與iWARP和RoCE相同的高帶寬、低延遲性能,并且每年可以把1億個以太網端口的90%傳輸到他們的數據中心。
    的頭像 發表于 06-12 09:56 ?2835次閱讀

    在基于Arm平臺上使用HALCON免費下載

    在基于Arm平臺上使用HALCON免費下載
    發表于 12-08 17:28 ?0次下載
    在基于<b class='flag-5'>Arm</b>的<b class='flag-5'>平臺上</b>使用HALCON免費下載

    SPDK Thread模型設計與實現 NVMe-oF的使用案例

    SPDK Thread 模型是SPDK誕生以來十分重要的模塊,它的設計確保了spdk應用的無鎖化編程模型,本文基于spdk最新的release 19.07版本介紹了整體thread模型
    的頭像 發表于 07-03 16:20 ?1977次閱讀

    何在手機應用的高通平臺上使用TAS2560

    何在手機應用的高通平臺上使用TAS2560
    發表于 11-01 08:27 ?0次下載
    如<b class='flag-5'>何在</b>手機應用的高通<b class='flag-5'>平臺上</b>使用TAS2560
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>