小工具知识网

当前位置: 首页 > 行业知识 > ebpf流拥塞控制算法使用笔记

行业知识

ebpf流拥塞控制算法使用笔记

2026-11-04 14:33:43 来源:互联网转载

一、原理

首先在内���态收集TCP信息,并通过eBPF发送给用户态。

然后使用Antelope来选择合适的CC算法

最后将CC算法传输给内核(bpf_map),并在内核中切换拥塞控制算法

1、收集数据流信息

通过 saddr,daddr,lport, dport 来区分每一个流

每个流收集 srtt, mdev, min_rtt, packets_out, total_retrans, pacing_rate, TCP状态等信息记录在sock结构体中

每个ACK到达时,生命周期函数会触发把信息通过eBPF发送到用户态

2、传输信息

内核->用户态:数据格式为ebpf_hash

用户态-> 内核:数据格式为bpf_map

bpf_map:

key- IP+flow ID

value - CC mechanism

3、更换拥塞控制算法

使用eBPF切换TCP拥塞控制。

首先我们要把编译后的eBPF程序放到内核中去,在eBPF程序中我们使用bpf_getsockopt和bpf_setsockopt在tcp_ebpf库中切换相应的CC 策略。且我们设置了三个生命周期函数:tcp_init_transfer, tcp_sendmsg, tcp_close_state.

① tcp_init_transfer: eBPF程序会基于IP地址设置一个默认的拥塞控制策略。(section VB)

② tcp_sendmsg: 根据当前预测状态设置一个新的拥塞控制策略

③ tcp_close_state: 删除该流在map中维护的相关键值对,并重启内核(rebuild the kernel, reboot the system)

在线预测模块中,每当N个ACK到达时,预测进程被触发,如果发现有一个新的适合的拥塞控制,会更新ebpf_map,加入(IP+flowID,CC mechanism)的键值对。如果所有流的拥塞控制算法和当前一样,那么map就是空的。

tcp_sendmsg生命周期函数就会检查当前map是不是空的,如果有新的就需要设置对应流的拥塞控制算法。为了避免拥塞控制算法切换的太过频繁,我们只设置连续M次推荐的拥塞控制算法。

二、运行步骤:

1、 安装个BCC

首先安装一下依赖:

sudo apt-get -y install bison build-essential cmake flex git libedit-dev libllvm6.0 llvm-6.0-dev libclang-6.0-dev zlib1g-dev libelf-dev libfl-dev python3-distutils

注意:

如果执行容易报错就分开装,反正就是 sudo apt-get -y install xxx (-y只是让你不用自己输yes,不写也行)。

如果发生以下错误,参考链接

The following packages have unmet dependencies:

python : PreDepends: python-minimal (= 2.7.11-1) but it is not going to be installed

Depends: libpython-stdlib (= 2.7.11-1) but it is not going to be installed

E: Unable to correct problems, you have held broken packages.

注意这里需要 cmake版本>=3.1 , gcc版本>=8 (**血淋淋的教训,g++版本同样也要在8以上,我一直都是gcc -v在8以上没有管g++)

然后安装:

git clone https://github.com/iovisor/bcc.git

mkdir bcc/build; cd bcc/build

cmake …

make

sudo make install

cmake -DPYTHON_CMD=python3 … # build python3 binding

pushd src/python/

make

sudo make install

popd

这个需要记录一下:参考链接

血淋淋的教训,llvm版本要在11以上!!!!!!!!!!!!!!!!!!!!!!!!!!!!!自己百度查一下怎么换成11

上一篇:Dedecms页面编辑秘籍,轻松掌握修改教程,成为页面编辑高手!

下一篇:MySQL 开启配置binlog以及通过binlog恢复数据