隨著大數據、人工智能技術的發展,越來越多的用戶產生了獲取擁有GPU算力的彈性計算服務的需求,GPU云主機具有突出的圖形處理和高性能計算能力,適用于科學計算、視頻處理、深度學習等應用場景,受到了市場的青睞。
本期智匯華云,特別邀請到華云數據OpenStack開發工程師傅成超為大家帶來“OpenStack 虛擬機 GPU 性能優化”。
首先為大家簡單介紹一下 NUMA 的概念。NUMA 是一種解決多 CPU 工作的技術方案,在此之前,市面上主要采用 SMP 和 MPP 兩種架構。
SMP 技術
計算機技術發展初期,服務器都是單 CPU 結構,隨著技術的不斷發展,多 CPU 結構開始流行起來,為了滿足多 CPU 共同工作的需求,SMP 技術應運而生。
如圖所示,多個 CPU 通過一個總線訪問存儲器,因此無論在什么時候,處理器只能為內存的每個數據保持或共享唯一一個數值。
SMP 的缺點是十分明顯的,即擴展性有限,因此在存儲接口達到飽和的時候,增加處理器的數量并不能獲得更高的性能,因此 SMP 架構支持的 CPU 數量十分有限。
MPP 技術
MPP 則是一種分布式存儲器模式,它能將更多的處理器納入一個系統的存儲器。一個分布式存儲器具有多個節點,每個節點都有自己的存儲器,單個節點相互連接形成了一個總系統。MPP 可以近似理解為一個 SMP 的橫向擴展集群。
NUMA 技術
NUMA 是目前最常用的技術,在 NUMA體系中每個處理器都有自己的存儲器,同時,每個處理器也可以訪問其他處理器的存儲器。
下圖為多核 NUMA CPU 架構
如上文所說,每個處理器既可以訪問自己的存儲器,也可以訪問其他處理器的存儲器,事實上,前者的速度要比后者最高快到100倍之多。在 Linux 中,系統默認采用自動 NUMA 平衡策略,所以 NUMA 調優的目的就是讓處理器盡可能地訪問自己的存儲器,以提高計算速度。
在 OpenStack 中,可以采用 virsh numatune 命令查看和修改虛擬機的 NUMA 配置,反映在 XML 文件上的便是和 < numatune > 中的 id 保持一致。
那么在 GPU 云主機中,是否可以采用相同的思路進行性能調優呢?答案自然是肯定的。
在進行 GPU 性能優化前,我們還需要進一步了解一下 render-nodes 的概念。
render-nodes 是一種用于訪問具有 DRI 能力的 GPU 非特權功能的 DRM 接口,在 Linux 內核中,DRM 驅動程序通過 render-node 接口公開其用戶空間 API 的非特權部分,并作為一個單獨的設備文件 (/dev/dri/renderDXX) 存在。信息技術變革日新月異,如今,客戶端已不再需要運行合成器或圖形服務器來使用 GPU ,通過 render-node 即可實現對 GPU 資源的訪問。
將 render-node 和所在的 NUMA 綁定,可以有效防止跨片 PCIE 訪問帶來的性能損耗。
通過 lspci –vvvs bus_id 命令便可查看 GPU 所在的 NUMA 節點,即 /dev/dri/renderDXX 與 NUMA 的對應關系。以我本機為例,renderD128 對應 NUMA 0,renderD129 對應 NUMA 1,此時我們便可以使用 numactl 進行綁定。
然而在一個 OpenStack 云環境中可能會運行著成百上千的云主機,云主機創建完成后逐一進行手動綁定明顯不是一個現實的方案,此時可以通過修改 /nova/virt/libvirt/driver.py中的相關邏輯。當程序獲取到 vcpu 被分配的 NUMA 節點后,通過設備之間的映射關系,在添加 GPU 設備階段為其綁定對應的 render-node。這樣虛擬機在創建之初便擁有了卓越的性能,無需后期進行人工綁定。
結束語
本文從 NUMA 出發,為大家簡單介紹了多 CPU 的常用技術架構,并以此為延伸,分享了 GPU 虛擬機的性能調優方案。目前,華云數據公有云產品線中已經包含具有超強計算能力的 GPU 型云主機,在新基建的風口,推動中國企業全面上云,助力客戶實現數字化轉型。