Skip to content

Latest commit

 

History

History
157 lines (149 loc) · 7.54 KB

ebpf.md

File metadata and controls

157 lines (149 loc) · 7.54 KB

eBPF introduction

kubecon 2020 eBPF 相关 session

  • Beyond the Buzzword BPF’s Unexpected Role in Kubernetes
  • Designing a gRPC Interface for Kernel Tracing with eBPF
  • eBPF and Kubernetes Little Helper Minions for Scaling Microservices —— Cilium
  • Hubble - eBPF Based Observability for Kubernetes
  • Tutorial Using BPF in Cloud Native environments -- Agenda
  • what is eBPF?
  • what can eBPF do?

what is eBPF?

Linux 内核中一个高度灵活与高效的类虚拟机组件, 它以一种安全的方式在许多 hook 点执行受限的 bytecode。

Note: eBPF in kernel -> js in HTML, actually more like the v8 engine to run js code.

the virtual machine with a total of 11 64-bit registers, a program counter and a 512 byte fixed-size stack.

maximum instruction limit per eBPF program is restricted to 4096.

  • r0: stores return values, both for function calls and the current program exit code

  • r1-r5: used as function call arguments, upon program start r1 contains the "context" argument pointer

  • r6-r9: these get preserved between kernel function calls

  • r10: read-only pointer to the per-eBPF program 512 byte stack --

  • BPF map:高效的 key/value 仓库

  • 辅助函数(helper function):可以更方便地利用内核功能或与内核交互

  • 尾调用(tail call):高效地调用其他 BPF 程序

  • 支持 BPF offload(例如 offload 到网卡)的基础设施

  • ... -- arch BPF: Tracing and More, p5 -- eBPF hooks eBPF - Rethinking the Linux Kernel, p11 -- Trivia

  • eBPF 是近年来linux的重大特性,一开始linus拒绝合入,后来将commit拆分后才合入。

  • eBPF 能合入linux主线主要归功于在kernel内部建立一系列向后兼容的抽象,正如kernel和userspace之间的接口一样。

  • eBPF 近年来已经成为了kernel中最活跃的子系统。 -- extended readings

  • BPF Features by Linux Kernel Version

  • an ebpf overview


what can eBPF do?

  • networking
  • tracing
  • more...

replace netfilter/iptables

iptables的问题:

-- how eBPF solve this?


accelerate sidecar

Cilium's service LB

东西向流量在Socket层的BPF处理

  • 将 Service 的 IP:Port 映射到具体的后端的 PodIP:Port,并做负载均衡。
  • 当应用发起 connectsendmsgrecvmsg 等请求(系统调用)时,拦截这些请求,并根据请求的 IP:Port 映射到后端 pod,直接发送过去。反向进行相反的变换。
  • 不需要包级别(packet leve)的地址转换(NAT)。在系统调用时,还没有创建包,因此性能更高。
  • 省去了 kube-proxy 路径中的很多中间节点(intermediate node hops) -- 南北向流量在XDP或者tc层的BPF处理
  • 与 socket 层的差不多,将 Service 的 IP:Port 映射到后端的 PodIP:Port
  • 进行DNAT转换,可以在XDP做也可以在tc做,XDP做性能更高 --
  • 将东西向流量放在离 socket 层尽量近的地方做。
  • 将南北向流量放在离驱动(XDP 和 tc)层尽量近的地方做。

Note: kube-proxy 不管是 iptables 还是 ipvs 模式,都在处理软中断上消耗了大量 CPU。

extended readings


bcc & bpftrace

用户可以写一个python程序和一个c程序

  • python程序,用户态运行,收集数据输出。
  • c程序会编译后加载到kernel中,收集event或者写入map。 -- bcc tools bcc_tracing_tools_2019 -- off-cpu analysis

where time is spent waiting while blocked on I/O, locks, timers, paging/swapping, etc.

off cpu thread states

example of off&wake

ebpf_tracing_landscape_jan2019

bpftrace probes bpftrace_probes_2018

extended readings


Thanks!

--