背景和行文目的
在做 node
或者其他语言的软件开发时,是否有以下经历:
- 测试环境一切正常,发到生产环境后,出现诡异问题且难以定位
- 不同机器、不同容器上,某些逻辑呈现不同的结果,如时区、
host
- 对于时好时坏的玄学问题,束手无策,没有完整的解决思路,无头苍蝇般的各种尝试,效率低下
- 遇到坑,习惯搜网友解决方案,然后试很多方案,都不能解决问题,此时就会感觉头皮发麻😂
我相信,上述我说的经历,大多数人都会有所共鸣。本文,我将尽可能的把我所学的动态追踪技术分享给大家。
文章内容如下所示:
- 介绍
Dynamic Trace
的概念、优势、原理和用法(我们需要掌握的那部分) - 通过
demo
, 展示Dynamic Trace
技术的强大 - 实战演示: 搭建
node
性能监控easy-monitor
和构建node
应用,构造诡异故障,并阐述如何用Dynamic Trace
去精确快速定位 - 分享代码: 会把实战演示的代码放到
github
上,大家可以clone
自行去体验 - 动态追踪技术的未来: 介绍下目前最领先的
Dynamic Trace
方案 - 总结: 做一个精简的总结
- 附: 其他内容
话不多说,直接开整。
动态追踪技术
是什么
这里我把章亦春大佬的原话引用过来:
动态追踪技术其实是一种后现代的高级调试技术。它可以帮助软件工程师以非常低的成本,在非常短的时间内,回答一些很难的关于软件系统方面的问题,从而更快速地排查和解决问题。
优势
优势如下:
- 随时随地,按需采集
- 基于操作系统内核实现,性能损耗极小
原理
动态追踪的事件源根据事件类型不同,主要分为静态探针、动态探针以及硬件事件,其原理如下图所示:
看不懂也正常,我也看不懂,不过会用进行,就跟你不会造车,但你可以把车开的很溜。
简单点说,就是在 linux
中,进程不能直接访问硬件设备,当进程需要访问硬件设备时,如 IO
操作,必须由用户态切换至内核态,然后通过操作系统调用硬件设备。 所以可以通过跟踪进程产生的系统调用,来获得参数、返回值、执行时间,从而完成动态追踪。
我们用的多的是动态探针,它可以让我们实时分析线上运行的程序。
用法
动态追踪工具有 strace
、 dtruss
、 systemtap
、 perf
、 dtrace
、 eBPF
等,我这边使用的是 strace
和 dtruss
。
也就是 linux
环境使用 strace
, macos
系统使用 dtruss
。
strace 的主要参数说明如下表所示:
参 |
---|