目录

文章目录

  • 目录
  • eBPF 的可观测性架构
  • 版本支持
  • BCC
    • 60s 系列 BPF 版本
    • 生成火焰图
    • 排查网络调用来源

eBPF 的可观测性架构

BPF 观测技术相关的程序程序类型可能是 kprobes、uprobes、tracepoint、perf_events 中的一个或多个,其中:

  • kprobes:实现内核中的动态跟踪。kprobes 可以跟踪到 Linux 内核中的导出函数入口或返回点,但是不是稳定 ABI 接口,可能会因为内核版本变化导致,导致跟踪失效。
  • uprobes:用户级别的动态跟踪。与 kprobes 类似,只是跟踪用户程序中的函数。
  • tracepoints:内核中静态跟踪。tracepoints 是内核开发人员维护的跟踪点,能够提供稳定的 ABI 接口,但是由于是研发人员维护,数量和场景可能受限。
  • perf_events:定时采样和 PMC。

内核中运行的 BPF 字节码程序可以使用两种方式将测量数据回传至用户空间:

  • maps 方式:可用于将内核中实现的统计摘要信息(比如测量延迟、堆栈信息)等回传至用户空间;
  • perf-event:可用于将内核采集的事件实时发送至用户空间,用户空间程序实时读取分析;

版本支持

由于 eBPF 还在快速发展期,内核中的功能也日趋增强,一般推荐基于 Linux 4.4+(4.9 以上会更好)内核的来使用 eBPF。部分 Linux Event 和 BPF 版本支持见下图。

BCC

IO Visor 项目的 BCC 工具,为性能分析和观察提供了更加丰富的工具集。

60s 系列 BPF 版本

生成火焰图

火焰图是帮助我们对系统耗时进行可视化的图表,能够对程序中那些代码经常被执行给出一个清晰的展现。

Brendan Gregg 是火焰图的创建者,他在 GitHub 上维护了一组脚本可以轻松生成需要的可视化格式数据。使用 BCC 中的工具 profile 可很方面地收集道 CPU 路径的数据,基于数据采用工具可以轻松地生成火焰图,查找到程序的性能瓶颈。

/usr/share/bcc/tools/profile -h
usage: profile [-h] [-p PID | -L TID] [-U | -K] [-F FREQUENCY | -c COUNT] [-d][-a] [-I] [-f] [--stack-storage-size STACK_STORAGE_SIZE][-C CPU][duration]Profile CPU stack traces at a timed intervalpositional arguments:duration              duration of trace, in secondsoptional arguments:-h, --help            show this help message and exit-p PID, --pid PID     profile process with this PID only-L TID, --tid TID     profile thread with this TID only-U, --user-stacks-onlyshow stacks from user space only (no kernel spacestacks)-K, --kernel-stacks-onlyshow stacks from kernel space only (no user spacestacks)-F FREQUENCY, --frequency FREQUENCYsample frequency, Hertz-c COUNT, --count COUNTsample period, number of events-d, --delimited       insert delimiter between kernel/user stacks-a, --annotations     add _[k] annotations to kernel frames-I, --include-idle    include CPU idle stacks-f, --folded          output folded format, one line per stack (for flamegraphs)--stack-storage-size STACK_STORAGE_SIZEthe number of unique stack traces that can be storedand displayed (default 16384)-C CPU, --cpu CPU     cpu number to run profile onexamples:./profile             # profile stack traces at 49 Hertz until Ctrl-C./profile -F 99       # profile stack traces at 99 Hertz./profile -c 1000000  # profile stack traces every 1 in a million events./profile 5           # profile at 49 Hertz for 5 seconds only./profile -f 5        # output in folded format for flame graphs./profile -p 185      # only profile process with PID 185./profile -L 185      # only profile thread with TID 185./profile -U          # only show user space stacks (no kernel)./profile -K          # only show kernel space stacks (no user)

profile 配合 FlameGraph 可以轻松帮我们绘制出 CPU 使用的火焰图。

$ profile -af 30 > out.stacks01
$ git clone https://github.com/brendangregg/FlameGraph
$ cd FlameGraph
$ ./flamegraph.pl --color=java < ../out.stacks01 > out.svg

排查网络调用来源

在生产场景下,会有些特定场景需要抓取连接到外网特定地址的程序,这时候我们可以采用 BCC 工具集中的 tcplife 来定位。

/usr/share/bcc/tools/tcplife -h
usage: tcplife [-h] [-T] [-t] [-w] [-s] [-p PID] [-L LOCALPORT][-D REMOTEPORT]Trace the lifespan of TCP sessions and summarizeoptional arguments:-h, --help            show this help message and exit-T, --time            include time column on output (HH:MM:SS)-t, --timestamp       include timestamp on output (seconds)-w, --wide            wide column output (fits IPv6 addresses)-s, --csv             comma separated values output-p PID, --pid PID     trace this PID only-L LOCALPORT, --localport LOCALPORTcomma-separated list of local ports to trace.-D REMOTEPORT, --remoteport REMOTEPORTcomma-separated list of remote ports to trace.examples:./tcplife           # trace all TCP connect()s./tcplife -t        # include time column (HH:MM:SS)./tcplife -w        # wider colums (fit IPv6)./tcplife -stT      # csv output, with times & timestamps./tcplife -p 181    # only trace PID 181./tcplife -L 80     # only trace local port 80./tcplife -L 80,81  # only trace local ports 80 and 81./tcplife -D 80     # only trace remote port 80

通过在机器上使用 tcplife 来获取的网络连接信息,我们可以看到包括了 PID、COMM、本地 IP 地址、本地端口、远程 IP 地址和远程端口,通过这些信息非常方便排查到连接到特定 IP 地址的程序,尤其是连接的过程非常短暂,通过 netstat 等其他工具不容易排查的场景。

$ /usr/share/bcc/tools/tcplife
PID   COMM             IP LADDR                      LPORT RADDR                  RPORT  TX_KB  RX_KB MS
1776  blackbox_export  4  169.254.20.10              35830 169.254.20.10          53       0      0 0.36
27150 node-cache       4  169.254.20.10              53    169.254.20.10          35830    0      0 0.36
12511 coredns          4  127.0.0.1                  58492 127.0.0.1              8080     0      0 0.32
...

如果我们想知道更加详细的 TCP 状态情况,那么 tcptracer 可展示更加详细的 TCP 状态,其中 C 代表 Connect X 表示关闭, A 代表 Accept。

$ /usr/share/bcc/tools/tcptracer
Tracing TCP established connections. Ctrl-C to end.
T  PID    COMM             IP SADDR            DADDR            SPORT  DPORT
C  21066  ilogtail         4  10.81.128.12     100.100.49.128   40906  80
X  21066  ilogtail         4  10.81.128.12     100.100.49.128   40906  80
C  21066  ilogtail         4  10.81.128.12     100.100.49.128   40908  80
X  21066  ilogtail         4  10.81.128.12     100.100.49.128   40908  80

tcpstates 还能够展示出来 TCP 状态机的流转情况:

$ /usr/share/bcc/tools/tcpstates
SKADDR           C-PID C-COMM     LADDR           LPORT RADDR           RPORT OLDSTATE    -> NEWSTATE    MS
ffff9fd7e8192000 22384 curl       100.66.100.185  0     52.33.159.26    80    CLOSE       -> SYN_SENT    0.000
ffff9fd7e8192000 0     swapper/5  100.66.100.185  63446 52.33.159.26    80    SYN_SENT    -> ESTABLISHED 1.373
ffff9fd7e8192000 22384 curl       100.66.100.185  63446 52.33.159.26    80    ESTABLISHED -> FIN_WAIT1   176.042

XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性相关推荐

  1. 基于arm64的linux kernel cpu 初始化分析

    从start_kernel开始分析 init/main.cstart_kernel|smp_setup_processor_id|setup_arch|setup_nr_cpu_ids|setup_p ...

  2. 深入浅出 eBPF: (Linux/Kernel/XDP/BCC/BPFTrace/Cillium)

    [BPF入门系列-1]eBPF 技术简介 | 深入浅出 eBPF[BPF入门系列-1]eBPF 技术简介https://www.ebpf.top/post/bpf_intro_blog/ 目录 eBP ...

  3. Linux中基于eBPF的恶意利用与检测机制(rootkit、驱动)

    目录 前言 现状分析 海外资料 国内资料 eBPF技术恶意利用的攻击原理 网络层恶意利用 Linux系统运行时恶意利用 综述 检测防御 运行前 运行时 运行后 防御 工程实现 系统兼容性 CO-RE ...

  4. 基于 eBPF 的云原生可观测性深度实践

    本文整理自云杉网络 DeepFlow 产品负责人向阳在 QCon 2023 的演讲分享,主题为 "基于 eBPF 的云原生可观测性深度实践". 分享从四个方面展开.第一部分回顾分布 ...

  5. 基于eBPF的Linux沙盒文件系统SandFS

    好玩的东西又来咯! 我一向自诩自己是Netfilter的骨灰级业余玩家,但对于文件系统,我终究连入门都没有曾经. 如果把Netfilter嫁接在VFS上会怎样? 我没有亲自去做,因为我对VFS的API ...

  6. 深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统

    作者:李煌东.炎寻 摘要 阿里云目前推出了面向 Kubernetes 的一站式可观测性系统,旨在解决 Kubernetes 环境下架构复杂度高.多语言&多协议并存带来的运维难度高的问题,数据采 ...

  7. 基于eBPF的云原生可观测性开源工具Kindling之Kindling-agent 性能测试评估

    背景 Kindling-agent是基于eBPF的云原生可观测性开源工具Kindling中采集端的组件,能够通过采集和分析内核事件,获取运行于同一宿主机上的其他服务的业务.网络等指标.其工作模式是在主 ...

  8. 首届中国eBPF大会分享---基于eBPF的内核漏洞检测实践

    背景 随着智能化.数字化.云化的飞速发展,全球基于Linux系统的设备数以百亿计,而这些设备的安全保障主要取决于主线内核的安全性和健壮性.传统的内核安全存在周期长.效率低以及版本适配的问题,有没有实用 ...

  9. Cilium 1.7发布:Hubble UI、全集群网络策略、基于eBPF的Direct Server Return以及更多

    在这里,我们要向大家高兴地宣布,Cilium 1.7版本正式发布了!在本轮更新周期当中,由141位开发者组成的项目社区共完成了1551项提交,而且很多朋友是第一次为Cilium项目提交贡献. Hubb ...

最新文章

  1. 如何从Android中的另一个应用程序启动活动
  2. 学好python可以做什么兼职-自学Python能干些什么副业
  3. 日期相减 python_如果将excel的数字转化为日期(高级教程)
  4. Oracle多表连接查询
  5. 域名绑定html网站吗,使用Coding搭建html纯静态网站后绑定域名+SSL证书
  6. topic:开发人员眼中的RIA,基于Flash实现
  7. NTKO文档控件常见报错信息集合
  8. 摄影测量前方交会编程实现
  9. 2022 Google IO大会新技术
  10. 310实验室一点补充
  11. 采用FPGA开发高清相机sensorISP芯片要点分析
  12. C/C++ 简单排序之冒泡排序
  13. Android 系统原生TTS使用
  14. sox处理mp3_SoX — 音频处理工具里的瑞士军刀
  15. QQ空间迁移_【SRX550_HA_以及端口绑定高可靠性尝试】
  16. 汇编命令及OD常用命令及断点设置
  17. 软件工程可行性研究报告
  18. springboot瘦身打包
  19. 【VirtualAPP 双开系列07】第三方 APP Service、Provider 加载分析
  20. 《Adobe After Effects CS4经典教程》——1.10 控制用户界面的亮度

热门文章

  1. Xcode代码不提示或提示慢
  2. mysql删除没有索引页_InnoDB中没有主键是如何运转的
  3. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
  4. 查看python 3.x 关键字 (保留字)(预留字)
  5. 全息物体也能触摸到!约翰·霍普金斯大学研究者使用脑机接口让患者感受到全息物体...
  6. 脑机接口,风口还是入口?
  7. 你在听音乐的时候能否感受到背后有“寒意“?
  8. eeglab中文教程系列(3)-绘制通道光谱图
  9. 特斯拉中国召回20万辆问题汽车:存在硬件风险,部分引擎盖可能意外打开
  10. 用上这个Python的Docker正式版镜像,你也能成为容器高玩