Alibaba Cloud Linux 3提供的共用記憶體通訊(Shared Memory Communication)是一種相容socket層、使用遠程記憶體直接存取(RDMA)技術的高效能核心網路通訊協定棧,能夠顯著最佳化網路通訊效能。然而,在原生ECS環境中使用SMC技術最佳化網路效能時,使用者需要謹慎維護SMC白名單以及容器網路命名空間中的配置,以防止SMC非預期降級到TCP。ASM為使用者提供了可控的網路環境(叢集內)SMC最佳化能力,能夠自動最佳化服務網格Pod間的流量,使用者無需關心具體的SMC配置。
前提條件
使用限制
ASM啟用SMC網路效能最佳化當前處於beta階段。
節點使用支援配置eRDMA的ECS執行個體。詳細資料,請參見在企業級執行個體上配置eRDMA。
節點作業系統使用Alibaba Cloud Linux 3,詳情參見Alibaba Cloud Linux 3。
ASM執行個體版本為1.21及以上。關於如何升級執行個體,請參見升級ASM執行個體。
ACK叢集使用Terway網路外掛程式,詳情參見使用Terway網路外掛程式。
ACK叢集配置API Server公網訪問能力,詳情參見控制叢集API Server的公網訪問能力。
目前的版本中啟用SMC網路效能最佳化與Sidecar Acceleration using eBPF功能互斥,後續版本中將解除此限制。
操作步驟
步驟一:節點環境初始化
SMC利用eRDMA網卡加速網路效能,在啟用之前需要對節點進行相應的初始化準備。
升級Alibaba Cloud Linux 3系統核心為5.10.134-16.3及以上。
說明特定版本核心的已知問題以及修複方式可見於已知問題小節。
使用
uname -r
查看當前核心版本,若核心版本為5.10.134-16.3及以上,則無需額外操作,跳過核心升級步驟。$ uname -r 5.10.134-16.3.al8.x86_64
查看可安裝核心版本
$ sudo yum search kernel --showduplicates | grep kernel-5.10 Last metadata expiration check: 3:01:27 ago on Tue 09 Apr 2024 07:40:15 AM CST. kernel-5.10.134-15.1.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-15.2.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-15.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-16.1.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-16.2.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-16.3.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports kernel-5.10.134-16.al8.x86_64 : The Linux kernel, based on version 5.10.134, heavily modified with backports [...]
安裝最新版本核心或安裝指定版本核心
安裝最新版本核心:
$ sudo yum update kernel
或安裝指定核心版本,以 kernel-5.10.134-16.3.al8.x86_64 版本為例:
$ sudo yum install kernel-5.10.134-16.3.al8.x86_64
重啟節點。系統重新啟動後使用
uname -r
檢查核心是否已升級至預期版本。
為ACK網路外掛程式Terway配置彈性網卡白名單,防止其納管即將添加的輔助eRDMA網卡。操作步驟請參見為彈性網卡(ENI)配置白名單。
為叢集內各節點建立和綁定一塊輔助eRDMA網卡,具體操作參見為已有執行個體配置eRDMA。
說明只需完成輔助eRDMA網卡的建立和綁定步驟即可。在此情境下,輔助eRDMA網卡需要和主網卡處在同一子網內。配置輔助eRDMA網卡方式請參見下一步驟。
配置節點上的輔助eRDMA網卡
將下述指令碼存放於節點的任意目錄下。為指令碼添加可執行許可權:
sudo chmod +x asm_erdma_eth_config.sh
。說明此指令碼僅在當前上下文中用於輔助eRDMA網卡配置,不適用於其他網卡配置情境。
執行
sudo ./asm_erdma_eth_config.sh -s
將新添加的輔助eRDMA網卡狀態設定為UP,並為其配置IPv4地址。預計輸出類似如下內容:$ sudo ./asm_erdma_eth_config.sh -s Find ethernet device with erdma: eth2 - state <DOWN>, IPv4 <192.168.x.x>, mask <255.255.255.0>, gateway <192.168.x.x> Config.. - successed to set eth2 UP - successed to configure eth2 IPv4/mask and direct route Complete all configurations of eth2
(可選)上述配置輔助eRDMA網卡的步驟在每次重啟節點後需要再次執行。若希望重啟節點時自動執行配置,可按如下方式建立對應的systemd service。
在節點/etc/systemd/system目錄下添加如下asm_erdma_eth_config.service檔案,將其中的
/path/to/asm_erdma_eth_config.sh
更換為節點上asm_erdma_eth_config.sh指令碼的實際路徑。啟用asm_erdma_eth_config.service。
sudo systemctl daemon-reload sudo systemctl enable asm_erdma_eth_config.service
此後在節點啟動時將自動執行網卡配置。節點啟動後可通過
sudo systemctl status asm_erdma_eth_config.service
查看asm_erdma_eth_config.service狀態,預期狀態為active
,輸出類似如下。# sudo systemctl status asm_erdma_eth_config.service ● asm_erdma_eth_config.service - Run asm_erdma_eth_config.sh script after network is up Loaded: loaded (/etc/systemd/system/asm_erdma_eth_config.service; enabled; vendor preset: enabled) Active: active (exited) since [time] Main PID: 1689 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 403123) Memory: 0B CGroup: /system.slice/asm_erdma_eth_config.service [time] <hostname> sh[1689]: Find ethernet device with erdma: eth2 [time] <hostname> systemd[1]: Starting Run asm_erdma_eth_config.sh script after network is up... [time] <hostname> sh[1689]: - state <DOWN>, IPv4 <192.168.x.x>, mask <255.255.255.0>, gateway <192.168.x.x> [time] <hostname> sh[1689]: Config.. [time] <hostname> sh[1689]: - successed to set eth2 UP [time] <hostname> sh[1689]: - successed to configure eth2 IPv4/mask and direct route [time] <hostname> sh[1689]: Complete all configurations of eth2 [time] <hostname> systemd[1]: Started Run asm_erdma_eth_config.sh script after network is up.
相反,若不再需要asm_erdma_eth_config.service,可通過
sudo systemctl disable asm_erdma_eth_config.service
移除。
步驟二:部署測試應用
為測試使用的default命名空間啟用自動注入,具體請參見啟用自動注入。
使用以下內容,建立fortioserver.yaml檔案。
使用ACK叢集的KubeConfig,執行以下命令,部署測試應用。
kubectl apply -f fortioserver.yaml
執行以下命令,查看測試應用的狀態。
kubectl get pods | grep fortio
預期輸出:
NAME READY STATUS RESTARTS fortioclient-8569b98544-9qqbj 3/3 Running 0 fortioserver-7cd5c46c49-mwbtq 3/3 Running 0
預期輸出表明兩個應用均正常啟動。
步驟三:在基礎環境運行測試,查看基準測試結果
fortio應用啟動後,會暴露8080連接埠監聽,訪問該連接埠將開啟fortio應用的控制台頁面。為了產生測試流量,可以將fortioclient的連接埠映射到當前所用機器,在當前所用機器上開啟fortio的控制台頁面。
使用ACK叢集的KubeConfig,執行以下命令,將fortio用戶端的Service監聽的8080連接埠映射到本地的8080連接埠。
kubectl port-forward service/fortioclient 8080:8080
在瀏覽器中輸入
http://localhost:8080/fortio
地址,訪問fortio用戶端控制台,並修改相關配置。請按照下表修改頁面上的參數。
參數
樣本值
URL
http://fortioserver:8080/echo
QPS
100000
Duration
30s
Threads/Simultaneous connections
64
Payload
填寫以下字串(128 Byte):
xhsyL4ELNoUUbC3WEyvaz0qoHcNYUh0j2YHJTpltJueyXlSgf7xkGqc5RcSJBtqUENNjVHNnGXmoMyILWsrZL1O2uordH6nLE7fY6h5TfTJCZtff3Wib8YgzASha8T8g
配置完成後,在頁面下方,單擊Start開始測試,等待進度條結束,測試完畢。
測試回合完畢後,頁面將給出本次測試的結果。下圖僅供參考,測試結果請以實際環境為準。
頁面輸出的測試結果橫座標為請求的Latency,觀察直條圖在橫座標上的分布可以得出請求延遲的分布情況,紫色曲線為在不同回應時間範圍內完成的請求數量。縱座標為完成的請求數。同時,圖表頂部給出了P50/P75/P90/P99/P99.9的請求Latency資料。得到基礎環境資料後,需要為應用啟用SMC,準備進行SMC加速後的效能驗證。
步驟四:為ASM執行個體和工作負載啟用SMC加速
使用服務網格的KubeConfig編輯網格配置,添加"smcEnabled: true",以啟用SMC加速功能。
$ kubectl edit asmmeshconfig apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMMeshConfig metadata: name: default spec: ambientConfiguration: redirectMode: "" waypoint: {} ztunnel: {} cniConfiguration: enabled: true repair: {} smcEnabled: true
使用ACK叢集的KubeConfig,執行以下命令,修改fortioserver和fortioclient的Deployment,為Pod添加Annotation。
為網格執行個體啟用加速後,還需要進一步為工作負載啟用加速,通過為Pod添加Key為
smc.asm.alibabacloud.com/enabled
,值設定為true
的Annotation,可以為工作負載啟用SMC加速,您需要同時為需要最佳化的兩端工作負載均啟用加速。編輯fortioclient的Deployment定義。
$ kubectl edit deployment fortioclient apiVersion: apps/v1 kind: Deployment metadata: ...... name: fortioclient spec: ...... template: metadata: ...... annotations: smc.asm.alibabacloud.com/enabled: "true"
編輯fortioserver的Deployment定義。
$ kubectl edit deployment fortioserver apiVersion: apps/v1 kind: Deployment metadata: ...... name: fortioserver spec: ...... template: metadata: ...... annotations: smc.asm.alibabacloud.com/enabled: "true"
步驟五:加速後環境運行測試,查看啟用最佳化後的測試結果
由於修改Deployment將使工作負載重啟,因此您需要參考步驟三重新進行fortioclient連接埠映射,再次發起測試,等待測試結束查看結果。
與加速前的結果對比,可以看到啟用ASM SMC加速後,延遲下降,QPS明顯提升。
已知問題
使用Alibaba Cloud Linux 3系統5.10.134-16.3版本核心啟用SMC加速後,重啟POD時系統報告類似
unregister_netdevice: waiting for eth* to become free. Usage count = *
錯誤資訊。POD無法成功刪除。此問題是由於smc核心模組未正確釋放網路介面的引用計數。可通過啟用如下熱補丁,修複此已知問題。其餘更高版本可忽略此步驟。更多核心熱補丁操作詳見核心熱補丁操作說明。
$ sudo yum install kernel-hotfix-16664924-5.10.134-16.3