讲师中心 微信公众号
AI工具推荐 视频效率加速

服务器随机丢包但 ping 延迟正常的 perf record + bpftrace 抓包分析

千辰君_8573

千辰君_8573

发布时间:2026-01-30 20:07:24

|

593人浏览过

|

来源于php中文网

原创

perf record 不能直接抓到丢包动作,需配合 skb:kfree_skb 等 tracepoint 定位丢包环节;bpftrace 可动态过滤丢包条件;ping 与业务包路径分离,RPS 不均是常见原因;perf 与 bpftrace 联动须时间对齐,避免错失瞬时丢包。

服务器随机丢包但 ping 延迟正常的 perf record + bpftrace 抓包分析

perf record 能抓到丢包时的内核路径吗

不能直接抓到“丢包”这个动作本身,因为丢包往往发生在没有完整 skb 构建、或被 dev_kfree_skb / kfree_skb 立即释放的路径上,perf record 默认采样的是有栈回溯的用户态或内核函数入口,而很多丢包点(比如 drop_monitor 未启用时的 consume_skb、netif_receive_skb_core 中的 early drop)不触发常规采样点。

真正有用的是配合 perf record -e 'skb:consume_skb' -e 'skb:kfree_skb' -e 'net:net_dev_queue' -e 'net:netif_receive_skb' 这类 tracepoint 事件,它们在 skb 生命周期关键节点打点,能定位到哪个环节释放了本该转发的包。

  • 必须用 root 权限运行,否则 tracepoint 不可见
  • skb:kfree_skb 的 location 字段能指出丢包位置,比如 net/ipv4/ip_input.c:230 表示 IP 层校验失败丢弃
  • 避免用 -g(调用图),它会大幅降低采样精度,丢包分析重在事件频次和上下文,不在深度栈

bpftrace 怎么定位随机丢包的触发条件

靠静态打点不够,得用 bpftrace 动态过滤——重点不是“看到丢包”,而是“在丢包前一刻,哪些字段异常”。比如对 skb:kfree_skb 加条件:只打印那些 dst_ip 是目标服务器、且 reason == SKB_DROP_REASON_NOT_SPECIFIED 或 SKB_DROP_REASON_IP_INHDR 的样本。

bpftrace -e '
tracepoint:skb:kfree_skb /args->reason == 17 || args->reason == 5/
{
  printf("DROP @ %s:%d, reason=%d, len=%d, proto=%d\n",
         str(args->location), args->location_line,
         args->reason, args->len, args->protocol);
}'

其中 reason == 17 是 SKB_DROP_REASON_IP_INHDR(IP 头错误),reason == 5 是 SKB_DROP_REASON_NOT_SPECIFIED(泛用型丢弃,常出现在驱动层)。注意:args->location 是地址,需用 str() 解析为符号名,否则输出一串数字。

MoltOverflow
MoltOverflow

Moltbots问答社区 - 提问编程问题,分享解决方案

下载
  • 别依赖 pid 或 comm 过滤,丢包多发生在软中断上下文,comm 常是 ksoftirqd/0
  • 加 count() 聚合后用 printf 打印,避免高频输出冲垮终端
  • 如果 location 全是 0x...,说明内核调试符号没加载,需安装 kernel-debuginfo 包

为什么 ping 延迟正常但业务包大量丢失

因为 ping(ICMP Echo)走的是 icmp_rcv → ping_lookup 路径,而业务流量(如 TCP SYN)走 tcp_v4_rcv → tcp_v4_do_rcv,两者在连接状态检查、early_demux、RPS 队列分发等环节完全独立。一个常见原因是 RPS 配置不均导致某 CPU 队列溢出,而 ICMP 包被 hash 到空闲队列,TCP 包却被持续打到已满队列,触发 netdev_max_backlog 丢弃。

  • 查 /proc/net/snmp 中 Udp: 和 Tcp: 段的 InCsumErrors、ListenOverflows、EstabResets,比看 Drop: 更准
  • 用 cat /sys/class/net/eth0/queues/rx-*/rps_cpus 看 RPS 是否只启用了部分 CPU,再用 cat /proc/interrupts | grep eth0 看硬中断是否集中
  • perf record -e 'syscalls:sys_enter_sendto' -e 'syscalls:sys_exit_sendto' 可确认用户态是否真发出了包,排除应用层写入阻塞

perf + bpftrace 联动分析的关键陷阱

最常踩的坑是时间窗口不同步:perf record 默认按时间采样,bpftrace 是事件驱动,两个工具各自运行时,看似同时抓包,实则事件可能错开几毫秒——丢包是瞬时行为,错过就无法关联。

  • 必须用 perf script 导出带时间戳的原始事件,再用 bpftrace 输出也加 strftime("%H:%M:%S", nsecs),最后用脚本按毫秒级对齐
  • 别信 timestamp 字段的绝对值,不同 CPU 的 TSC 可能漂移,优先用 nsecs(单调递增纳秒计数)做排序
  • 如果发现 bpftrace 抓到大量 SKB_DROP_REASON_SOCKET_FILTER,先检查有没有其他 eBPF 程序(如 Cilium、Falco)在 filter 链上误删包,而不是立刻怀疑内核

丢包点越靠近硬件(如网卡驱动 igb_clean_rx_irq 中的 rx_desc->status & E1000_RXD_STAT_DD 未置位),越难用高层工具捕获;这时候得切到 ethtool -S 看 rx_discards 或驱动私有统计,再决定是否要抓 PCIe TLP 层日志。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3088

2023.11.20

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

768

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5727

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2468

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3856

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

306

2025.12.06

location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

2702

2023.06.27

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JDK 27官方文档
JDK 27官方文档

共0课时 | 0人学习

LLVM入门手册
LLVM入门手册

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn