云服务器网络访问丢包

最近更新时间: 2024-10-17 17:10:00

本文主要介绍可能引起云服务器网络访问丢包问题的主要原因,及对应排查、解决方法。

可能原因

引起云服务器网络访问丢包问题的可能原因如下:

触发限速导致 TCP 丢包

触发限速导致 UDP 丢包

触发软中断丢包

UDP 发送缓冲区满

UDP 接收缓冲区满

TCP 全连接队列满

TCP 请求溢出

连接数达到上限

iptables policy 设置相关规则

前提条件

在进行问题定位及处理前需登录实例,详情请参见 登录 Linux 实例登录 Windows 实例

故障处理

触发限速导致 TCP 丢包

云服务器实例具备多种规格,且不同规格有不同的网络性能。当实例的带宽或包量超过实例规格对应的标准时,会触发平台侧的限速,导致丢包。排查及处理步骤如下:

  1. 查看实例的带宽及包量。

    Linux 实例可执行 sar -n DEV 2 命令查看带宽及包量。其中,rxpck/s 和 txpck/s 指标是收发包量,rxkB/s 和 txkB/s 指标是收发带宽。

  2. 使用获取的带宽及包量数据对比实例规格,查看是否达到实例规格性能瓶颈。

    • 是,则需升级实例规格或调整业务量。

    • 否,若未达到实例规格性能瓶颈,则可进一步定位处理。

触发限速导致 UDP 丢包

参考 触发限速导致 TCP 丢包 步骤,判断是否由实例规格性能瓶颈引起丢包。

  • 是,则需升级实例规格或调整业务量。

  • 若未达到实例规格性能瓶颈,则可能是由平台对 DNS 请求额外的频率限制引起。在实例整体带宽或包量达到实例规格的性能瓶颈时,可能会触发 DNS 请求限速而出现 UDP 丢包。可 进一步定位处理。

触发软中断丢包

当操作系统监测到 /proc/net/softnet_stat 的第二列计数值在增长时,则会判断为“软中断丢包”。当您的实例触发了软中断丢包时,可通过以下步骤进行排查及处理:查看是否开启 RPS:

  • 开启,则内核参数 net.core.netdev_max_backlog 偏小时会引发丢包,需调大。

  • 未开启,则查看是否为 CPU 单核软中断高,导致未能及时收发数据。若是,您可以:

    • 选择开启 RPS,使软中断分配更为均衡。

    • 检查业务程序是否会引发软中断分配不均匀。

UDP 发送缓冲区满

若您的实例因 UDP 缓冲区不足而导致丢包时,可通过以下步骤进行排查处理:

  1. 使用 ss -nump 命令查看 UDP 发送缓冲区是否已满。

  2. 若是,则调大内核参数 net.core.wmem_max 和 net.core.wmem_default,并重启 UDP 程序以生效。

  3. 若仍存在丢包问题,则可通过 ss -nump 命令查看发送缓冲区并没有按预期的增大。此时需要检查业务代码是否通过 setsockopt 设置了 SO_SNDBUF。若是,则请修改代码增大 SO_SNDBUF。

UDP 接收缓冲区满

若您的实例因 UDP 缓冲区不足而导致丢包时,可通过以下步骤进行处理:

  1. 使用 ss -nump 命令查看 UDP 接收缓冲区是否已满。

  2. 若是,则调大内核参数 net.core.rmem_max 和 net.core.rmem_default,并重启 UDP 程序以生效。

  3. 若仍存在丢包问题,则可通过 ss -nump 命令查看接收缓冲区并没有按预期的增大。此时需要检查业务代码是否通过 setsockopt 设置了 SO_RCVBUF。若是,则请修改代码增大 SO_RCVBUF。

TCP 全连接队列满

TCP 全连接队列的长度取 net.core.somaxconn 及业务进程调用 listen 时传入的 backlog 参数,两者中的较小值。若您的实例发生 TCP 全连接队列满导致丢包时,可通过以下步骤进行处理:

调大内核参数 net.core.somaxconn。

检查业务进程是否传入了 backlog 参数。若是,则相应调大。

TCP 请求溢出

在 TCP 接收数据时,若 socket 被 user 锁住,则会将数据送到 backlog 队列。若此过程若失败,则会引起 TCP 请求溢出导致丢包。通常情况下,假设业务程序性能正常,则可参考以下方式从系统层面排查及处理问题:

检查业务程序是否通过 setsockopt 自行设置了 buffer 大小:

  • 若已设置,且该值不够大,可以修改业务程序指定一个更大的值,或不再通过 setsockopt 指定大小。

    说明

    setsockopt 的取值受内核参数 net.core.rmem_max 和 net.core.wmem_max 限制。调整业务程序的同时,可以同步调整 net.core.rmem_max 和 net.core.wmem_max。调整后请重启业务程序使配置生效。

  • 若未设置,则可以调大 net.ipv4.tcp_mem、net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 内核参数来调整 TCP socket 的水位。

连接数达到上限

云服务器实例具备多种规格,且不同规格有不同的连接数性能指标。当实例的连接数超过实例规格对应的标准时,会触发平台的限速,导致丢包。处理步骤如下:

说明

连接数指宿主机上保存的云服务器实例的会话数,包含 TCP、UDP 和 ICMP。该数值大于在云服务器实例上通过 ss 或 netstat 命令获取的网络连接数。

查看您实例的连接数,并对比 实力规格,查看是否达到实例规格性能瓶颈。

  • 是,则需升级实例规格或调整业务量。

  • 否,若未达到实例规格性能瓶颈,则可进一步定位处理。

iptables policy 设置相关规则

在云服务器 iptables 未设置相关规则的情况下,可能是 iptables policy 相关规则设置导致到达云服务器的包都被丢弃。处理步骤如下:

  1. 执行以下命令,查看 iptables policy 规则。
iptables -L | grep policy 

iptables policy 规则默认为 ACCEPT。若 INPUT 链 policy 非 ACCEPT,则会导致所有到服务器的包都被丢弃。例如,若返回如下结果,表示进入云服务器的包都会被 drop。

Chain INPUT (policy DROP)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
  1. 执行如下命令,按需调整 -P 后的值。
iptables -P INPUT ACCEPT 

调整后,可再次执行“iptables policy 设置相关规则”的步骤1命令查看,应返回如下结果:

Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)