文档

关闭IPVS的estimation功能解决网络抖动问题

更新时间:

使用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功能。

        说明

        对于阿里云容器服务ACK,默认的Kube-proxy代理模式为IPVS,规则配置在HOST侧,无需在每个容器上关闭estimation功能。如果您使用的是阿里云容器服务ACK,请忽略该操作。

    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功能发现仍然存在网络抖动/延时问题,可通过容器服务平台提供的网络诊断功能进行诊断。具体操作,请参考网络诊断

再次开启estimation功能

如果您希望再次打开estimation功能,可将sysctl和modprobe配置文件中的run_estimation相关的值改为1

  • 本页导读 (1)