關(guān)閉IPVS的estimation功能解決網(wǎng)絡(luò)抖動問題
使用Linux的IPVS模塊時,IPVS會默認(rèn)啟用其estimation功能,當(dāng)服務(wù)器規(guī)格較大且Service數(shù)量多時(例如,容器Kubernetes大規(guī)模集群場景),該功能可能導(dǎo)致服務(wù)端的網(wǎng)絡(luò)請求出現(xiàn)幾十到上百毫秒的延時或引起網(wǎng)絡(luò)抖動。Alibaba Cloud Linux鏡像提供了關(guān)閉IPVS的estimation功能的能力,若您不依賴estimation統(tǒng)計數(shù)據(jù)包數(shù)、連接數(shù)等信息,建議關(guān)閉IPVS的estimation功能,以消除由于統(tǒng)計帶來的額外開銷和抖動問題。
背景信息
IPVS(IP Virtual Server)是Linux內(nèi)核的一個組件,可將基于TCP和UDP服務(wù)的請求定向到真實服務(wù)器,實現(xiàn)內(nèi)核態(tài)四層負(fù)載均衡。在Kubernetes中,IPVS可作為其組件Kube-proxy的一種代理模式,將Service的請求轉(zhuǎn)發(fā)到后端Pod,來實現(xiàn)Kubernetes服務(wù)的負(fù)載均衡。特別是在大規(guī)模集群中,對于服務(wù)間的流量分發(fā)和負(fù)載均衡需求,IPVS可以提供更好的響應(yīng)速度和資源利用率。
Kube-proxy是Kubernetes集群中的一個重要組件,負(fù)責(zé)為服務(wù)實現(xiàn)網(wǎng)絡(luò)代理和負(fù)載均衡功能。
IPVS中內(nèi)置了定時器estimation_timer,用于統(tǒng)計每個時間片中每個服務(wù)收發(fā)的數(shù)據(jù)包、連接數(shù)量等信息,該定時器默認(rèn)開啟。
IPVS的estimation功能導(dǎo)致網(wǎng)絡(luò)請求延時或抖動的原因主要有以下:
一方面,隨著Service數(shù)量的增加,需要統(tǒng)計的計算量會增加且呈現(xiàn)線性。同時,內(nèi)核為了降低計算資源和存儲資源開銷,將統(tǒng)計數(shù)據(jù)按照CPU維度來存放,CPU數(shù)量越多,每次統(tǒng)計需要遍歷的CPU數(shù)量就越多。因此,當(dāng)服務(wù)數(shù)量多且CPU數(shù)量也很多時,每次定時器estimation_timer統(tǒng)計的開銷會顯著增加。
另一方面,Linux中定時器執(zhí)行的權(quán)限較高,在執(zhí)行定時器任務(wù)時,其他任務(wù)無法得到執(zhí)行,導(dǎo)致最后收包的延遲。體現(xiàn)在應(yīng)用中,就會表現(xiàn)出服務(wù)器的請求會出現(xiàn)幾十甚至上百毫秒的時延,此時
ping
該服務(wù)器會產(chǎn)生抖動。
功能限制
僅以下內(nèi)核版本的Alibaba Cloud Linux鏡像支持關(guān)閉IPVS的estimation功能:
Alibaba Cloud Linux 2:
4.19.91-22
及以上內(nèi)核版本。Alibaba Cloud Linux 3:
5.10.134-14
及以上內(nèi)核版本。
關(guān)閉estimation功能解決網(wǎng)絡(luò)抖動問題
關(guān)閉IPVS的estimation功能會導(dǎo)致IPVS的服務(wù)統(tǒng)計失效,一旦關(guān)閉后,將看不到相應(yīng)的服務(wù)的連接數(shù)、收到數(shù)據(jù)包等信息的變化,即通過類似sudo ipvsadm -Ln --stats
命令不會看到相應(yīng)統(tǒng)計信息的變化,直到重新開啟該功能為止。因此,在關(guān)閉前,請評估關(guān)閉estimation功能對相應(yīng)業(yè)務(wù)的影響。
遠(yuǎn)程登錄ECS實例。
具體操作,請參見通過密碼或密鑰認(rèn)證登錄Linux實例。
執(zhí)行以下命令在ECS上關(guān)閉estimation功能。
執(zhí)行以下命令打開sysctl配置文件
/etc/sysctl.conf
。sudo vim /etc/sysctl.conf
在文件末尾添加以下行,保存并關(guān)閉文件。
net.ipv4.vs.run_estimation = 0
執(zhí)行以下命令使配置更改生效。
sudo sysctl -p
對于容器場景,您還需要執(zhí)行相關(guān)操作來徹底關(guān)閉estimation功能。
情況1:每次重新加載IPVS模塊后,均需再次執(zhí)行
sysctl -p
命令使配置生效。建議您通過modprobe配置文件,實現(xiàn)系統(tǒng)每次重新加載IPVS模塊時,自動執(zhí)行sysctl -p
命令,使sysctl.conf
配置生效以關(guān)閉estimation功能。創(chuàng)建一個modprobe配置文件(例如
ipvs.conf
)。sudo vim /etc/modprobe.d/ipvs.conf
在文件中添加以下內(nèi)容后,保存并退出。
options ip_vs run_estimation=0 post-up sysctl -p
情況2:如果您還在容器里(例如Network Namespace上)配置了IPVS規(guī)則,則還需要在每個容器上關(guān)閉estimation功能。
說明對于阿里云容器服務(wù)ACK,默認(rèn)的Kube-proxy代理模式為IPVS,規(guī)則配置在HOST側(cè),無需在每個容器上關(guān)閉estimation功能。如果您使用的是阿里云容器服務(wù)ACK,請忽略該操作。
驗證estimation功能是否關(guān)閉。
方式一:運行命令
sudo sysctl net.ipv4.vs.run_estimation
,若返回net.ipv4.vs.run_estimation = 0
,則表示estimation功能已關(guān)閉。方式二:運行
sudo ipvsadm -Ln --stats
命令,若統(tǒng)計值不再變化,表示estimation功能已關(guān)閉。重要如果您沒有安裝
ipvsadm
工具,可執(zhí)行sudo yum install ipvsadm
命令進(jìn)行安裝。
相關(guān)操作
驗證網(wǎng)絡(luò)抖動/延時是否解決
方式一:
ping
云服務(wù)器的IP地址或域名。如果延遲值保持相對穩(wěn)定,并且介于合理的范圍內(nèi),則可以確定網(wǎng)絡(luò)延遲問題已經(jīng)解決。方式二:使用網(wǎng)絡(luò)性能測試工具進(jìn)行全面的延遲和抖動測試,觀察是否還有長尾延遲(tail latency)。如果長尾延遲的頻率和幅度顯著減少,或者不再出現(xiàn),那么可以認(rèn)為網(wǎng)絡(luò)抖動/延時問題已經(jīng)解決。
說明如果您通過關(guān)閉estimation功能發(fā)現(xiàn)仍然存在網(wǎng)絡(luò)抖動/延時問題,可通過容器服務(wù)平臺提供的網(wǎng)絡(luò)診斷功能進(jìn)行診斷。具體操作,請參考網(wǎng)絡(luò)診斷。
再次開啟estimation功能
如果您希望再次打開estimation功能,可將sysctl和modprobe配置文件中的run_estimation
相關(guān)的值改為1
。