背景
linux 性能监测次要是对于 Linux 零碎上程序的性能跟踪。
前排提醒:如果你只想要一个可监测 linux 性能的工具, 并且有可视化的 web,并且开源且继续更新,那么你能够查看 Performance Co-Pilot,比拟不错。如果你须要更深刻的理解 linux 性能监测,或者心愿升高监测所带来的性能耗费,那么能够往下看。
从狭义上讲,linux 跟踪零碎由三层组成
- 信息源
- 对接信息源的追踪框架
- 前端操作界面
信息源(event_sources)
事件源是性能监测的根底 , 是跟踪数据的起源,跟踪框架运行在内核中,负责数据收集、计数。
信息源次要分为以下三类:
- 硬件事件
- 动态探针
- 动静探针
1. 硬件事件
性能监控计数器(PMCs)是处理器上的可编程硬件计数器,用于测量处理器中产生的事件。
PMCs 是 CPU 自带的性能,因而能失去最底层的、用别的伎俩得不到的性能信息,例如只有通过 PMC 能力测量 CPU 指令执行的效率、CPU 缓存命中率、内存 / 数据互联和设施总线的利用率,以及阻塞的指令周期等。
因为硬件事件比拟底层的,咱们性能监测的时候,个别很少从此处获取可优化的数据。
2. 动态事件
2.1 内核跟踪点(tracepoints)
即 linux 内核源代码中事后定义的跟踪点。
linux 源码中,有很多以 trace_ 结尾的函数,这些都是是 linux 中预约义好的跟踪点。
int netif_receive_skb(struct sk_buff *skb)
{trace_netif_receive_skb_entry(skb); // 调用 netif_receive_skb 对应的 trace event 函数
return netif_receive_skb_internal(skb);
}
如想查看这些 trace_ 结尾的函数,可到 /sys/kernel/debug/tracing/
下查看
2.2 USDT 探针
USDT 探针(User Statically-Defined Tracing)全称是用户级动态定义跟踪,须要在源码中插入 DTRACE_PROBE() 代码,并编译到应用程序中。这里不做详述。
3 动静探针
顾名思义,则是指没有当时在代码中定义,但却 能够在运行时动静增加的探针(重点是不须要从新编译目标程序)。次要由 kprobe(内核探针)和 uprobe(用户态探针)组成。
3.1 内核探针 kprobes
kprobes(Kernel Dynamic Probes)。一种提供 内核函数动静跟踪 的 Linux 内核技术。
实质:是在指定的探测点 (比方函数的某行, 函数的入口地址和进口地址, 或者内核的指定地址处) 插入一组处理程序. 内核执行到这组处理程序的时候就能够获取到以后正在执行的上下文信息。
具体可查看 An introduction to KProbes
3.2 用户态探针 uprobes
一种提供 用户级函数动静跟踪 的 Linux 内核技术
具体可查看 Linux uprobe:用户级动静跟踪
总之,只须要理解 信息源次要分为硬件事件,动态探针,动静探针
追踪框架
先介绍一下这方面的一个大神:brendangregg,很多编入内核的追踪框架都有他的奉献。
以下是他画的一张对于 linux 察看性能工具的一张图。
能够说,linux 的各方面(cpu, 磁盘,调度,网络,io)都有对应的工具。
在这张图的右边,列出了比拟罕用的框架
- perf
- ftrace
- lttng
- BCC
- bpftrace
当然也有更多:
这是 brendangregg 大神在 2015 年的一篇文章 抉择 Linux 跟踪器 到今日也有肯定的参考价值。
博主自己比拟举荐理解以下框架:
- ftrace (内置在 Linux 内核中),比拟经典
- perf (起源位于 Linux 内核中,通常通过 linux-tools-common 包增加)
- bpftrace (继续开源更新中)
以下是相干这三个工具的理解
ftrace
…. 正在更新中