全部產品
Search
文件中心

Alibaba Cloud Linux:關閉IPVS的estimation功能解決網路抖動問題

更新時間:Jul 17, 2024

使用Linux的IPVS模組時,IPVS會預設啟用其estimation功能,當伺服器規格較大且Service數量多時(例如,容器Kubernetes大規模叢集情境),該功能可能導致服務端的網路請求出現幾十到上百毫秒的延時或引起網路抖動。Alibaba Cloud Linux鏡像提供了關閉IPVS的estimation功能的能力,若您不依賴estimation統計資料包數、串連數等資訊,建議關閉IPVS的estimation功能,以消除由於統計帶來的額外開銷和抖動問題。

背景資訊

什麼是IPVS?

IPVS(IP Virtual Server)是Linux核心的一個組件,可將基於TCP和UDP服務的請求定向到真實伺服器,實現核心態四層負載平衡。在Kubernetes中,IPVS可作為其組件Kube-proxy的一種代理模式,將Service的請求轉寄到後端Pod,來實現Kubernetes服務的負載平衡。特別是在大規模叢集中,對於服務間的流量分發和負載平衡需求,IPVS可以提供更好的響應速度和資源使用率。

說明

Kube-proxy是Kubernetes叢集中的一個重要組件,負責為服務實現網路代理程式和負載平衡功能。

什麼是IPVS的estimation功能?為什麼estimation功能會導致網路請求延時或抖動?

IPVS中內建了定時器estimation_timer,用於統計每個時間片中每個服務收發的資料包、串連數量等資訊,該定時器預設開啟。

IPVS的estimation功能導致網路請求延時或抖動的原因主要有以下:

  • 一方面,隨著Service數量的增加,需要統計的計算量會增加且呈現線性。同時,核心為了降低計算資源和儲存資源開銷,將統計資料按照CPU維度來存放,CPU數量越多,每次統計需要遍曆的CPU數量就越多。因此,當服務數量多且CPU數量也很多時,每次定時器estimation_timer統計的開銷會顯著增加。

    image
  • 另一方面,Linux中定時器執行的許可權較高,在執行定時器任務時,其他任務無法得到執行,導致最後收包的延遲。體現在應用中,就會表現出伺服器的請求會出現幾十甚至上百毫秒的時延,此時ping該伺服器會產生抖動。

功能限制

僅以下核心版本的Alibaba Cloud Linux鏡像支援關閉IPVS的estimation功能:

  • Alibaba Cloud Linux 2:4.19.91-22及以上核心版本。

  • Alibaba Cloud Linux 3:5.10.134-14及以上核心版本。

關閉estimation功能解決網路抖動問題

重要

關閉IPVS的estimation功能會導致IPVS的服務統計失效,一旦關閉後,將看不到相應的服務的串連數、收到資料包等資訊的變化,即通過類似sudo ipvsadm -Ln --stats命令不會看到相應統計資訊的變化,直到重新開啟該功能為止。因此,在關閉前,請評估關閉estimation功能對相應業務的影響。

  1. 遠程登入ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 執行以下命令在ECS上關閉estimation功能。

    1. 執行以下命令開啟sysctl設定檔/etc/sysctl.conf

      sudo vim /etc/sysctl.conf
    2. 在檔案末尾添加以下行,儲存並關閉檔案。

      net.ipv4.vs.run_estimation = 0
    3. 執行以下命令使配置更改生效。

      sudo sysctl -p
    4. 對於容器情境,您還需要執行相關操作來徹底關閉estimation功能。

      • 情況1:每次重新載入IPVS模組後,均需再次執行sysctl -p命令使配置生效。建議您通過modprobe設定檔,實現系統每次重新載入IPVS模組時,自動執行sysctl -p命令,使sysctl.conf配置生效以關閉estimation功能。

        1. 建立一個modprobe設定檔(例如ipvs.conf)。

          sudo vim /etc/modprobe.d/ipvs.conf
        2. 在檔案中添加以下內容後,儲存並退出。

          options ip_vs run_estimation=0 post-up sysctl -p
      • 情況2:如果您還在容器裡(例如Network Namespace上)配置了IPVS規則,則還需要在每個容器上關閉estimation功能。

        說明

        對於阿里雲Container ServiceACK,預設的Kube-proxy代理模式為IPVS,規則配置在HOST側,無需在每個容器上關閉estimation功能。如果您使用的是阿里雲Container ServiceACK,請忽略該操作。

    5. 驗證estimation功能是否關閉。

      • 方式一:運行命令sudo sysctl net.ipv4.vs.run_estimation,若返回net.ipv4.vs.run_estimation = 0,則表示estimation功能已關閉。

      • 方式二:運行sudo ipvsadm -Ln --stats命令,若統計值不再變化,表示estimation功能已關閉。

        重要

        如果您沒有安裝ipvsadm工具,可執行sudo yum install ipvsadm命令進行安裝。

相關操作

驗證網路抖動/延時是否解決

  • 方式一:ping雲端服務器的IP地址或網域名稱。如果延遲值保持相對穩定,並且介於合理的範圍內,則可以確定網路延遲問題已經解決。

  • 方式二:使用網路效能測試工具進行全面的延遲和抖動測試,觀察是否還有長尾延遲(tail latency)。如果長尾延遲的頻率和幅度顯著減少,或者不再出現,那麼可以認為網路抖動/延時問題已經解決。

    說明

    如果您通過關閉estimation功能發現仍然存在網路抖動/延時問題,可通過Container Service平台提供的網路診斷功能進行診斷。具體操作,請參考網路診斷

再次開啟estimation功能

如果您希望再次開啟estimation功能,可將sysctl和modprobe設定檔中的run_estimation相關的值改為1