发布时间: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 是排查物理层和驱动层绕不开的工具。先确认链路本身是否正常:
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 或升级硬件入手。
如果接口计数器干净,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 |