当前位置:首页>Linux>Linux网络丢包排查全指南:从原理到实战

Linux网络丢包排查全指南:从原理到实战

  • 2026-09-08 15:50:01
Linux网络丢包排查全指南:从原理到实战

点击下方名片,设为星标!

一、丢包概述

    网络丢包是运维工作中最常见也最令人头疼的问题之一。当应用出现卡顿、延迟飙升、连接超时等现象时,背后往往隐藏着丢包的影子。理解丢包的本质,需要我们先从 Linux 网络收发包的核心流程说起。

二、收包流程

当网卡收到数据包时,Linux 内核经历以下处理流程:

关键步骤说明:

  1. Ring Buffer:网卡用环形缓冲区暂存数据包,CPU 通过 DMA 直接读取
  2. 硬中断:数据包到达触发硬件中断,通知 CPU 处理
  3. NAPI 机制:新 API 机制,收到包后关闭中断,轮询处理一批包后再开启,减少中断开销
  4. 软中断:ksoftirqd 内核线程处理协议栈(TCP/IP 解析、校验等)
  5. Socket 队列:处理完的包放入 Socket 接收队列,等待应用读取

三、发包流程

发送数据包是收包的逆过程:

关键步骤说明:

  1. Socket 发送队列:应用数据先进入内核 Socket 发送缓冲区
  2. TCP 分段:大包按 MSS 分段,支持 GSO(通用分段卸载)优化
  3. IP 封装:添加 IP 头部、计算校验和
  4. Ring Buffer:数据包描述符放入发送环形缓冲区
  5. DMA 传输:网卡通过 DMA 读取内存数据并发送

四、丢包场景分析

根据收发包流程,我们梳理常见丢包场景:

场景一:Ring Buffer 满(收包)

现象:网络流量突增时丢包

定位:

  • 1
  • 2
  • 3
  • 4
  • 5
# 查看网卡统计ethtool -S eth0 | grep -E "(rx_missed|rx_errors|rx_dropped)"# 查看 Ring Buffer 大小ethtool -g eth0

解决:

  • 1
  • 2
# 增大 Ring Bufferethtool -G eth0 rx 4096 tx 4096

场景二:软中断处理瓶颈

现象:CPU 某个核使用率 100%,网络延迟高

定位:

  • 1
  • 2
  • 3
  • 4
  • 5
# 查看软中断分布cat /proc/interrupts | grep eth0# 查看 ksoftirqd CPU 占用top -p $(pgrep ksoftirqd | tr'\n'',' | sed 's/,$//')

解决:

  • 1
  • 2
# 开启 RPS(Receive Packet Steering)echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

场景三:Conntrack 表满

现象:大量连接时出现 "nf_conntrack: table full" 报错

定位:

  • 1
  • 2
  • 3
# 查看 conntrack 使用情况cat /proc/net/nf_conntrack | wc -lcat /proc/sys/net/netfilter/nf_conntrack_max

解决:

  • 1
  • 2
# 增大 conntrack 表sysctl -w net.netfilter.nf_conntrack_max=1048576

场景四:Socket 缓冲区满

现象:应用处理慢导致丢包

定位:

  • 1
  • 2
  • 3
  • 4
  • 5
# 查看 Socket 统计ss -s# 查看丢包计数cat /proc/net/snmp | grep Tcpcat /proc/net/snmp | grep Udp

解决:

  • 1
  • 2
  • 3
# 增大 Socket 缓冲区sysctl -w net.core.rmem_max=16777216sysctl -w net.core.wmem_max=16777216

场景五:ARP 表溢出

现象:"neighbor table overflow" 报错

定位:

  • 1
  • 2
  • 3
# 查看 ARP 表cat /proc/net/arp | wc -lcat /proc/sys/net/ipv4/neigh/default/gc_thresh1

解决:

  • 1
  • 2
  • 3
  • 4
# 增大 ARP 表限制echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh1echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh2echo 8192 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

五、推荐工具

1. mtr(My Traceroute)

功能:结合 traceroute 和 ping,实时显示每一跳的丢包率和延迟

常用命令:

# 基础用法(实时刷新)

mtr www.example.com

# 生成报告模式(100次探测后停止)

mtr --report --report-cycles 100 www.example.com

# 指定 TCP 探测(默认ICMP可能被防火墙拦截)

mtr --tcp --port 443 www.example.com

# 显示 ASN(自治系统号)信息

mtr --aslookup www.example.com

优势:

  • 实时刷新,直观显示哪一跳出问题
  • 统计丢包率、延迟、抖动
  • 支持 TCP/UDP/ICMP 多种探测方式

2. ss + dropwatch

ss:替代 netstat,查看 Socket 状态

常用命令:

# 查看连接统计摘要

ss -s

# 查看所有 ESTABLISHED 的 TCP 连接

ss -t state established

# 查看指定端口的连接

ss -tan | grep :80

# 查看进程和连接对应关系

ss -tp

# 查看连接队列溢出情况(排查丢包)

ss -tan | grep -E "(Recv-Q|Send-Q)"

# 按连接数排序显示进程

ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

关键指标:

  • Recv-Q:接收队列积压(应用读取慢)
  • Send-Q:发送队列积压(网络阻塞或对端接收慢)

dropwatch:实时监控内核丢包位置,精确定位丢包原因。

常用命令:

# 基本监控(实时显示丢包)

sudo dropwatch -l kas

# 解释:

# -l kas:使用内核地址符号表,显示函数名而非地址

# 输出示例:

# drop at: tcp_v4_rcv+0x123 (0xffffffff12345678)

# 表示在 tcp_v4_rcv 函数处丢包

3、其他使用工具

总结

    网络丢包排查需要理解收发包流程,从网卡、中断、协议栈到应用层逐层定位。掌握 Ring Buffer、软中断、Conntrack 等关键机制,配合 mtr、ss 等工具,可以快速定位并解决大部分网络丢包问题。

===========  到此结束  ==========

//往期推荐//

Ansible 入门科普:从架构原理到网络设备自动化

Linux系统kswapd0进程CPU占用过高问题深度解析与解决方案

如果觉得本次分享对你有所帮助的话,希望点击“在看”给予鼓励,谢谢!

敬请关注公众号:运维来点料

最新文章

随机文章