聊聊风口上的 eBPF

eBPF 是一个用于访问 Linux 内核服务和硬件的新技术,由于其灵活性和高性能等特点,被迅速用于网络、出错、跟踪以及防火墙等多场景。目前国内已有少数企业开始尝试将 eBPF 引入生产实践,又拍云也是其中一个。专为技术开发者提供知识分享的 Open Talk 公开课邀请了又拍云开发工程师周晨约直播分享 eBPF 的学习经验与开发心得,并对其分享内容进行整理,下拉至文末点击阅读原文可回看原视频。

大家好,今天分享的主题是《eBPF 探索之旅》,围绕三部分展开:

  • eBPF 是什么

  • eBPF 能做什么

  • 如何编写 eBPF 程序

认识 eBPF

eBPF 是什么,从字面上来看是扩展伯克利包处理器,那伯克利包处理器是什么呢?

在此之前先来了解一个性能优秀的常用抓包工具:tcpdump

tcpdump

图中展示了两个常用指令

指令一:指定 IP 和端口,可以抓到 IP 为 220.173.103.227,端口为 80 的包

指令二:加上 grep,可以过滤出带有 route 字段的数据

那么 tcpdump 又是如何做到通过用户提供的规则处理网络上收到的包,再 copy 给用户的呢?如果放在用户层,就需要在系统里所有 socket 读写的时候做一层处理,把规则放上去,这样做难度太大。而 tcpdump 是基于 libpcap 库实现的,libpcap 能做到在驱动将包交给内核网络时,把包取过来,通过用户传给 libpcap 的规则将需要的网络包 copy 一份给用户,再把包传给内核网络栈,而之所以 libpcap 能做到这点全靠 BPF。

BPF

BPF 是基于寄存器虚拟机实现的,支持 jit,比基于栈实现的性能高很多。它能载入用户态代码并且在内核环境下运行,内核提供 BPF 相关的接口,用户可以将代码编译成字节码,通过 BPF 接口加载到 BPF 虚拟机中,当然用户代码跑在内核环境中是有风险的,如有处理不当,可能会导致内核崩溃。因此在用户代码跑在内核环境之前,内核会先做一层严格的检验,确保没问题才会被成功加载到内核环境中。

eBPF:BPF 的扩展

回到 eBPF,它作为一个 BPF 的扩展,都扩展了些什么呢?

  • 首先在功能上,不仅仅局限于网络,它能够借助 kprobe 获取内核函数运行信息&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值