0x00 前言
追踪类调试工具鸟瞰图
0x01 ftrace
工作原理
Ftrace的框架图如下,ftrace包括多种类型的tracers,每个tracer完成不同的功能,将这些不同类型的tracers注册进入ftrace framework,各类tracers收集不同的信息,并放入到Ring buffer缓冲区以供调用
从上图可知,Ftrace是基于debugfs
调试文件系统的,需要先挂载debugfs
: mount -t debugfs none /sys/kernel/debug
[root@VM-163-30-centos ]# ls /sys/kernel/debug/
acpi boot_params dynamic_debug fnic kprobes rssd suspend_stats usb x86
bdi dma_buf extfrag hid mce sched_features tracing wakeup_sources
ftrace的hook机制
1、静态插桩方式
在Kernel中打开了CONFIG_FUNCTION_TRACER
功能后,会增加-pg
编译选项,编译器会在每个内核函数的入口处调用一个特殊的汇编函数mcount
或 __fentry__
,如果跟踪功能被打开,mcount/fentry
会调用当前设置的 tracer,tracer将不同的数据写入ring buffer
2、动态插桩方式
启用了CONFIG_DYNAMIC_FTRACE
选项,编译内核时所有的mcount/fentry
调用点都会被收集记录。编译时记录所有被添加跳转指令的函数,这里表示所有支持追踪的函数。在内核的初始化启动过程中,会根据编译期记录的列表,将mcount/fentry
调用点替换为NOP
指令( no-operation)并直接转到下一条指令。因此在没有开启跟踪功能的情况下,Ftrace不会对内核性能产生任何影响。在开启追踪功能时,Ftrace才会将NOP
指令动态替换为mcount/fentry
(这里的动态是指的动态修改函数指令),以实现追踪功能
0x02 bpftrace
0x0 参考
- 七张图看懂 Linux profiling 机制
- 从Ftrace开始内核探索之旅
- 问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会
- 【一文秒懂】Ftrace系统调试工具使用终极指南
- ftrace基本用法
FEATURED TAGS
Latex
gRPC
负载均衡
OpenSSH
Authentication
Consul
Etcd
Kubernetes
性能优化
Python
分布式锁
WebConsole
后台开发
Golang
OpenSource
Nginx
Vault
网络安全
Perl
分布式理论
Raft
正则表达式
Redis
分布式
限流
go-redis
微服务
反向代理
ReverseProxy
Cache
缓存
连接池
OpenTracing
GOMAXPROCS
GoMicro
微服务框架
日志
zap
Pool
Kratos
Hystrix
熔断
并发
Pipeline
证书
Prometheus
Metrics
PromQL
Breaker
定时器
Timer
Timeout
Kafka
Xorm
MySQL
Fasthttp
bytebufferpool
任务队列
队列
异步队列
GOIM
Pprof
errgroup
consistent-hash
Zinx
网络框架
设计模式
HTTP
Gateway
Queue
Docker
网关
Statefulset
NFS
Machinery
Teleport
Zero Trust
Oxy
存储
Confd
热更新
OAuth
SAML
OpenID
Openssl
AES
微服务网关
IM
KMS
安全
数据结构
hashtable
Sort
Asynq
基数树
Radix
Crontab
热重启
系统编程
sarama
Go-Zero
RDP
VNC
协程池
UDP
hashmap
网络编程
自适应技术
环形队列
Ring Buffer
Circular Buffer
InnoDB
timewheel
GroupCache
Jaeger
GOSSIP
CAP
Bash
websocket
事务
GC
TLS
singleflight
闭包
Helm
network
iptables
MITM
HTTPS
Tap
Tun
路由
wireguard
gvisor
Git
NAT
协议栈
Envoy
FRP
DPI
gopacket
Cgroup
Namespace
DNS
eBPF
GoZero
Gost
Clash
gopsutil
Linux
HIDS
ELKEID
XDP
TC
Systemd
netlink
Kernel