服务器随机丢包但 ping 延迟正常的 perf + bpftrace 抓包定位

发布时间 - 2026-01-25 00:00:00    点击率:
ping延迟正常但业务连接频繁超时或重传,因ping走独立ICMP路径,而TCP业务丢包可能发生在网卡驱动、软中断队列、GRO合并失败、XDP/tc策略等底层环节,需用eBPF和内核统计综合定位。

为什么 ping 延迟正常但业务连接频繁超时或重传

因为 ping 只发 ICMP Echo Request,走的是内核独立的 ICMP 处理路径,不经过 TCP/IP 栈的连接管理、队列调度、拥塞控制等环节。真实业务(如 HTTP、gRPC)用的是 TCP,丢包可能发生在:网卡驱动收包中断丢失、软中断队列溢出、sk_buff 分配失败、socket 接收缓冲区满、甚至 eBPF 程序中误 drop。此时 ping 依然能通,但 tcpdump 在应用侧抓不到包,说明丢包发生在更底层。

perf record -e 'net:netif_receive_skb' 抓不到丢包点怎么办

这个 tracepoint 只在数据帧成功进入协议栈第一入口时触发,如果丢包发生在网卡 DMA 后但尚未调用 netif_receive_skb()(比如 NAPI poll 被延迟、RX ring 溢出、驱动丢包),它就完全沉默。必须上到更底层:

  • perf record -e 'skb:kfree_skb' 观察是否大量 skb 在极短时间内被释放,且 comm 字段为 ksoftirqd 或网卡驱动名(如 ixgbe),说明软中断处理不过来
  • 检查 /proc/net/snmpUdp: 行的 noportinerrors,或 Tcp: 行的 EstabResetsAttemptFails —— 这些是内核统计的真实丢包信号
  • 确认网卡是否启用了 LRO/GRO:ethtool -k eth0 | grep gro;GRO 合并失败时可能静默丢弃分片,且不记入常规计数器

bpftrace 跟踪 sk_buff 生命周期的关键位置

不能只盯 netif_receive_skb,要串联从 DMA 到 socket 的完整链路。以下 bpftrace one-liner 可快速定位异常释放点:

bpftrace -e '
kprobe:__kfree_skb {
  @kfree_reason[ksym(func)] = count();
}
kretprobe:dev_gro_receive /retval == NULL/ {
  @gro_fail[ustack] = count();
}
tracepoint:skb:kfree_skb /args->reason == 12/ {
  printf("DROPPED in %s (reason=12=SKB_DROP_REASON_PKT_TOO_SMALL)\n", ksym(args->func));
}'

注意:reason == 12 对应 SKB_DROP_REASON_PKT_TOO_SMALL,常见于 GRO 合并后校验失败;dev_gro_receive 返回 NULL 表示 GRO 流水线拒绝该包,往往因 IP ID 不连续或 TCP 选项不一致 —— 这类丢包不会进 tcpdump,但会显著影响长连接吞吐。

确认是否是 XDP 层或

tc ingress 丢包

如果服务器部署了 Cilium、Calico 或自定义 tc eBPF 策略,丢包可能发生在比 netif_receive_skb 更早的位置。检查:

  • tc filter show dev eth0 ingress —— 是否有 bpf 类型 filter 且 action 是 drop
  • ip link show eth0 查看是否有 xdp 标记;再运行 bpftool net show 确认 XDP 程序挂载状态
  • bpftrace -e 'kprobe:generic_xdp_tx { @xdp_drop = count(); }' 配合 xdp:xdp_exception tracepoint,判断是否触发了 XDP 异常路径

这类丢包完全绕过内核协议栈,netstat -s/proc/net/snmp 都不会体现,只能靠 eBPF 实时观测或驱动日志(dmesg | grep -i xdp)。


#   # ai  # 网卡驱动  # 为什么  # echo  # NULL  # count  # Filter  # http  # udp  # tcpdump  # 发生在  # 的是  # 这类  # 时间内  # 自定义  # 只在  # 它就  # 上到  # 更早 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速启动建站代理加盟业务?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  用v-html解决Vue.js渲染中html标签不被解析的问题  大型企业网站制作流程,做网站需要注册公司吗?  lovemo网页版地址 lovemo官网手机登录  如何用PHP快速搭建CMS系统?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  js实现点击每个li节点,都弹出其文本值及修改  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  中国移动官方网站首页入口 中国移动官网网页登录  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  简历没回改:利用AI润色让你的文字更专业  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  详解Android中Activity的四大启动模式实验简述  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在阿里云虚拟服务器快速搭建网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在阿里云域名上完成建站全流程?  如何在阿里云ECS服务器部署织梦CMS网站?  如何用虚拟主机快速搭建网站?详细步骤解析  实例解析angularjs的filter过滤器  canvas 画布在主流浏览器中的尺寸限制详细介绍  微信小程序 闭包写法详细介绍  如何快速完成中国万网建站详细流程?  如何在腾讯云服务器快速搭建个人网站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Bootstrap整体框架之JavaScript插件架构  Laravel如何配置和使用缓存?(Redis代码示例)  如何在云虚拟主机上快速搭建个人网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Android GridView 滑动条设置一直显示状态(推荐)  昵图网官方站入口 昵图网素材图库官网入口  进行网站优化必须要坚持的四大原则  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么使用artisan命令缓存配置和视图  JavaScript常见的五种数组去重的方式  Laravel如何使用withoutEvents方法临时禁用模型事件  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  php json中文编码为null的解决办法  Thinkphp 中 distinct 的用法解析  如何快速查询网站的真实建站时间?  个人摄影网站制作流程,摄影爱好者都去什么网站?