Linux 服务器网络慢的排查思路

Linux 服务器网络慢的排查思路

Linux 服务器出现“网络慢”是一个非常典型的运维场景,但“慢”本身是一个高度模糊的症状。它可能涉及从物理层到应用层的任意一环,也可能是多因素叠加的结果。 最有效的排查方式不是一上来就改内核参数、换拥塞算法或抓包,而是先把“慢”的边界和表现形式切割清楚,再沿着网络栈从近到远、从底层到上层逐层验证。

以下是生产环境中真正高频使用的、结构化的排查思路框架,按优先级与收益排序组织。整个流程的核心思想是:用最少的步骤排除最大面积的可能性

一、先明确“慢”的具体画像(决定后续方向的 30 秒)

在动手之前,必须先把问题切割成以下维度,否则后续所有操作都可能是盲人摸象:

  1. 慢的范围
    • 全网慢,还是只有特定域名/端口/协议慢?
    • 内网正常、外网慢,还是内外都慢?
    • 只有出方向慢,还是双向都慢?
  2. 慢的形态
    • 持续性慢(稳定高延迟)
    • 间歇性卡顿(周期性抖动或偶发丢包)
    • 前期正常,后期越来越慢(连接积累型)
    • 建立连接慢,但一旦连上就快(握手慢型)
  3. 慢的体感
    • ssh 敲字有明显回显延迟
    • 网页打开卡(TTFB 长)
    • 大文件下载速度远低于预期带宽
    • 视频/实时应用频繁缓冲
  4. 时间与触发条件
    • 特定时间段(凌晨、业务高峰)
    • 特定操作后(大文件传输后、大量短连接后)
    • 重启服务器/网络服务后是否恢复

一句话总结: 先花 30 秒把“慢”描述成 3–4 个具体可验证的现象,比直接跳到 mtr 或 tcpdump 更高效十倍。

二、分层排查框架(由近及远)

层 1:本地环回与本机网络栈(排除最基础问题)

先确认服务器自身的 TCP/IP 协议栈是否健康。

关键验证点:

  • 本地环回(127.0.0.1)是否延迟异常
  • 本机外网 IP 是否能正常 ping 通自己
  • lo 接口是否存在异常丢包或错误

如果这一层就有问题,通常是内核网络模块加载异常、网卡驱动崩溃、或 iptables/nftables 规则把本地流量误杀。

层 2:二层与三层连通性(网关与局域网)

重点验证:

  • 默认网关是否可达且延迟稳定
  • 同网段其他机器是否正常
  • ARP 表是否异常(大量 incomplete 条目)

这一层出问题通常是交换机端口协商错误、VLAN 配置错、网线质量差、网卡 auto-negotiation 失败导致只跑到 100Mbps。

层 3:路由与路径质量(最关键的一层)

核心工具:mtr(实时路径 + 丢包统计)

优先级最高的观察点:

  • 从第几跳开始出现丢包或延迟陡增
  • 是否存在明显的不稳定跳点(抖动 ±50ms 以上)
  • 是否在某个运营商骨干节点持续高延迟

常见结论:

  • 前 2–3 跳丢包/抖动 → 本机房出口或本地运营商问题
  • 中间骨干节点抖动 → 跨运营商互联质量差
  • 目标前 1–2 跳才出现问题 → 目标侧网络或防火墙策略

层 4:DNS 解析性能(最容易被忽略的高频瓶颈)

DNS 慢是“网页打开卡但 ping 正常”最常见的原因。

关键观察:

  • 到权威 DNS 的单次解析耗时(dig +short @8.8.8.8)
  • 本地 /etc/resolv.conf 是否被污染(127.0.0.53、恶意 DNS)
  • 是否存在大量 CNAME 嵌套或 NS 记录异常

解决方向:

  • 直接使用 1.1.1.1 / 8.8.8.8 / 114.114.114.114
  • 启用 systemd-resolved 的缓存功能
  • 必要时在本地跑 dnsmasq 或 unbound 做转发缓存

层 5:传输层与 TCP 行为(决定连接质量)

重点观察指标:

  • TCP 重传率(retrans)
  • 拥塞窗口是否被严重缩减(cwnd 持续很小)
  • RTT 与 RTTvar 的抖动幅度
  • 是否存在大量 sacked / lost / retransmitted 段

常见模式:

  • retrans 持续增加 + cwnd 被缩到很小 → 路径丢包严重
  • window 被缩减到几 KB → 对端接收缓冲区不足或丢包导致
  • SYN 重传多次 → 防火墙/负载均衡丢包、SYN Cookie 压力

层 6:网卡与中断层(高并发场景常见)

关键观察:

  • 网卡是否有 rx/tx error、dropped、overruns、collisions
  • 是否存在单核 ksoftirqd 持续高占用
  • 中断是否集中在少数 CPU 核心(irqbalance 是否关闭)

优化方向:

  • 开启 RPS/RFS/XPS 分担网络中断
  • 调整网卡队列数与中断合并参数
  • 必要时关闭 TSO/GSO/GRO(某些场景反而更稳定)

层 7:内核网络参数与拥塞控制(最后考虑)

在确认前面所有层都没有明显问题后,才进入这一层。

常见调整方向(按优先级):

  • 切换拥塞控制算法(bbr > cubic > hybla > westwood)
  • 增大 socket 缓冲区(tcp_rmem / tcp_wmem)
  • 调整 syn backlog 与 somaxconn
  • 启用 fq pacing 与 fq 调度

重要提醒: 没有 mtr、ethtool -S、ss -i、tcpdump 的明确证据支持,盲目改 sysctl 通常收益很低,甚至适得其反。

三、快速定位口诀(生产中最常默念的几句)

  1. 先 mtr 看路径质量和丢包点
  2. 再 ethtool -S 看网卡有没有硬错误
  3. 然后 ss -i 看 TCP 窗口和重传
  4. 接着 dig / nslookup 测 DNS 耗时
  5. 最后 tcpdump 抓握手和窗口变化

只要这五步做完,90% 以上的网络慢问题都能定位到具体层级。

四、总结:高效排查的思维模型

把“网络慢”拆解成以下五个独立可验证的子问题,按顺序排除:

  1. 本机网络栈是否健康?
  2. 到网关的二三层是否通畅?
  3. 到目标的完整路径是否存在明显丢包/抖动?
  4. DNS 解析耗时是否异常?
  5. TCP 层是否存在重传、窗口缩减、拥塞控制问题?

每一步确认无误后再进入下一步,能避免 80% 的无效操作。

如果你当前遇到网络慢的问题,可以按以下顺序提供信息,我可以帮你快速缩小范围:

  • mtr 到目标地址的前 10–15 跳结果
  • ethtool -S 的 rx/tx error 与 drop 计数
  • ss -s 的连接状态分布(ESTAB、TIME_WAIT 等数量)
  • curl -w 的时间分解(time_connect / time_starttransfer / time_total)

这样能比单纯描述“服务器网络很慢”快得多地定位到根因。

Telegram
Telegram@IDCSELL