BPF(Berkeley Packet Filter) 是由 Berkeley 学院于 1992 年开发的一款,主要用于提高抓包工具的性能。并于 2014 年被重写进 Linux 内核中,可以用于网络、性能观测、安全等方面。 [1]
BPF 是一种灵活且高效的技术实现,主要由 指令集(Instruction Set) 、 存储对象(Storage Objects maps) 和 帮助函数(Helper Functions) 构成。因为其 虚拟指令集规范(Virtual Instruction Set Specification) ,可以认为 BPF 是一个虚拟机,BPF 运行于 内核模式(Kernel Mode) 。BPF 基于事件(Events)运行: Socket Events
、 Tracepoints
、 USDT Probes
、kprobes
、uprobes
、perf_events
.
bpftrace
bpftrace
是一个基于 BPF 的追踪工具(Trace Tools),提供了高级别的编程能力,同时包含了命令行和脚本使用方式
bpftrace 命令行
bpftrace
命令详细帮助文档请查看 man bpftrace
,下表列出常用选项和参数
选项 |
说明 |
示例 |
-l [SEARCH] |
列出匹配的事件(Event/Probe),没有 SEARCH 表达式则列出所有的 Event。SEARCH 支持通配符 |
|
筛选指定的事件
# bpftrace -l "tracepoint:*exec*" tracepoint:libata:ata_exec_command tracepoint:sched:sched_kthread_work_execute_end tracepoint:sched:sched_kthread_work_execute_start tracepoint:sched:sched_process_exec tracepoint:syscalls:sys_enter_execve tracepoint:syscalls:sys_enter_execveat tracepoint:syscalls:sys_enter_kexec_file_load tracepoint:syscalls:sys_enter_kexec_load tracepoint:syscalls:sys_exit_execve tracepoint:syscalls:sys_exit_execveat tracepoint:syscalls:sys_exit_kexec_file_load tracepoint:syscalls:sys_exit_kexec_load tracepoint:workqueue:workqueue_execute_end tracepoint:workqueue:workqueue_execute_start tracepoint:writeback:writeback_exec
|
跟踪新启动的进程
执行以下命令,可以追踪系统中新启动的进程及其参数
# bpftrace -e 'tracepoint:syscalls:sys_enter_execve { join(args->argv); }' Attaching 1 probe... /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/rsync2Server.sh /usr/bin/rsync --progress -a -c -u --timeout=300 -z --password-file /home/oneuser/cwrsync_6.2.4_x64_free/rsync.client.pswd --exclude .idea --exclude rsync2Server.sh /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/ rsync@66.6.9.25::backup /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/rsync2Server.sh /usr/bin/rsync --progress -a -c -u --timeout=300 -z --password-file /home/oneuser/cwrsync_6.2.4_x64_free/rsync.client.pswd --exclude .idea --exclude rsync2Server.sh /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/ rsync@66.6.9.25::backup runc --root /var/run/docker/runtime-runc/moby --log /run/containerd/io.containerd.runtime.v2.task/moby/53daccf2e93fcf83831ce6773a495361afe9bb9694881269d1902f399f5c621c/log.json --log-format json --systemd-cgroup exec --process /tmp/runc-process3178774999 --detach --pid-file /run/containerd/io.containerd.runtime.v2.task/moby/53daccf2e93fcf83831ce6773a495361afe9bb9694881269d1902f399f5c621c/c73d8d4d46ac3995bdc1d7648a3562ddb4715a549a509f6125a7cfc4e88abe50.pid 53daccf2e93fcf83831ce6773a495361afe9bb9694881269d1902f399f5c621c runc init /watchtower --health-check /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/rsync2Server.sh /usr/bin/rsync --progress -a -c -u --timeout=300 -z --password-file /home/oneuser/cwrsync_6.2.4_x64_free/rsync.client.pswd --exclude .idea --exclude rsync2Server.sh /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/ rsync@66.6.9.25::backup /usr/lib/x86_64-linux-gnu/dcv/dcvpamhelper --stdout -s dcv /usr/libexec/sssd/krb5_child --debug-microseconds=0 --debug-timestamps=1 --debug-fd=28 --debug-level=0x0070 --chain-id=7187 --sss-creds-password --canonicalize --realm=OPSDEV666.COM --fast-ccache-gid=0 --fast-ccache-uid=0 /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/rsync2Server.sh /usr/bin/rsync --progress -a -c -u --timeout=300 -z --password-file /home/oneuser/cwrsync_6.2.4_x64_free/rsync.client.pswd --exclude .idea --exclude rsync2Server.sh /home/oneuser/cwrsync_6.2.4_x64_free/data/ops/ rsync@66.6.9.25::backup
|
参考链接
Systems Performance: Enterprise and the Cloud v2
脚注