首页 > 系统相关 >如何利用内核跟踪点排查短时进程问题?

如何利用内核跟踪点排查短时进程问题?

时间:2024-02-07 20:31:46浏览次数:31  
标签:kprobe execveat sys 排查 短时 内核 syscalls tracepoint execve

在排查系统 CPU 使用率高的问题时,很可能遇到过这样的困惑:明明通过  top  命令发现系统的 CPU 使用率(特别是用户 CPU 使用率)特别高,但通过  ps、pidstat  等工具都找不出 CPU 使用率高的进程。这是什么原因导致的呢?

一般情况下,这类问题很可能是以下两个原因导致的:

第一,应用程序里面直接调用其他二进制程序,并且这些程序的运行时间很短,通过  top  工具不容易发现;

第二,应用程序自身在不停地崩溃重启中,且重启间隔较短,启动过程中资源的初始化导致了高 CPU 使用率。

使用  top、ps  等性能工具很难发现这类短时进程,这是因为它们都只会按照给定的时间间隔采样,而不会实时采集到所有新创建的进程。那要如何才能采集到所有的短时进程呢?那就是利用 eBPF 的事件触发机制,跟踪内核每次新创建的进程,这样就可以揪出这些短时进程。

要跟踪内核新创建的进程,首先得找到要跟踪的内核函数或跟踪点。如果你了解过 Linux 编程中创建进程的过程,我想你已经知道了,创建一个新进程通常需要调用  fork()  和  execve()  这两个标准函数,它们的调用过程如下图所示:

如何利用内核跟踪点排查短时进程问题?_eBPF

因为我们要关心的主要是新创建进程的基本信息,而像进程名称和参数等信息都在  execve()  的参数里,所以我们就要找出  execve()  所对应的内核函数或跟踪点。

借助bpftrace  工具,你可以执行下面的命令,查询所有包含  execve  关键字的跟踪点:

sudo bpftrace -l '*execve*'

命令执行后,你会得到如下的输出内容:

kprobe:__ia32_compat_sys_execve
kprobe:__ia32_compat_sys_execveat
kprobe:__ia32_sys_execve
kprobe:__ia32_sys_execveat
kprobe:__x32_compat_sys_execve
kprobe:__x32_compat_sys_execveat
kprobe:__x64_sys_execve
kprobe:__x64_sys_execveat
kprobe:audit_log_execve_info
kprobe:bprm_execve
kprobe:do_execveat_common.isra.0
kprobe:kernel_execve
tracepoint:syscalls:sys_enter_execve
tracepoint:syscalls:sys_enter_execveat
tracepoint:syscalls:sys_exit_execve
tracepoint:syscalls:sys_exit_execveat

从输出中,你可以发现这些函数可以分为内核插桩(kprobe)和跟踪点(tracepoint)两类。内核插桩属于不稳定接口,而跟踪点则是稳定接口。因而,在内核插桩和跟踪点两者都可用的情况下,应该选择更稳定的跟踪点,以保证 eBPF 程序的可移植性(即在不同版本的内核中都可以正常执行)。

排除掉  kprobe  类型之后,剩下的  tracepoint:syscalls:sys_enter_execve、tracepoint:syscalls:sys_enter_execveat、tracepoint:syscalls:sys_exit_execve  以及  tracepoint:syscalls:sys_exit_execveat  就是我们想要的 eBPF 跟踪点。其中,sys_enter_  和  sys_exit_  分别表示在系统调用的入口和出口执行。

只有跟踪点的列表还不够,因为我们还想知道具体启动的进程名称、命令行选项以及返回值,而这些也都可以通过 bpftrace 来查询。在命令行中执行下面的命令,即可查询:

# 查询sys_enter_execve入口参数
$ sudo bpftrace -lv tracepoint:syscalls:sys_enter_execve
tracepoint:syscalls:sys_enter_execve
    int __syscall_nr
    const char * filename
    const char *const * argv
    const char *const * envp

# 查询sys_exit_execve返回值
$ sudo bpftrace -lv tracepoint:syscalls:sys_exit_execve
tracepoint:syscalls:sys_exit_execve
    int __syscall_nr
    long ret

# 查询sys_enter_execveat入口参数
$ sudo bpftrace -lv tracepoint:syscalls:sys_enter_execveat
tracepoint:syscalls:sys_enter_execveat
    int __syscall_nr
    int fd
    const char * filename
    const char *const * argv
    const char *const * envp
    int flags

# 查询sys_exit_execveat返回值
$ sudo bpftrace -lv tracepoint:syscalls:sys_exit_execveat
tracepoint:syscalls:sys_exit_execveat
    int __syscall_nr
    long ret

从输出中可以看到,sys_enter_execveat()  比  sys_enter_execve()  多了两个参数,而文件名  filename、命令行选项  argv  以及返回值  ret的定义都是一样的。

使用 bpftrace 查询到了 execve 相关的跟踪点,以及这些跟踪点的具体格式。

bpftrace、BCC 和 libbpf 这三种方式各有优缺点,在实际的生产环境中都有大量的应用:

  • bpftrace 通常用在快速排查和定位系统上,它支持用单行脚本的方式来快速开发并执行一个 eBPF 程序。不过,bpftrace 的功能有限,不支持特别复杂的 eBPF 程序,也依赖于 BCC 和 LLVM 动态编译执行。
  • BCC 通常用在开发复杂的 eBPF 程序中,其内置的各种小工具也是目前应用最为广泛的 eBPF 小程序。不过,BCC 也不是完美的,它依赖于 LLVM 和内核头文件才可以动态编译和加载 eBPF 程序。
  • libbpf 是从内核中抽离出来的标准库,用它开发的 eBPF 程序可以直接分发执行,这样就不需要每台机器都安装 LLVM 和内核头文件了。不过,它要求内核开启 BTF 特性,需要非常新的发行版才会默认开启(如 RHEL 8.2+ 和 Ubuntu 20.10+ 等)。







标签:kprobe,execveat,sys,排查,短时,内核,syscalls,tracepoint,execve
From: https://blog.51cto.com/key3feng/9640288

相关文章

  • SPI多个从设备问题排查
    记SPI问题排查 SPI电路挂载了2个从设备,S1和S2,其中S2前加了一个隔离器g,电路结构如下图:  问题发现:其它同事已经开发了S2驱动,我在开发S1驱动时发现S1无响应。 排查是软件问题还是硬件问题:检查代码SPI初始化(时钟等)片选信号的处理(多从设备做冲突处理)没有问题后S1还是无......
  • kubernetes集群故障排查的几种方法
    1.kubectldescribe查看资源的详细信息,根据事件信息获取当前资源的状态,从而给出解决方案。[root@master231pod]#kubectlgetpodsNAMEREADYSTATUSRESTARTSAGEimage-resources-stress-040/1Pending02m13s[root@mas......
  • 配置bc网站源码搭建sysctl.conf文件修改内核参数
    配置BC网站源码与直接修改sysctl.conf文件以调整内核参数是两个不同的任务,但我可以为您提供关于如何修改sysctl.conf文件以调整内核参数的一般指导。请注意,直接修改系统内核参数可能会对系统稳定性和安全性产生重大影响,因此应谨慎进行。首先,关于sysctl.conf文件:定位文件:sysctl.co......
  • RT-Thread内核-RT-Thread SMP 介绍与移植
    转载原文 https://blog.csdn.net/kingpower2018/article/details/134365819 RT-Thread内核-RT-ThreadSMP介绍与移植①RT-Thread内核-RT-ThreadSMP介绍与移植RT-ThreadSMP介绍与移植多核启动CPU0启动流程次级CPU启动流程多核调度任务特性调度......
  • 使用 WPF + Chrome 内核实现高稳定性的在线客服系统复合应用程序
    对于在线客服与营销系统,客服端指的是后台提供服务的客服或营销人员,他们使用客服程序在后台观察网站的被访情况,开展营销活动或提供客户服务。在本篇文章中,我将详细介绍如何通过WPF+Chrome内核的方式实现复合客服端应用程序。先看实现效果客服程序界面中的聊天记录部分、文字......
  • kubelet 组件内存高排查方法
    1、查看服务进程,并跟踪程序系统调用pgrep kubelet#查看资源占用情况top-p 95786strace-cp95786#显示时间戳strace-tt-p95786 2、用pprof性能分析工具排查#安装go环境#启动代理kubectlproxy--port=8001--address=0.0.0.0curl-sK-vhttp://127.0.0.1:8001/......
  • eBPF程序如何跟内核进行交互
    一个完整的eBPF程序通常包含用户态和内核态两部分。其中,用户态负责eBPF程序的加载、事件绑定以及eBPF程序运行结果的汇总输出;内核态运行在eBPF虚拟机中,负责定制和控制系统的运行状态。对于用户态程序来说,它们与内核进行交互时必须要通过系统调用来完成。而对应到eBPF程序......
  • 如何排查常规软件问题 - 面向 Linux 初级用户的教程
    笔者从14年做开源软件以来,接触了众多Linux新手用户,这里我为这类用户总结了一些常见的问题排查方法,希望能帮助到大家。如果你已经工作多年,对于下面提到的思路和方法应该非常熟悉,如果对某一条感到陌生,咳咳,真的不太应该,赶紧补补吧。1.软件资料获取第一条是告诉大家去哪里获取......
  • usb相关的内核线程占用cpu较高
    1.在ls1028的平台上,升级内核版本,从5.4-->5.10,出现usb相关的内核线程占用cpu较高问题。/sys/bus/usb/devices/usbx/power/''其中,x为设备id文件:-power/wakeup--enable/disabled,代表是否支持remotewakeup功能,即系统唤醒功能。常见如鼠标,键盘等HID设......
  • Centos降内核版本
    #查看当前yum源中kernel版本yum--showduplicateslistkernelInstalledPackageskernel.x86_643.10.0-1160.el7@anacondakernel.x86_64......