0

0

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

冰川箭仙

冰川箭仙

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

|

513人浏览过

|

来源于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_skbnetif_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_skblocation 字段能指出丢包位置,比如 net/ipv4/ip_input.c:230 表示 IP 层校验失败丢弃
  • 避免用 -g(调用图),它会大幅降低采样精度,丢包分析重在事件频次和上下文,不在深度栈

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

靠静态打点不够,得用 bpftrace 动态过滤——重点不是“看到丢包”,而是“在丢包前一刻,哪些字段异常”。比如对 skb:kfree_skb 加条件:只打印那些 dst_ip 是目标服务器、且 reason == SKB_DROP_REASON_NOT_SPECIFIEDSKB_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 == 17SKB_DROP_REASON_IP_INHDR(IP 头错误),reason == 5SKB_DROP_REASON_NOT_SPECIFIED(泛用型丢弃,常出现在驱动层)。注意:args->location 是地址,需用 str() 解析为符号名,否则输出一串数字。

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

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

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

  • /proc/net/snmpUdp:Tcp: 段的 InCsumErrorsListenOverflowsEstabResets,比看 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 -Srx_discards 或驱动私有统计,再决定是否要抓 PCIe TLP 层日志。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

198

2023.11.20

printf用法大全
printf用法大全

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

75

2023.06.20

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

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

286

2023.11.28

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

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

397

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

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

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

469

2024.01.03

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

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

15

2025.12.06

location.assign
location.assign

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

226

2023.06.27

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

12

2026.01.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号