动态追踪技术思想及应用

it2023-10-16  76

动态追踪技术思想及应用


分享的议题

今天我要分享的议题 :偏向于思想和应用;对于底层技术原理,由于本人也在学习中,还没有深入了解,相关资料可以 咨询 内核组(老司机)、网上资料等。


简介

静态追踪: log、metric、stats;

一个简单的示例:调试test 函数中是否存在参数为0 的场景:

testDtrace.c: void test(int i) { // do sth if (i == 0) { printf("get i == 0\n"); // 当 i == 0 时,日志记录 i == 0 } } int main() { int a = 0; for (;a < 5; a++) { test(a); } }

如果我想知道 业务 是否会存在 i = 1的场景呢? 如果使用静态追踪,此时需要修改代码,重新编译、 上线验证、查看日志;

动态追踪: 继续使用原程序,仅需修改一个命令:(原理:在某个执行点上插入 指令 获取信息,再返回原执行流)

bpftrace -e 'uprobe:/home/zwb/bpf/testHook/testDtrace:test /arg0 == 1/ {printf("get i == 1\n");}' Attaching 1 probe... get i == 1 ^C

优点:

hook:意味着灵活扩展性,hook 机制的东西都很香: iptables、openresty + lua、puppeteer,hook的原理是 插入、返回原执行流

runtime: 业务 无感知、易用

缺点:

性能消耗(绝大部分场景可以忽略不计),插入的指令 以及 被调用的 频度; 健壮性:如systemtap 等 存在 使用不当导致系统崩溃的风险;代码熟悉程度:如果基于动态追踪开发工具 需要对代码具备一定熟悉;

静态和动态 trace 的关系:相互辅佐

优先考虑 静态 的设计、静态更容易贴近业务、形成服务;如我们各类 打点 监控、日志分析;

大部分动态追踪场景 最终都可以转换为静态追踪提供常态的 查询和trace 告警;

无法改动的(内核)或者 觉得常量静态追踪 浪费性能,出问题又不方便排查的时候使用动态追踪; 有时候动态追踪也无法解决的 只能加日志打点;

工具不分好坏,凡是能够最快解决问题的工具都是好工具,没必要 一味追求新事物,重在解决问题的方法论和手段; 如 strace 对比 跟踪启动流程、gdb attach 等等、lsof、/proc/pid/xxx 动态追踪技术的思想已经很久远了 但直到现在没有过时,只是实现思想的方式不断在发展


技术的价值

技术产生价值的两个重要的点:

产品化和服务:

技术需要工具化、服务化、产品化 才能宏扬光大,动态追踪技术究极演进路线:

idea:

具备hook 机制的技术 只要稍微打磨,便可提供各种各样的服务 和功能。 关键是创意和想法.

iptables: 防火墙、容器代理等;

openresty:代理、测试等;

puppteer:前端测试工具,hub 订阅器,爬虫 自动化工具等等。


动态追踪技术的应用

前面 我们讲到 动态追踪技术的大概原理,下面开始我们的已有应用之旅:介绍在几个典型例子

新软件的熟悉:程序的执行流:比如 coredump分析、nginx 源码解析、接口执行路径;

问题排查:比如 lua 死循环分析工具;脚本程序执行者跟踪;丢包、内存泄漏(c 、go)、占用IO 最高的缓存url 、为什么不缓存、首包慢 等等

性能追踪:采样分析

各类创造性工具:导流工具、抓包工具、异常场景模拟 等

革新的软件:xdp、xacl、iptables


动态追踪技术 常用工具

systemtap、ebpf (内核的"小程序")

最新回复(0)