阿里雲Container ServiceACK支援通過ack-koordinator組件為叢集開啟差異化SLO能力,差異化SLO適用於線上服務應用和離線計算應用混合部署在同一節點的使用情境。本文介紹如何使用ack-koordinator支援線上服務與視頻轉碼應用的混部。
情境描述
使用ACK叢集部署線上服務應用Nginx,並在相同節點混合部署視頻轉碼應用FFmpeg,用於充分發掘叢集中已申請但未使用的實體資源。同時啟用ack-koordinator的資源隔離能力,保障線上服務Nginx的運行,規避來自離線應用FFmpeg的幹擾。
應用部署架構
在ACK叢集中的機器運行Nginx伺服器應用作為線上服務,與視頻解碼應用FFmpeg混部。其中,標識Nginx Pod的QoS等級為高優先順序延遲敏感型LS(Latency Sensitive),標識FFmpeg Pod的QoS等級為低優先順序BE(Best Effort)。本文將對比在不同混部配置下,Nginx應用表現的效能差異。
在離線混部過程中主要使用的相關特性:
資源複用:通過動態資源超賣,允許離線應用複用線上應用已申請但未使用的實體資源,提升叢集的資源使用率。
資源隔離:通過容器CPU QoS、彈性資源限制、容器L3 Cache及記憶體頻寬隔離等手段,約束離線應用的資源使用,優先保障線上應用的運行。
準備工作
環境準備
在ACK Pro叢集中建立2個節點用於構建混部環境。其中一個節點作為測試機,將運行Nginx和FFmpeg的混部測試;另一節點作為壓測機,將運行用戶端的wrk,向Nginx請求Web服務,製造壓測請求。具體操作,請參見建立ACK Pro版叢集。
為了能夠充分使用ack-koordinator提供的混部最佳化能力,建議測試機使用神龍裸金屬伺服器及Alibaba Cloud Linux。
安裝ack-koordinator(ack-slo-manager)並開啟相關混部策略,詳情請參見快速入門。本文以ack-koordinator v0.8.0版本為例進行說明。
線上應用準備
部署混部測試所需的線上服務應用和壓測工具。
使用以下YAML內容,建立ls-nginx.yaml檔案。
執行以下命令,部署Nginx應用。
kubectl apply -f ls-nginx.yaml
執行以下命令,查看Nginx應用的Pod狀態。
kubectl get pod -l app=nginx -o wide
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 43s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>
由預期輸出得到,Pod的狀態為
Running
,表示Nginx應用已在測試機上正常運行。在壓測機上,執行以下命令,部署壓測工具wrk。
wget -O wrk-4.2.0.tar.gz https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz && tar -xvf wrk-4.2.0.tar.gz cd wrk-4.2.0 && make && chmod +x ./wrk
離線應用準備
準備部署混部測試所需的離線視頻轉碼應用FFmpeg。
使用以下YAML內容,建立be-ffmpeg.yaml檔案。
執行以下命令,部署FFmpeg應用。
kubectl apply -f be-ffmpeg.yaml
執行以下命令,查看FFmpeg應用的Pod狀態。
kubectl get pod -l app=ffmpeg -o wide
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES be-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>
由預期輸出得到,Pod的狀態為
Running
,表示FFmpeg應用已在測試機上正常運行。
操作步驟
本文將進行三組實驗,分別採用以下三種的應用混合部署模式,對比不同混部模式下線上應用的效能表現和節點的資源使用率。
部署方式 | 說明 |
線上應用獨立部署(基準) | 將線上應用Nginx在測試機上只部署線上應用Nginx,不部署離線視頻轉碼應用FFmpeg。在壓測機上通過wrk工具向Nginx應用發起請求,用於類比未混部情境,測試Nginx應用在無離線應用幹擾情況下的壓測效能表現,以及壓測過程中節點的資源使用率。 |
K8s預設混合部署(對照組) | 將線上應用Nginx和離線視頻轉碼應用FFmpeg在測試機上混合部署,在壓測機上通過wrk工具向Nginx應用發起請求。其中FFmpeg應用採用K8s Best Effort模式部署,Pod不填寫Requests和Limits,通過調節進程數,可以控制節點的CPU使用率,本文實驗對應的CPU使用率為65%。用於類比採用K8s預設混合部署的情境,測試Nginx應用在預設混部下的壓測效能表現,以及壓測過程中節點的資源使用率。 |
ACK差異化SLO混部(實驗組) | 將線上應用Nginx和離線視頻轉碼應用FFmpeg在測試機上混合部署;在壓測機上通過wrk工具向Nginx應用發起請求。其中FFmpeg應用採用ACK差異化SLO的BE模式部署,Pod填寫動態資源超賣的擴充資源,測試機上開啟彈性資源限制、容器CPU QoS、容器L3 Cache及記憶體頻寬隔離等ACK差異化SLO功能。用於類比採用ACK差異化SLO混部的情境,測試Nginx應用在ACK差異化SLO混部下的壓測效能表現,以及壓測過程中節點的資源使用率。 |
實驗結果總覽
本次實驗採用以下指標,評估不同應用混合部署模式下Nginx應用的效能表現和節點的資源使用率:
回應時間RT(Response Time)分位值:RT是線上應用通常關注的效能指標,RT越低代表線上服務效能越好。RT指標通過收集wrk壓測結束後列印的資訊獲得,在實驗中反映了Nginx應用響應wrk請求所花費的時間。例如RT-p50表示Nginx響應前50% wrk請求最大所花費的時間(中位元),RT-p90表示Nginx響應前90% wrk請求最大所花費的時間。
節點CPU平均利用率:節點的CPU平均利用率反映了節點上應用在一段時間內對CPU資源的使用比率,節點CPU平均利用率越高代表實體資源使用越充分。節點CPU平均利用率指標可以通過
kubectl top node
命令獲得,在實驗中反映了各個混合部署模式下,壓測中CPU資源的使用比率。
預期結果如下:
指標/部署模式 | 基準(線上應用獨立部署) | 對照組(K8s預設混合部署) | 實驗組(ACK差異化SLO混部) |
Nginx RT-p90(ms) | 0.533 | 0.574(+7.7%) | 0.548(2.8%) |
Nginx RT-p99(ms) | 0.93 | 1.07(+16%) | 0.96(+3.2%) |
節點CPU平均利用率 | 29.6% | 65.1% | 64.8% |
對比基準和對照組:採用K8s預設的混合部署後,節點CPU平均利用率明顯提升(從29.6%變為65.1%),Nginx RT-p90和RT-p99明顯增大,RT效能出現了長尾現象。
對比基準和實驗組:採用ACK差異化SLO混部後,節點CPU平均利用率明顯提升(從28.5%變為64.8%),Nginx RT-p90和RT-p99相對基準有所增高,但仍屬於可接受範圍內。
對比對照組和實驗組:ACK差異化SLO混部相比K8s預設混部,節點CPU平均利用率相近,Nginx RT-p90和RT-p99明顯下降,基本與基準資料持平。
綜上,線上服務與視頻轉碼應用混部情境下,採用ACK差異化SLO混部模式能夠有效提升節點CPU資源使用率,抑制資源混部幹擾。
部署應用
線上應用獨立部署樣本
在測試機上只部署線上應用Nginx,測試線上服務未混部時的效能資料。
參照線上應用部署,在測試機上部署線上應用Nginx。
使用壓測工具wrk,向Nginx應用發起壓測請求。
# node_ip填寫測試機的IP地址,用於wrk向測試機發起壓測;8000是Nginx暴露到測試機的連接埠。 ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
執行以下命令,擷取測試機的節點CPU平均利用率。
kubectl top node
預期輸出:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 29593m 29% xxxx xxxx cn-beijing.192.168.2.94 6874m 7% xxxx xxxx
由預期輸出得到,壓測中測試機的平均CPU資源使用率約為
29%
。等待wrk運行結束後,執行以下命令,擷取wrk的壓測結果。
建議重複多次測試,以獲得相對穩定的結果。
Running 1m test @ http://192.168.2.94:8000/
預期輸出:
6 threads and 54 connections Thread Stats Avg Stdev Max +/- Stdev Latency 402.18us 1.07ms 59.56ms 99.83% Req/Sec 24.22k 1.12k 30.58k 74.15% Latency Distribution 50% 343.00us 75% 402.00us 90% 523.00us 99% 786.00us 8686569 requests in 1.00m, 6.88GB read Requests/sec: 144537.08 Transfer/sec: 117.16MB
RT指標是本次衡量線上服務Nginx應用在不同情境下運行效能的關鍵計量。由預期輸出得到,
Latency Distribution
部分包含了wrk請求在Nginx應用上回應時間RT(Response Time)的分布。例如,90% 523.00us
表示本次壓測中RT的90分位值(P90)為523.00us。Nginx應用在未混部情境下壓測得到的RT-P50、RT-P90、RT-P99分別為343us、523us、786us。
K8s預設混合部署樣本
將線上應用Nginx和離線視頻轉碼應用FFmpeg在測試機上混合部署,在壓測機上通過wrk工具向Nginx應用發起請求。操作步驟與ACK差異化SLO混合部署樣本基本相同,請參照該樣本進行部署,按照YAML中的注釋修改相關參數。
ACK差異化SLO混合部署樣本
在測試機上以ACK差異化SLO的BE Pod的形式部署視頻轉碼應用FFmpeg,測試線上服務在與視頻轉碼應用在差異化SLO混部下的效能資料。
參考快速入門,開啟差異化SLO混部。
相關功能說明如下:
動態資源超賣:採用開啟後的預設配置。用於合理超賣節點未使用的實體資源,提供給BE Pod調度。
彈性資源限制:
cpuSuppressThresholdPercent
設定為65
,其他採用開啟後的預設配置。用於在節點CPU資源使用率超出閾值(65%)時,壓制BE應用的CPU使用,以保障LS應用的CPU效能。容器CPU QoS:採用開啟後的預設配置。用於啟用Alibaba Cloud Linux的CPU Identity能力,在核心調度中優先保障LS應用的CPU調度,避免因BE應用對LS應用運行在同一對SMT超執行緒上而產生的幹擾。
容器L3 Cache及記憶體頻寬隔離:採用開啟後的預設配置。用於啟用裸金屬伺服器的容器L3 Cache和記憶體頻寬隔離機制,優先保障LS應用的L3 Cache和記憶體頻寬使用,緩解BE應用的資源競爭幹擾。
重要容器CPU QoS功能僅在節點的作業系統版本為Alibaba Cloud Linux時生效;使用其他動作系統版本時,該功能不會開啟。
容器L3 Cache及記憶體頻寬隔離功能僅在節點為裸金屬伺服器時生效;使用其他伺服器類型時,該功能不會開啟。
參照線上應用部署,在測試機上部署線上應用Nginx。
使用以下YAML內容,建立be-ffmpeg.yaml檔案。
執行以下命令,部署FFmpeg應用。
kubectl apply -f besteffort-ffmpeg.yaml
執行以下命令,查看Pod狀態。
kubectl get pod -l app=ffmpeg -o wide
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES besteffort-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>
使用壓測工具wrk,執行以下命令,向Nginx應用發起壓測請求。
# node_ip填寫測試機的IP地址,用於wrk向測試機發起壓測;8000是Nginx暴露到測試機的連接埠。 ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/
執行以下命令,查看測試機的CPU資源使用率。
kubectl top node
預期輸出:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 65424m 63% xxxx xxxx cn-beijing.192.168.2.94 7040m 7% xxxx xxxx
由預期輸出得到,壓測中測試機的平均CPU資源使用率約為
63%
。等待wrk運行結束,擷取wrk列印的壓測結果。
壓測結果請參見實驗結果總覽。
關於在離線混部功能的更多資訊,請參見:
常見問題
在使用wrk壓測中,測試結果提示“Socket errors: connect 54,”怎麼辦?
問題描述
在使用wrk壓測中,測試結果提示Socket errors: connect 54,
。測試中的wrk Client和Nginx Server建立串連失敗,測試結果失效。
問題原因
該錯誤通常是因為用戶端的串連數受限,導致用戶端建立串連失敗。
解決辦法
為了避免該錯誤,請在壓測機上檢查系統的TCP串連配置,並嘗試啟用TCP串連重用。
登入壓測機,執行如下命令,查看是否開通TCP串連重用。
sudo sysctl -n net.ipv4.tcp_tw_reuse
命令輸出為
0
或2
,說明系統未完全開啟TCP串連重用。執行如下命令,啟用TCP串連重用。
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
使用wrk工具再次發起壓測請求。
檢查測試結果不再包含
Socket errors: connect 54, ...
的報錯提示,說明測試結果有效。
操作步驟中使用的指令僅在壓測機上執行,測試機無需配置。測試完成後,請通過sysctl -w net.ipv4.tcp_tw_reuse
恢複原始配置,避免不必要的影響。