linux tracing和profiling概论

简介:


  在工作中经常用到各种跟踪调试工具, strace, ltrace, kprobes, tracepoints, uprobes, ftrace, perf, 和 eBPF。他们之间到底啥关系?本文从总体上进行概述,如果有错误欢迎指正。

1.1.1 系统跟踪

系统跟踪可以分为数据源、收集数据机制和跟踪前端(收集和分析数据的交互)。

数据源可以将其分为probes和tracepoints,对应的源有:

probes :kprobes/uprobes

tracepoints :USDT/kernel tracepoints / lttng-ust

            probe可以在运行时候修改程序来使能跟踪。tracepoint是编译到程序里面的,当使用的时候可以使能或激活,使用tracepoint在没有激活的时候是不会有任何损耗的,另外激活状态下也是很小的开销。

1.1.1.1  kprobes

kprobes是linux内核的debug机制,也可以用来监视生产系统的事件。也可以用来寻找性能瓶颈,指定事件,跟踪问题。

            可以使用Gregg 的

https://github.com/kernel-z/perf-tools/blob/master/kernel/kprobe

            跟踪系统中文件被打印情况,可以使用如下:

./kprobe 'p:myopen do_sys_open filename=+0(%si):string'

            可以打印系统中系统调用open。

            kprobes适用场景,1.跟踪系统调用,其有对应的内核函数do_sys_open;2.在知道哪些内核函数被调用的情况下,定位网络协议栈或文件IO性能问题;3.内核开发者用于定位内核问题。

1.1.1.2  uprobes

uprobes和kprobes 类似,主要是检测用户态函数,例如malloc。

具体参考:

http://www.brendangregg.com/blog/2015-06-28/linux-ftrace-uprobe.html

 

1.1.1.3  USDT/dtrace probes

USDT 为user-mode statically defined traces,就是dtrace probe.

如果程序编译了dtrace probes,就可以使用工具例如eBPF/systemtap来消耗它。当然很多程序例如python默认并没有编译dtrace probes,如果编译进去了,那么可以使用来跟踪python函数调用。

1.1.1.4  tracepoints

tracepoints也是在内核中。相比kprobes,变动比较少。

1.1.1.5  lttng-ust

lttng-ust是跟踪系统,可以将探针编译到程序中,所有跟踪事件发生在用户态。因为不需要上下文切换,所以很快。

1.1.2 收集数据机制

为了理解收集和分析跟踪数据,理解从内核中取出数据到你的手上就非常重要。观察内核自带的几个部分。

1.1.2.1  ftrace

ftrace是比较难以直接使用。很多数据位于/sys/kernel/debug/tracing中。要跟ftrace 交互,可以读写其中的文件。

1.1.2.2  perf_events

使用系统调用perf_event_open从内核中获取数据。内核会将事件写到用户态内存中,可以被直接读取。

1.1.2.3  eBPF

编写eBPF编程(通常使用C语言,或者使用工具来产生该程序),然后让内核将probe附加到kprobe/uprobe/tracepoint/dtrace的探针上。那么程序会将数据写到eBPF缓存中,就得到的精确的数据。

eBFP在最新的内核版本上可用。

 

1.1.1 tracepoint

最后来看下tracepoint。

kernel中有trace_XX形式的函数,这些是kernel的tracepoint,定义在include/linux/tracepoint.h中。

trace_要起作用,需要调用register_trace_##name,给他关联一个probe函数,当调用trace_时就执行probe函数

 

内核中的每个tracepoint提供一个钩子来调用probe函数。一个tracepoint可以打开或关闭。打开时,probe函数关联到tracepoint;关闭时,probe函数不关联到tracepointtracepoint关闭时对kernel产生的影响很小,只是增加了极少的时间开销(一个分支条件判断),极小的空间开销(一条函数调用语句和几个数据结构)。当一个tracepoint打开时,用户提供的probe函数在每次这个tracepoint执行是都会被调用。

1.1.2 关于跟踪器选择

如果你当前或未来计算机运行内核大于4.9,那么就用eBPF,不过在老的版本中eBPF可能帮不到你,那么ftrace 就值得投入分析。

perf trace比较简单,损耗比较低可以直接上手。

使用kprobes也是一个不错的主意。

可以使用perf_events(又名perf)来做CPU的profiling,然后可用火焰图来描述。当然,perf还可以做很多事情,这里先其做CPU profiling。

性能大师Gregg有如下建议:

d88a19530519b8cd8e6a142ce8649a593fd289b1

            如果是性能工程师,就需要选择一个跟踪器如SystemTap,LTTng或sysdig。LTTng相比安全一点,SystemTap功能强大。sysdig有待增加kprobe或tracepoints。

            在工作中可以尽可能的使用perf和ftrace,这已被集成到了eBPF中,然后在使用SystemTap或LTTng来补充。

1.1.3 参考

http://netsplit.com/tracing-on-linux

http://www.brendangregg.com/blog/2015-07-08/choosing-a-linux-tracer.html

LTT: https://en.wikipedia.org/wiki/Linux_Trace_Toolkit

Linux tracing systems & how they fit together

 

目录
相关文章
|
5天前
|
NoSQL 关系型数据库 MySQL
Linux学习记录---(1、基本命令)
该博客文章提供了Linux系统中基本命令的使用记录,包括文件和目录操作、Redis服务管理、MySQL数据库操作以及Tomcat服务器的启动和检查。
Linux学习记录---(1、基本命令)
|
3天前
|
Linux
会玩这10个Linux命令,一定是个有趣的IT男!
会玩这10个Linux命令,一定是个有趣的IT男!
|
6天前
|
运维 Ubuntu Linux
Linux系统之ncdu命令的基本使用
【8月更文挑战第8天】Linux系统之ncdu命令的基本使用
14 2
Linux系统之ncdu命令的基本使用
|
3天前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
21 9
|
3天前
|
Linux Shell
linux命令
linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。
|
4天前
|
移动开发 运维 网络协议
运维必备 | Linux netstat命令详解
运维必备 | Linux netstat命令详解
|
4天前
|
Linux
真香~ Linux vi常用命令汇总!
真香~ Linux vi常用命令汇总!
|
4天前
|
Linux Shell
linux命令
linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。
|
7天前
|
运维 安全 Linux
【超实用秘籍】Linux文件传输新高度:10个scp命令让你瞬间变身文件传输达人,从此告别繁琐操作!
【8月更文挑战第13天】文件传输是运维工作的核心部分,尤其对Linux用户来说,了解高效且安全的传输方法非常重要。本文介绍10种scp命令的应用技巧,涵盖基础文件传输、密钥认证、目录复制等场景,助你灵活运用这一基于SSH协议的安全工具。从简单的文件传输到复杂的多主机文件迁移,scp都能轻松应对。通过本文的学习,你将能更熟练地使用scp命令,提高工作效能。
27 6
|
3天前
|
SQL 存储 分布式计算
Linux退出Hive命令
【8月更文挑战第14天】