• perf usdt


      目前perf 支持添加动态探测内核;通过 perf ,来自定义动态事件(perf probe),只关注真正感兴趣的事件。如下使用。

       笔者有时需要使用perf 调试用户态,so记录之

     

    静态探针

    是指事先在代码中定义好,并编译到应用程序或者内核中的探针。这些探针只有在开启探测功能时,才会被执行到;未开启时并不会执行。常见的静态探针包括内核中的跟踪点(tracepoints)和 USDT(Userland Statically Defined Tracing)探针。

    • USDT 探针,全称是用户级静态定义跟踪,需要在源码中插入 DTRACE_PROBE() 代码,并编译到应用程序中。不过,也有很多应用程序内置了 USDT 探针,比如 MySQL、PostgreSQL 等。

    动态探针

    则是指没有事先在代码中定义,但却可以在运行时动态添加的探针,比如函数的调用和返回等。动态探针支持按需在内核或者应用程序中添加探测点,具有更高的灵活性。常见的动态探针有两种,即用于内核态的 kprobes 和用于用户态的 uprobes。

    • kprobes 用来跟踪内核态的函数,包括用于函数调用的 kprobe 和用于函数返回的 kretprobe。
    • uprobes 用来跟踪用户态的函数,包括用于函数调用的 uprobe 和用于函数返回的 uretprobe。

      注意,kprobes 需要内核编译时开启 CONFIG_KPROBE_EVENTS;而 uprobes 则需要内核编译时开启 CONFIG_UPROBE_EVENTS。

    strace 基于系统调用 ptrace 实现

    • 由于 ptrace 是系统调用,就需要在内核态和用户态切换。当事件数量比较多时,繁忙的切换必然会影响原有服务的性能;
    • ptrace 需要借助 SIGSTOP 信号挂起目标进程。这种信号控制和进程挂起,会影响目标进程的行为。

    所以,在性能敏感的应用(比如数据库)中,我并不推荐你用 strace (或者其他基于 ptrace 的性能工具)去排查和调试。

    在 strace 的启发下,结合内核中的 utrace 机制, perf 也提供了一个 trace 子命令,是取代 strace 的首选工具。相对于 ptrace 机制来说,perf trace 基于内核事件,自然要比进程跟踪的性能好很多。perf trace 的使用方法如下所示,跟 strace 其实很像:

      ftrace 和 perf 的功能已经比较丰富了,不过,它们有一个共同的缺陷,那就是不够灵活,没法像 DTrace 那样通过脚本自由扩展。

       BCC 把 eBPF 中的各种事件源(比如 kprobe、uprobe、tracepoint 等)和数据操作(称为 Maps),也都转换成了 Python 接口(也支持 lua)。这样,使用 BCC 进行动态追踪时,编写简单的脚本就可以了。

    不过要注意,因为需要跟内核中的数据结构交互,真正核心的事件处理逻辑,还是需要我们用 C 语言来编写。

      SystemTap 也是一种可以通过脚本进行自由扩展的动态追踪技术。在 eBPF 出现之前,SystemTap 是 Linux 系统中,功能最接近 DTrace 的动态追踪机制。不过要注意,SystemTap 在很长时间以来都游离于内核之外(而 eBPF 自诞生以来,一直根植在内核中)。

    所以,从稳定性上来说,SystemTap 只在 RHEL 系统中好用,在其他系统中则容易出现各种异常问题。当然,反过来说,支持 3.x 等旧版本的内核,也是 SystemTap 相对于 eBPF 的一个巨大优势。

     

    目前性能优化大师已经在linux4.x内核上给出例程!!6.5. Static User Tracing

    Support was added in later 4.x series kernels. The following demonstrates Linux 4.10 (with an additional patchset), and tracing the Node.js USDT probes:

    # perf buildid-cache --add `which node`
    # perf list | grep sdt_node
      sdt_node:gc__done                                  [SDT event]
      sdt_node:gc__start                                 [SDT event]
      sdt_node:http__client__request                     [SDT event]
      sdt_node:http__client__response                    [SDT event]
      sdt_node:http__server__request                     [SDT event]
      sdt_node:http__server__response                    [SDT event]
      sdt_node:net__server__connection                   [SDT event]
      sdt_node:net__stream__end                          [SDT event]
    # perf record -e sdt_node:http__server__request -a
    ^C[ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.446 MB perf.data (3 samples) ]
    # perf script
                node  7646 [002]   361.012364: sdt_node:http__server__request: (dc2e69)
                node  7646 [002]   361.204718: sdt_node:http__server__request: (dc2e69)
                node  7646 [002]   361.363043: sdt_node:http__server__request: (dc2e69)

    XXX fill me in, including how to use arguments.

      If you are on an older kernel, say, Linux 4.4-4.9, you can probably get these to work with adjustments (I've even hacked them up with ftrace for older kernels), but since they have been in development, I haven't seen documentation outside of lkml, so you'll need to figure it out. (On this kernel range, you might find more documentation for tracing these with bcc/eBPF, including using the trace.py tool.)

    参考此篇文章的udst 使用例程:usdt-on-linux

    apt-get install systemtap-sdt-dev
    
    
    #include <sys/sdt.h>
    
    int main() {
      DTRACE_PROBE(hello_usdt, enter);
      int reval = 0;
      return reval;
    }
    gcc ./hello-usdt.c -o ./hello-usdt

    perf buildid-cache --add 'hello-usdt'
    perf probe sdt_hello_usdt:enter

    perf record -e sdt_hello_usdt:enter -ag
  • 相关阅读:
    jquery跑马灯效果(ajax调取数据)
    IE6下双倍边距和关于IE6 7display:inline无效的问题
    js 利用ajax将前台数据传到后台(json格式)
    js 利用ajax将前台数据传到后台(1)
    js 点击某一块就显示某一块
    点击进行复制的JS代码
    jq利用ajax调用后台方法
    每一个程序员需要了解的10个Linux命令
    101个MySQL的调节和优化技巧
    JavaScript Math和Number对象
  • 原文地址:https://www.cnblogs.com/codestack/p/16411772.html
Copyright © 2020-2023  润新知