本系列主要是充分使用eBPF来延时如何定位实际问题,在生产中碰到类似问题也可以采用文中所描述方法。 先编译源码,代码下载位置:https://github.com/kernel-z/linux-tracing-workshop/blob/master/server.c
OProfile是Linux内核支持的一种性能分析机制。它在时钟中断处理入口处建立监测点,记录被中断的上下文现场,由配套的用户态的工具oprof_start负责在用户态收集数据,opreport则分析数据并给出分析报告。oprofile 是 Linux 平台上的一个功能强大的性能分析工具, 支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(ti
起初systemtap 是聚焦于内核空间的,因为用户层的诊断工具真的很多,后来还是在0.6版本时候可以探测用户进程了,既然可以用,那就用它吧。 Systemtap用uprobes 模块来执行用户层的探测,
这篇我们来看下如何定位IO 瓶颈问题,并找出个别慢速的IO操作。
1 Gprof的安装gprof是gnubinutils工具之一,默认情况下linux系统当中都带有这个工具。2 使用1) 源码的编译为了能使用gprof来对代码进行分析,编译代码时必须添加-pg选项。如编译hello.c gcc –g –pg –o hello hello.c2) 运行hello,在当前目录下会产生gmon.out文件3
可以使用 OProfile 来分析处理器周期、TLB 失误、内存引用、分支预测失误、缓存失误、中断处理程序,等等。使用opcontrol 的 --list-events 选项来提供完整的 特定处理器上可监视事件列表。1 监视处理器周期#include int fast_multiply(x, y){return x * y;}int slow_multiply
2 在 Oracle Linux 上安装和配置 DTraceDTrace 软件包和 Unbreakable Enterprise Kernel (UEK) 软件包可从 Unbreakable Linux Network (ULN) 上获取,但不能从公共 yum 服务器上获取。必须先在 ULN 上注册您的系统,然后才能下载所需的软件包。管理员解决方案指南 还介绍了如何使用 modpr
1 SYSTEMTAP介绍SystemTap 是监控和跟踪运行中的Linux 内核的操作的动态方法。这句话的关键词是动态,因为SystemTap 没有使用工具构建一个特殊的内核,而是允许您在运行时动态地安装该工具。SystemTap是一个诊断Linux系统性能或功能问题的开源软件。它使得对运行时的Linux系统进行诊断调式变得更容易、更简单。有了它,开发者或调试人员不再需要重编译
1. 常用技巧systemtap可以实现交叉编译:编译可执行模块如下:stap -r kernel_version script -m module_name运行命令如下:staprun module_name.kostap命令会读取脚本的指令,并翻译成C代码,编译成内核模块加载到内核。Staprun命令运行指令,并不会去翻译或编译。使用-v参数可以输出会话很多信息。使用-vvv可以输出更加详...
systemtap对用户级和内核级代码提供了静态和动态跟踪的功能。Systemtap采用其他的内核框架做源:静态探针用tracepoints、动态探针用kprobes、用户级别的探针用uprobes。这些源也为perf、LTTng所用。由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。Syste...
安装完systemtap相关rpm包之后,在路径/usr/share/systemtap/testsuite/systemtap.examples/或者/usr/share/doc/systemtap-client-3.0/examples/network/中有所有可实用的脚本。1. 网络查看系统中每个进程的网络传输情况:nettop.stp追踪系统中产生的网络流量。socket-trace....
这里将问题诊断分为两个阶段,第一阶段是定性分析,第二阶段是是用bcc进行定量分析。 1. 阶段一 在使用bcc工具前,先要进行基本的系统性能判断,如下十个步骤,可以1到2分钟之内观测完毕。 相关脚本可以参考 https://github.com/kernel-z/LinuxProfiling l  uptime l  dmesg | tail l  vmstat 1 lÂ
在eBPF篇中,我们知道虽然可用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码。工作有些麻烦,于是就有人设计了 BPF Compiler Collection(BCC),BCC 是一个(基于 C 和 C++) python 库,实现了对 BCC 应用层接口的封装。 使用 BCC 进行 BPF 的开发仍然需要开发者自行利用 C 来设计 BPF 程...
funccount函数可以通过匹配来跟踪函数,tracepoints 或USDT探针。例如所有以vfs_ 开头的内核函数。./funccount 'vfs_*'这个对于探索内核代码很有帮助,可以找出哪个函数在使用那个函数没在使用。也可以设置间隔,每秒打印一次:./funccount -i 1 'vfs_*'跟踪所有tcp函数。./funccount 'tcp_*'当执行Ctrl+C进行取消跟踪的时...
上篇中是通用的直接可用工具。 trace工具可以指定跟踪函数并显示,可控制其输出格式来显示函数参数和返回值。例如跟踪文件拥有者的属性更改,也就是跟踪三个文件系统调用chown,fchown,lchown。使用如下:trace.py 'p::SyS_chown "file = %s, to_uid = %d, to_gid = %d, from_uid = %d", arg1, arg2, ...
关于trace,argdist,funccount三个工具已有专门篇章介绍。所有脚本位于bcc/tools文件夹中。execsnoop跟踪新进程创建,跟踪exec函数。bashreadline打印系统中所有bash上运行的命令,通过跟踪readline()函数实现。biolatency跟踪块设备IO,记录IO延时分布并输出直方图。biosnoop跟踪块设备IO,为每个IO打印一行。biotop是块...
argdist工具用于探测指定的函数,并收集参数到一个直方图和频率计数器。可以在没有调试器的情况下,过滤并打印敢兴趣的参数,从而理解指定参数的分布图。例如像知道一个应用中的内存分配块大小情况,可以指向如下:./argdist -p 2420 -c -C 'p:c:malloc(size_t size):size_t:size'如果要变成柱状图,参数修改成-H即可。./argdist -p 2420...
bcc开发脚本有两种方式,一种是基于python接口,另一种是基于ruby接口,我们看的是基于python接口的。本篇的前置条件是系统中已经安装好了bcc。1. Hello world输入代码如下:#!/usr/bin/env pythonfrom bcc import BPFBPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_prin...
在之前的bcc代码中我们知道其程序是分为两部分的,一部分是C语言,另一部分是基于Python的。本篇是关于C语言部分的。1. 事件和参数1.1 kprobes使用kprobe的语法是:kprobe__kernel_function_name其中kprobe__是前缀,用于给内核函数创建一个kprobe(内核函数调用的动态跟踪)。也可通过C语言函数定义一个C函数,然后使用python的B...
接下来看下python方面的知识。1. 初始化1.1 BPF语法:BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]])创建一个BPF对象,能通过交互来产生输出。1.2 USDT语法:USDT({pid=pid | path=path})创建对象来使用USDT,可以指定进程...
在工作中经常用到各种跟踪调试工具, strace, ltrace, kprobes, tracepoints, uprobes, ftrace, perf, 和 eBPF。他们之间到底啥关系?本文从总体上进行概述,如果有错误欢迎指正。1.1.1 系统跟踪系统跟踪可以分为数据源、收集数据机制和跟踪前端(收集和分析数据的交互)。数据源可以将其分为probes和tracepoints,对应的源有:pro...
eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。BPF 是在 1997 年首次被引入 Linux 的,Linux 内核中的报文过滤机制其实是有自己的名字的:Linux Socket Filter,简称 ...
Kprobes 是 Linux 中的轻量级装置,可以将断点插入到正在运行的内核之中。Kprobes 可以地收集处理器寄存器和全局数据结构等调试信息。甚至可以使用 Kprobes 来修改 寄存器值和全局数据结构的值。Kprobes 向运行的内核中给定地址写入断点指令,插入一个探测器。 执行被探测的指令会导致断点错误。Kprobes 钩住(hook in)断点处理器并收集调试信息。Kprobes 甚...
DtraceDTrace(全称Dynamic Tracing),也称为动态跟踪,是由 Sun™ 开发的一个用来在生产和试验性生产系统上找出系统瓶颈的工具,可以对内核(kernel)和用户应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险的技术。在任何情况下它都不是一个调试工具,而是一个实时系统分析寻找出性能及其他问题的工具。 DTrace 是个特别好的分析工具
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号