eBPF 核心技术与实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
10452 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 26 讲/共 37 讲
eBPF 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

13|高性能网络实战(下):如何完善负载均衡器?

你好,我是倪朋飞。
上一讲,我带你使用 sockops 和 sk_msg 等套接字 eBPF 程序,在内核态对套接字进行转发,提升了负载均衡的性能。
对于网络优化来说,除了套接字 eBPF 程序,XDP 程序和 TC 程序也可以用来优化网络的性能。特别是 XDP 程序,由于它在 Linux 内核协议栈之前就可以处理网络包,在负载均衡、防火墙等需要高性能网络的场景中已经得到大量的应用。
XDP 程序在内核协议栈初始化之前运行,这也就意味着在 XDP 程序中,你并不能像在 sockops 等程序中那样直接获得套接字的详细信息。使用 XDP 程序加速负载均衡,通常也就意味着需要从头开发一个负载均衡程序。这是不是说 XDP 的使用就特别复杂,需要重新实现内核协议栈的很多逻辑呢?不要担心,XDP 处理过的数据包还可以正常通过内核协议栈继续处理,所以你只需要在 XDP 程序中实现最核心的网络逻辑就可以了
今天,我就以 XDP 程序为例,带你继续优化和完善负载均衡器的性能。

案例准备

跟上一讲类似,为了方便环境的重现,负载均衡器、Web 服务器以及客户端都还是运行在容器中,它们的 IP 和 MAC 等基本信息如下图所示:
执行下面的命令,启动这几个容器:
# Webserver
docker run -itd --name=http1 --hostname=http1 feisky/webserver
docker run -itd --name=http2 --hostname=http2 feisky/webserver
# Client
docker run -itd --name=client alpine
# LB
docker run -itd --name=lb --privileged -v /sys/kernel/debug:/sys/kernel/debug alpine
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用eBPF技术来优化负载均衡器的性能。作者首先回顾了上一讲中使用sockops和sk_msg等套接字eBPF程序对负载均衡性能进行优化的方法。接着,作者介绍了XDP程序和TC程序在优化网络性能方面的应用,特别是XDP程序在Linux内核协议栈之前处理网络包,已经在负载均衡和防火墙等高性能网络场景中得到广泛应用。然后,作者以XDP程序为例,详细介绍了如何使用XDP程序来优化和完善负载均衡器的性能。文章还提供了案例准备和如何使用XDP开发负载均衡器的步骤。通过本文,读者可以了解到eBPF技术在负载均衡器性能优化中的应用,以及如何使用XDP程序来开发高性能的负载均衡服务。文章内容详实,对eBPF技术的应用进行了深入讲解,对于想要了解和应用该技术的读者具有很高的参考价值。文章还通过性能测试展示了XDP程序相比套接字程序在平均每秒请求数上提升了18%,进一步证明了其优越性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《eBPF 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 莫名
    1. 挂在宿主机的 eth0 网卡,会导致宿主机网络受影响,最直接的影响是来自外部的 ssh 连接异常,之后再执行 ssh 也登不进宿主机。(原因是源 IP 不是 CLIENT_IP 时将目的 IP 直接修改为 CLIENT_IP,源 IP 无论如何均修改为 LOADBALANCER_IP,进来的数据包无法正常被接收与响应) 2. 目前的实现有些 hardcode,不利于扩展,负载均衡器通常运行配置多个 vip,每个 vip 对应若干真正的后端服务。觉得改进措施可以用 BPF map 类型存储,最好有个文本格式的配置文件,程序加载前解析这个配置文件,填充 BPF map。xdp 程序中根据 key(比如 vip 或者 UUID)查找真正的后端服务,如果能够找到则从中读取 IP、Mac 等信息。

    作者回复: 非常赞的答案👍 如果能把这些思路再都实现了就更好了😊

    2022-02-15
    12
  • L33K
    如果一个上层的大包被拆成一个多个包发过来,目前这种负载均衡方式是不是可能就有问题了?

    作者回复: 嗯 XDP是有一些限制的,具体可以参考这个PPT: https://lpc.events/event/11/contributions/939/attachments/771/1551/xdp-multi-buff.pdf

    2022-02-27
    3
  • Aiolos
    原生nginx和sock_ops+sk_msg优化均是2000QPS,但是使用XDP优化后降到了400QPS,请问这是什么原因,如何修正

    作者回复: 很有可能是用了虚拟机导致的。案例中使用的是通用挂载模式,实际生产中使用原生模式或卸载模式才能获得比较好的加速效果。

    2023-02-02归属地:英国
    1
  • codejw
    老师,如果有多个xdp程序如何挂载呢,我有多个.o都挂载到xdp

    作者回复: 如果是不同的网卡,多次调用挂载和加载的函数或者用 ip link set 命令都可以。但如果想挂载多个XDP程序到相同的网卡,那就需要5.10新增的freplace类型,具体细节可以参考 https://lpc.events/event/7/contributions/671/attachments/561/992/xdp-multiprog.pdf

    2022-02-16
    1
  • yuan
    老师好,我用如下命令编译静态链接的可执行文件时报错了,代码用的是github中的代码,请问有啥思路吗? 命令:clang -Wall -O2 -g xdp-proxy-v2.o -static -lbpf -lelf -lz -o xdp-proxy-v2 结果:/usr/bin/ld: cannot find -lbpf /usr/bin/ld: cannot find -lelf /usr/bin/ld: cannot find -lz /usr/bin/ld: cannot find -lc clang-13: error: linker command failed with exit code 1 (use -v to see invocation) 另外用ip link挂载也不行 命令:sudo ip link set dev eth0 xdpgeneric object xdp-proxy-v2.bpf.o sec xdp 结果: BTF debug data section '.BTF' rejected: Invalid argument (22)! - Length: 1817 Verifier analysis: ... ... Prog section 'xdp' rejected: Permission denied (13)! - Type: 6 - Instructions: 151 (0 over limit) - License: GPL Verifier analysis: ... ... processed 25 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1 Error fetching program/map! 内核版本信息如下: 5.14.10-300.fc35.x86_64 Fedora release 35 (Thirty Five)

    作者回复: 缺少依赖库,参考根目录的Readme把依赖库安装一下

    2022-03-01
    2
  • 乌拉呆zyb
    倪老师,请问为什么将XDP eBPF程序挂载上去之后,优化效果反而大大地下降了?优化前 Requests/sec 是7500左右;XDP优化后 Requests/sec 是250 左右;代码都是github上的代码;两个版本的都试过了,都是反向优化,不知道为啥 ^~^
    2022-05-04
    1
    4
  • 为了维护世界和平
    倪老师你好,使用XDP 速度慢了,这大概什么原因呢 / # wrk -c100 "http://172.17.0.5" Running 10s test @ http://172.17.0.5 2 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 272.26ms 386.46ms 1.70s 86.32% Req/Sec 122.51 90.04 580.00 73.65% 2483 requests in 10.06s, 441.31KB read Socket errors: connect 0, read 0, write 0, timeout 53 Requests/sec: 246.73 Transfer/sec: 43.85KB
    2022-07-20
    2
  • aith
    XDP程序把数据包随机调度到某个Webserver,没有会话保持,会不会导致同一次请求的数据包,发送到不同的后端Webserver上面,从而不能正常相应?
    2022-05-24
    1
    2
  • 乌拉呆zyb
    倪老师,还想请教您一个问题: 加载XDP eBPF程序后,curl "http://172.17.0.5" 测试正常,有负载均衡能力;但 wrk -c 100 "http://172.17.0.5" 的测试结果中有Socker errors的连接超时的报错如下: / # wrk -c 100 "http://172.17.0.5" Running 10s test @ http://172.17.0.5 2 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 274.75ms 384.76ms 1.70s 86.88% Req/Sec 127.44 86.42 530.00 69.19% 2640 requests in 10.09s, 469.22KB read Socket errors: connect 0, read 0, write 0, timeout 56 Requests/sec: 261.64 Transfer/sec: 46.50KB / #
    2022-05-04
    2
    2
  • Bachue Zhou
    这个程序对 libbpf 的版本要求很高啊,我这边用的是 Ubuntu 22.04 都不行,很多 symbol 找不到的。
    2023-04-13归属地:上海
    1
    1
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部