13|高性能网络实战(下):如何完善负载均衡器?
案例准备
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何使用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-1512 - L33K如果一个上层的大包被拆成一个多个包发过来,目前这种负载均衡方式是不是可能就有问题了?
作者回复: 嗯 XDP是有一些限制的,具体可以参考这个PPT: https://lpc.events/event/11/contributions/939/attachments/771/1551/xdp-multi-buff.pdf
2022-02-273 - 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-161 - 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-012 - 乌拉呆zyb倪老师,请问为什么将XDP eBPF程序挂载上去之后,优化效果反而大大地下降了?优化前 Requests/sec 是7500左右;XDP优化后 Requests/sec 是250 左右;代码都是github上的代码;两个版本的都试过了,都是反向优化,不知道为啥 ^~^2022-05-0414
- 为了维护世界和平倪老师你好,使用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.85KB2022-07-202
- aithXDP程序把数据包随机调度到某个Webserver,没有会话保持,会不会导致同一次请求的数据包,发送到不同的后端Webserver上面,从而不能正常相应?2022-05-2412
- 乌拉呆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-0422
- Bachue Zhou这个程序对 libbpf 的版本要求很高啊,我这边用的是 Ubuntu 22.04 都不行,很多 symbol 找不到的。2023-04-13归属地:上海11