在同一節點上同時運行多個Pod時,Pod之間可能會因為CPU資源的爭搶帶來頻繁的環境切換,導致效能抖動。針對效能敏感型應用,您可以啟用CPU拓撲感知調度功能,將Pod固定在節點的CPU Core上運行,緩解因CPU環境切換、跨NUMA訪存導致的應用效能下降問題。
為了協助您更好地理解本文檔並使用本功能,推薦您參見Kubernetes官方文檔瞭解Pod Qos類、為容器和 Pod 分配記憶體資源、節點上的CPU管理原則(例如CPU管理原則、none
策略、static
策略)等概念。
使用情境
在Kubernetes叢集中,多個Pod會在同一個節點上共用CPU核心。但在以下情境中,某些應用可能需要固定在部分CPU核心上運行。
應用尚未完成對雲原生情境的適配,例如在設定線程數量時未考慮容器規格(而是整機物理核心數量),導致應用出現效能下降問題。
應用運行在神龍裸金屬(Intel、AMD)等多核機器上,且出現大量因跨NUMA訪存帶來的應用效能下降問題。
應用對CPU環境切換十分敏感,無法承受因此帶來的效能抖動。
雖然Kubernetes提供了CPU Manager以解決此問題,支援為對CPU親和性和效能有更高要求的應用配置static
策略,允許這些應用獨佔節點上的特定CPU Core,以獲得穩定的計算資源。但CPU Manager僅提供節點維度CPU調度選擇,無法在叢集維度選擇最優的CPU Core組合。此外,通過CPU Manager為應用配置static
策略時,Pod僅支援對Guaranteed類型的Pod生效,即Pod中的每個容器必須聲明了CPU Request和CPU Limit且兩者取值相等,無法適用於其他類型的Pod,包括Burstable和BestEffort。
為此,ACK叢集基於新版的Scheduling Framework實現了CPU拓撲感知調度功能,支援通過Pod Annotation直接啟用,以更好地保障CPU敏感型工作負載的服務效能。
前提條件
已建立ACK叢集Pro版,且節點池的CPU Policy為None,請參見建立ACK Pro版叢集。
已安裝ack-koordinator組件,且組件版本為0.2.0及以上,請參見ack-koordinator。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
步驟一:部署樣本應用
本文以一個Nginx應用為例,介紹如何啟用CPU拓撲感知調度,實現CPU綁核。
使用以下YAML樣本,部署一個Nginx應用。
在Pod對應的節點上,執行以下命令,查看當前容器的CPU核心綁定情況。
# 具體路徑可根據Pod的UID以及Container的ID拼接得到。 cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus
預期輸出:
# 未指定自動綁核策略前,可使用的CPU編號範圍為0~31,表示CPU目前沒有約束。 0-31
步驟二:啟用CPU拓撲感知調度功能
您可以通過Pod Annotation啟用CPU拓撲感知調度功能,實現對Pod的綁核,具體策略如下。
在使用CPU拓撲感知調度時,請勿在Pod上直接指定nodeName
,kube-scheduler並不參與這類Pod的調度過程。您可以使用nodeSelector
等欄位配置親和性策略,來指定節點調度。
普通綁核策略
您可以通過Pod Annotation cpuset-scheduler
啟用CPU拓撲感知調度功能,系統會為您實現CPU綁核。
在Pod YAML的
metadata.annotations
中,配置cpuset-scheduler
為true
,啟用CPU拓撲感知調度。說明如需在工作負載(例如Deployment)中配置,請在
template.metadata
欄位下配置Pod對應的Annotation。在
Containers
欄位下,配置resources.limit.cpu
的取值(該值需為整數),限定CPU綁核範圍。
自動綁核策略
您可以通過Annotation開啟CPU拓撲感知調度功能並同步啟用自動綁核策略。配置後,調度器會根據Pod規格自動規劃綁核心數量,盡量避免出現跨NUMA訪問記憶體的情況。
在Pod YAML的
metadata.annotations
中,配置cpuset-scheduler
為true
,且cpu-policy
為static-burst
,啟用自動綁核策略。說明如需在工作負載(例如Deployment)中配置,請在
template.metadata
欄位下配置Pod對應的Annotation。在
Containers
欄位下,配置resources.limit.cpu
的取值(該值需為整數),做為CPU綁核範圍的參考值。
結果驗證
以普通綁核策略為例,驗證CPU拓撲感知調度是否成功啟用。自動綁核策略的驗證流程類似。
在Pod對應的節點上,再次執行以下命令,查看啟用自動綁核策略後容器的CPU核心綁定情況。
# 具體路徑可根據Pod的UID以及Container的ID拼接得到。
cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf9b79bee_eb2a_4b67_befe_51c270f8****.slice/cri-containerd-aba883f8b3ae696e99c3a920a578e3649fa957c51522f3fb00ca943dc2c7****.scope/cpuset.cpus
預期輸出:
# 和limit數量相同
0-3
預期輸出表明,容器可用的CPU編號範圍為0~3,與YAML中聲明的resources.limit.cpu
一致。