Linux网卡丢包与TCP重传排查:ip -s link、ss -ti与ethtool实战

    发布时间:2026-09-18 12:32 更新时间:2026-09-18 12:32 阅读量:0

    服务器上遇到网络问题,最典型的表现是:ping 同一台机器延迟忽高忽低,或者从这台服务器下载文件速度上不去,而 CPU、内存看起来都不忙。很多人第一反应是"网络不好",但"网络不好"是个筐,物理链路、驱动队列、内核协议栈、对端拥塞,任何一环出问题都能表现为丢包和重传。这篇就按从底层到上层的顺序,把 ip -s link、ethtool、ss -ti 这几个工具用起来,把问题定位到具体某一层。

    先看接口统计:错包、丢包、溢出分别说明什么

    第一步永远是看网卡自己的计数器。ip -s link 会打印每个接口的收发统计,其中 errors、dropped、overrun、carrier 这几个字段含义差别很大,不能混着看。

    ip -s link show eth0

    输出里 RX 段和 TX 段各有一组数字。判断时抓重点:RX errors 持续增长,通常指向物理层或驱动层问题,比如网线接触不良、光模块收光异常、双工不匹配;RX dropped 增长而 errors 不涨,一般不是链路坏,而是内核处理不过来,比如 ring buffer 太小、软中断集中在单个 CPU;overrun 则明确表示网卡收到包后没来得及交给驱动,多半也是 ring buffer 或中断处理的问题。

    如果 counter 一直不涨,但业务侧就是慢,那问题很可能不在本机网卡,而在 TCP 层或对端。这时要换工具往下看。

    用 ethtool 看链路状态、ring buffer 与网卡错误计数

    ethtool 是排查物理层和驱动层绕不开的工具。先确认链路本身是否正常:

    ethtool eth0
    ethtool -S eth0 | grep -Ei 'err|drop|miss|discard'

    第一条会显示 Speed、Duplex、Link detected。如果 Speed 只有 100Mb/s 而交换机是千兆口,或者 Duplex 显示 Half,多半是网线质量差或两端协商不一致,这种情况下载速度会明显偏低,链路本身未必报错。第二条读取网卡驱动暴露的详细计数,不同厂商命名差异很大,常见的字段有 rx_errors、rx_missed_errors、rx_no_buffer_count、tx_carrier_errors 等,字段名和含义以具体网卡驱动与官方文档为准。如果 rx_missed_errors 或 rx_no_buffer_count 在持续增长,基本可以锁定为收包队列不足。

    确认是队列问题后,可以查看并适当调大 ring buffer:

    ethtool -g eth0
    ethtool -G eth0 rx 4096 tx 4096

    第一条显示当前 RX/TX ring 的 current 与 maximum 值,第二条把队列调到指定大小,具体上限受网卡和驱动限制,超过 maximum 会报错。调大 ring buffer 能缓解突发流量导致的丢包,但它只是缓冲,不是根治手段;如果流量长期超过网卡或 CPU 的处理能力,还是要从分流、多队列、RSS 或升级硬件入手。

    用 ss -ti 看 TCP 重传与拥塞窗口

    如果接口计数器干净,ethtool 也没看到错误,那就要怀疑 TCP 重传。ss 的 -i 选项能打印每个 socket 的 TCP 内部状态,重传次数、rtt、拥塞窗口都在里面。

    ss -tin state established '( sport = :80 or sport = :443 )'
    ss -tin dst 203.0.113.10

    重点看几个字段:retrans 是当前 socket 的重传次数,短时间内反复出现较大值说明链路或对端在丢包;rtt 和 rttvar 反映往返时延及其波动,rtt 抖动大往往对应无线、跨运营商或拥塞链路;cwnd 是拥塞窗口,如果 cwnd 长时间上不去、配合 retrans 增长,说明 TCP 正在被丢包压着降速。注意 retrans 是累计值,判断趋势要看多次采样,而不是单次读数。

    把三层信息串起来判断:接口 RX errors 涨,往网线、光模块、双工方向查;RX dropped / overrun 涨,往 ring buffer、软中断、多队列方向查;接口干净但 ss 里 retrans 高、rtt 抖动大,则更可能是中间链路拥塞或对端问题。ping 的延迟抖动本身不区分原因,它只是提示"有东西在丢",真正定位还得靠上面这些计数器。

    排查完记得留个基线:把 ip -s link、ethtool -S 的输出定期采集下来,出问题时对比增量,比事后猜要可靠得多。

    继续阅读

    📑 📅
    journald 日志占满 /var/log:持久化与容量限制配置 2026-09-18
    Docker容器时区不对?TZ变量与localtime挂载的正确用法 2026-09-17
    服务器 swap 使用率飙升:正常换页还是内存真不够用 2026-09-17
    系统盘满了却找不到大文件:被删除但仍被进程占用的句柄排查与恢复空间 2026-09-17
    MySQL表空间与ibdata1膨胀处理:独立表空间、碎片整理与磁盘回收 2026-09-17
    Nginx 静态资源 404 与权限被拒排查:root、alias、try_files 的坑 2026-09-18
    systemd-journald 日志转发远程 syslog:rsyslog 对接与丢日志排查 2026-09-19
    MySQL连接被拒绝Connection refused逐层排查思路 2026-09-19
    Docker容器DNS解析异常排查:resolv.conf与自定义网络 2026-09-19
    PHP-FPM 进程数怎么调:pm.max_children 与内存估算 2026-09-19