207. eBFP

简介

  • 基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,能够在 Linux 内核内运行即时本地编译的 “BPF 程序”,并能访问内核功能和内存的一个子集
  • 基于内核的虚拟机(KVM),是一个模块,目的是使 Linux 能够作为其他虚拟机的管理程序
  • JIT(Just In Time)的中文意思是 即时编译,主要为了解决虚拟机运行中间码时效率不高的问题

安装

  1. Linux 内核:由于eBPF是内核技术,因此您需要具备较新版本的Linux内核(建议至少在 5.15 以上),以支持eBPF功能。建议使用最新的 Ubuntu 版本(例如 Ubuntu 23.10)以获得最佳的学习体验,较旧的内核 eBPF 功能支持可能相对不全。
  2. LLVM 和 Clang:这些工具用于编译eBPF程序。

eBPF程序开发流程

  1. 使用 C 语言开发一个 eBPF 程序;
  2. 借助 LLVM 把 eBPF 程序编译成 BPF 字节码;
  3. 通过 bpf 系统调用,把 BPF 字节码提交给内核;
  4. 内核验证并运行 BPF 字节码,并把相应的状态保存到 BPF 映射中;
  5. 用户程序通过 BPF 映射查询 BPF 字节码的运行状态。

两种一般eBPF程序的开发方式

  1. BCC 全称为 BPF Compiler Collection, (python 库) 包含了完整的编写、编译、和加载 BPF 程序的工具链,以及用于调试和诊断性能问题的工具
  2. 可以在 BCC 上使用 Python、Lua 等高级语言进行编程。
  3. 只需要使用 C 来设计内核中的 BPF 程序,其余包括编译、解析、加载等工作在内,均可由 BCC 完成。
  4. BCC通常用在开发复杂的eBPF程序中,其内置的各种小工具也是目前应用最为广泛的eBPF小程序。不过,BCC也不是完美的,它依赖于LLVM和内核头文件才可以动态编译和加载eBPF程序。

BCC工具包

性能优化

出现卡顿等问题

  1. 网络
  2. 性能

难点

  • 如何找到性能瓶颈, 即如何找到问题

流程

  1. 获取数据
  2. 处理数据: 可视化
  3. 根据数据优化

优化工具

  1. 封装: 加一层

  2. 自动化工程

    处理重复低效的动作: 集成成一条命令

优化思想

  1. 调度管理

    处理函数间的同步关系, 即依赖关系: a的输出为b的输入

  2. 优化函数

    找到最忙的函数, 即性能决定性函数, 优化它

    函数调用栈->函数的调用流程

    找到关键分支并搞懂, 然后解决问题, 其他的分支等遇到后再具体分析

  3. 优化核

    充分利用未利用核资源

    注意采样频率, 频率越低, 则精度越差, 从而可能导致误判

  4. 冗余调用

  5. 函数耗时

    1. 太高: 优化, 因为收益较高
    2. 太低: 优化, 想一下是否有存在的意义
  6. cache

    1. cache
  7. 选择好工具

  • 应用

    • 软件源码
    • 编译器
  • 系统

    • 运行时环境
    • 功能库
  • 架构

    • 操作系统
    • 指令集 流水先/缓存
  • 工艺

    • cpu

关于工具

  1. 开源工具

    对诉求难以响应

  2. 查找工具

    如何快速找到合适的工具, 以及如何快速了解工具的功能, 从而判定是否符合自己的需求

    • 请教大佬, 看有没有合适的, 和问了解知识的人, 从而了解工具的核心功能
    • 华为知识库

    系统学习方法

    • 经验
    • 思维导图, 脉络, 逻辑, 软能力, 结构化思维方式, 头脑风暴
    • 梯子型->纵深->拓展

    思维方法

    • 在解决问题中学习到了什么方法

    • 搜->看论文->看有没有一样的和类似的->如果没有, 就问导致

    • 问题转换->大->小: 抽象能力, 分解转换

    • 定制

能力

  1. 项目要求低

  2. 学习新知识新业务的能力

    基础理论知识