bild 部署
#1. bild 部署
#1.1 bild 功能
- 流量负载均衡,基于eBPF/XDP技术,将N(N>=1)个指定源接口(src_tap_interfaces)上 接收到的(ingress)/发送出去的(egress)流量,通过对称哈希,均摊到其他M (M>=1)个的指定目的接口(dst_tap_interfaces)的接收通道(ingress)/发送 通道(egress),支持double VLAN,erspan隧道解封装,哈希支持TCP/UDP/TCP6/UDP6 的五元组计算。
- 物理网卡性能优化。解决复杂的网络场景下,对物理网卡特定优化使其达到更好的性能。包含:
- 网卡RSS支持对称哈希
- 网卡队列中断CPU绑定
- 网卡队列数量设置
- 环形rx描述符的大小设置
- 设置流量类型(TCP,UDP等)基于五元组的均衡分摊
- 支持XDP CPU Redirect功能解决double vlan/erspan/vxlan类型数据无法均衡到不同的CPU,造成某一个CPU过载的情景。
#1.2 网卡驱动升级
点击查看
只针对于Intel X722 10Gb,Intel X710 10Gb 网卡使用i40e驱动并且使用XDP CPU Redirect做优化的情况,需要升级驱动到 version: 2.11.25。其他场景不需要升级。
安装
- 使用
ethtool -i <接口名字>查看 i40e 版本,如果不是2.11.25则进行升级。 - 使用控制器 /usr/local/deepflow/yum/7/ 下的i40e-2.11.25-1.x86_64.rpm 进行安装升级,安装命令如下:
yum --disablerepo=* localinstall -y ./i40e-2.11.25-1.x86_64.rpm1 - 生效
准备脚本:i40e_update.sh
#! /bin/bash rmmod i40e modprobe i40e systemctl restart network1
2
3
4使用脚本进行实际替换驱动,注意:这里使用脚本是为了防止要升级的网卡作为管理接口,手动生效后IP会丢失使得SSH链接失败的情况,解决办法是使用nohup方式执行>脚本。
chmod +x i40e_update.sh nohup ./i40e_update.sh &1
2- 使用
#1.3 CPU 隔离
点击查看
只针对于物理网卡使用XDP CPU Redirect做优化的情况,其他场景不需要CPU隔离。
- 为了排除系统任务调度对物理网卡收包的干扰,需要隔离物理核心。
隔离的CPU核心,要和物理网卡在同一个NUMA节点上。可以通过下面方法获得物理网卡所在的NUMA节点:
# 如:物理网卡为p1p2,先得到PCI地址: ls /sys/class/net/p1p2/subsystem/ -al | grep p1p2 | awk -F'/net' '{print $1}' | awk -F'/' '{print $NF}' 0000:41:00.1 lspci -vvv -s 0000:41:00.1 | grep "NUMA node:" NUMA node: 11
2
3
4
5获得逻辑核和物理核的对应表
# 如得到NUMA node: 1的所有逻辑核和物理核的对应表 for cpu in `ls /sys/bus/node/devices/node1/cpu*/topology/core_id`; do echo "$cpu <-> `cat $cpu`"; done /sys/bus/node/devices/node1/cpu11/topology/core_id <-> 5 /sys/bus/node/devices/node1/cpu13/topology/core_id <-> 0 /sys/bus/node/devices/node1/cpu1/topology/core_id <-> 0 /sys/bus/node/devices/node1/cpu23/topology/core_id <-> 5 ......1
2
3
4
5
6
7隔离整个物理核,如隔离core 5,就需要把逻辑核 cpu11,cpu23 隔离即可。根据经验值来判断隔离core的数量。
核心隔离数量和性能对照:
| 离物理核心数量 | 收包PPS |
|---|---|
| 2 | 1.11M |
| 3 | 1.76M |
| 4 | 2.51M |
- 隔离操作
在文件
/boot/grub2/grub.cfg中找到menuentry 'CentOS Linux (4.19.17-1.el7.x86_64) 7 (Core)'在linux16行末添加“isolcpus=要隔离的CPU列表”,例如:linux16 /vmlinuz-4.19.17-1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=256M rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet spectre_v2=off nopti pti=off idle=poll LANG=en_US.UTF-8 iommu=pt isolcpus=11,231添加
isolcpus=11,23,其中的 11,23 即是core 5的两个逻辑核心。注意:需要重启机器才能使隔离生效。
#1.4 部署和配置
点击查看
注意:部署要求 CentOS 7, linux 4.19 内核。
如果启用bild对采集口做nic_optimize(XDP CPU重定向功能)必须使用RPM部署方式运行采集器进程(不能使用容器部署方式)。这是因为k8s的calico组件使得采集口的xdp程序丢失,使得bild优化失效。
#1.4.1 容器环境下部署
- 获取 bild 和 iproute 安装包
- 从 ISO 中的
extra-artifaces/df-bild-package获取。
- 从 ISO 中的
- 安装
yum --disablerepo=* localinstall -y ./{iproute,bild}-*.rpm1
说明:bild 对系统包 glibc 有一定的要求,需要 >=2.17-260 如果版本过低需要通过 yum update glibc 进行更新。
- 创建虚接口
- 在文件
/sbin/ifup-local追加下面,添加权限并执行chmod +x /sbin/ifup-local; sh /sbin/ifup-localfor i in {0..7} do /sbin/ip link add tap-bild-$i type dummy /sbin/ip link set tap-bild-$i promisc on /sbin/ip link set dev tap-bild-$i up done1
2
3
4
5
6
- 在文件
- 修改配置文件
/etc/bild.conf(下面举例)ebpf: - src_tap_interfaces: em1 src_direction: 0 dst_tap_interfaces: tap-bild-0,tap-bild-1,tap-bild-2,tap-bild-3,tap-bild-4,tap-bild-5,tap-bild-6,tap-bild-7 dst_direction: 01
2
3
4
5 - 启动 bild
systemctl enable bild.service systemctl start bild.service1
2 - 修改 trident 采集接口的配置(修改成上面建立的8个虚拟接口)并重启 trident。
#1.4.2 配置网卡优化功能
根据实际需求可以对网卡做对称哈希,XDP CPU 重定向等优化。根据实际情况可以对某个节点单独修改
/etc/bild.conf文件。nic_optimize: - interface: p1p2 rss_channel_count: 1 hi_cpu_list: 2 xdp_cpu_redirect: true xdp_cpu_redirect_list: 5,6,7,8,9,101
2
3
4
5
6以上配置是样例,如果要对网卡做优化需要
增加上面配置项,具体配置含义参照NIC优化配置章节。某个节点添加配置后,重启bild。
systemctl restart bild
#1.4.3 基本操作
启动
- systemctl start bild
停止
- systemctl stop bild
查看状态
- systemctl status bild
- bild-ctl status
版本信息
- bild-ctl version
#1.4.4 配置文件 /etc/bild.conf 说明
#1.4.4.1 接口均摊配置
ebpf:
- src_tap_interfaces: lo
src_direction: 0
dst_tap_interfaces: lo
dst_direction: 0
2
3
4
5
- src_tap_interfaces
- 源接口
- 最大支持32个接口
- 接口直接用
,分割,且不能有空格、tab等空白字符
- dst_tap_interfaces
- 目的接口
- 最大支持128个接口,因为trident目前最多支持16个接口,所以实际设置接口的数量不要超过16。
- 接口直接用
,分割,且不能有空格、tab等空白字符
- src_direction
- 源接口流量方向
- 0: ingress,1: egress
- dst_direction
- 目的接口流量方向
- 0: ingress,1: egress
#1.4.4.2 NIC 优化配置
nic_optimize:
- interface: p1p2
rss_channel_count: 1
hi_cpu_list: 2
xdp_cpu_redirect: true
xdp_cpu_redirect_list: 5,6,7,8,9,10
2
3
4
5
6
如果不进行网卡优化可注释掉上面配置选项,默认:不启用网卡优化,处于注释状态。
interface
要优化配置接口的名称,如:
interface: p1p2这个接口是src_tap_interfaces中的一个,不能写多个如:
interface: p1p2,p2p1,如果要进行多个接口做优化可以如下配置:nic_optimize: - interface: p1p2 ...... - interface: p1p1 ......1
2
3
4
5
rss_channel_count
- RSS硬件队列数量,数据流在物理网卡上做哈希之后,均摊到多少个队列上并在此队列上发出中断,最大可配置16>且不要超过逻辑CPU核数,当启用XDP CPU Redirct时配置为1
hi_cpu_list
- 中断和CPU绑定,值:CPU-ID/CPU-ID列表
- 处理硬件中断的CPU列表或单个CPU,数量最好等于rss_channel_count,但流量较小时一个CPU可处理多个硬件中断队列,当启用XDP CPU Redirct时只需指定1个CPU即可。
- 如果启用了CPU隔离,例如:
isolcpus=11,23,1,13并且启用了XDP CPU Redirect功能,那么需要在隔离的CPU列表中挑选一个,如设置成:hi_cpu_list: 11 - 对于不启用XDP CPU Redirect功能情况配置:
- 可使用
local,自动匹配本地numa上的CPU。即:hi_cpu_list: local - 可使用
all,自动匹配所有CPU。即:hi_cpu_list: all - 可指定CPU列表,如
hi_cpu_list: 2,4,5,6,7,8
- 可使用
- 注意:指定的CPU和物理网卡在同一个NUMA上。物理网卡所在的numa节点以及CPU分布可以
/usr/share/bild/scripts/bild-nic-check.sh <接口名字>看到,也可使用cpu_layout命令查看CPU在NUMA节点上的分布。
xdp_cpu_redirect
- 是否开启XDP CPUMAP redirect功能。值:
true/false - xdp_cpu_redirect针对double VLAN,erspan等数据包无法使物理网卡把数据分散到不同CPU进行处理,而是造成某一个CPU过载,出现大量丢包的场景进行优化。
- 是否开启XDP CPUMAP redirect功能。值:
xdp_cpu_redirect_list
- XDP CPU Redirect后处理包的CPU列表
- 需要考虑重定向的CPU所在的numa节点和物理网卡所在的numa节点保持一致。物理网卡所在的numa节点以及CPU分布可以
/usr/share/bild/scripts/bild-nic-check.sh <接口名字>看到。 - 注意:为了不让系统调度干扰,建议使用isolcpus,隔离出整个物理核心,并且这些CPU和物理网卡在同一个NUMA上。例如:
isolcpus=11,23,1,13其中11,可作为RSS接收CPU,其他被XDP使用,因此可配置成xdp_cpu_redirect_list: 23,1,13 - 此项只有
xdp_cpu_redirect: true才有意义。
点击查看
下面四个配置项是可选配置项,若无特别需求可不用关心采用默认值即可。
symmetric_hash
- 是否使用RSS对称哈希。目的是避免应用层收到的数据包出现乱序情况。值:
true/false,默认是 true
- 是否使用RSS对称哈希。目的是避免应用层收到的数据包出现乱序情况。值:
hi_delay_usec
- 硬件中断延迟,一般无需配置,增大延迟可在CPU硬件中断过高时优化性能,最大可配置125
- 默认配置成
hi_delay_usec: 0,0表示中断不做延迟马上让CPU收包,让CPU处理更多的数据包。
xdp_qsize
- XDP重定向CPU的队列大小设置,默认配置为
xdp_qsize: 2048 - 此项只有
xdp_cpu_redirect: true才有意义。
- XDP重定向CPU的队列大小设置,默认配置为
ethtool_cmd
- 直接执行ethtool命令。
- 默认值配置为
ethtool_cmd “”。
启用
nic_optimize后/usr/share/bild/data/nic_info.<接口名字>会备份硬件网卡信息。为了得到更好的性能,会停用
irqbalance服务。
点击查看
注:修改配置文件后,需重启bild才能生效
#1.5 调试方法
#1.5.1 功能:查看实际配置,统计和调试信息
- 通过bild-map命令,查看实际配置,统计信息
- 查看实际配置
bild-map lookup1 - 查看统计信息
- 查看所有源接口,每种数据方向上,数据包被均摊到每个目的接口的统计信息
bild-map stats redirect1 - 查看指定源接口,指定源/目的方向上,数据包被均摊到每个目的接口的统计信息
# 查看源接口p2p2均摊数据包的统计 bild-map stats redirect p2p2 0 01
2 - 查看指定目的接口,指定方向上,收到的数据统计信息
bild-map stats rxtx tap0,tap1 0 # bild-stats.sh 工具只统计ingress方向。 /usr/share/bild/scripts/bild-stats.sh tap0,tap1,tap2,tap3,tap4,tap5,tap6,tap71
2
3
点击查看
- 查看所有源接口,每种数据方向上,数据包被均摊到每个目的接口的统计信息
- 查看实际配置
注:打印信息中,均用ifindex代替接口名称; 0: ingress,1: egress :::
ebpf调试
- 开启/关闭
# 开启 bild-ctl debug # 关闭 bild-ctl nodebug1
2
3
4 - 查看
tc exec bpf dbg1
点击查看
ebpf调试时,确保/proc/sys/kernel/ftrace_enabled,/sys/kernel/debug/tracing/tracing_on都为1
- 开启/关闭
XDP CPU Redirect调试,查看CPU重定向统计。
# bild-ctl xdp-redirect <物理网卡接口名字> # 例如查看物理网卡p2p2的详细CPU重定向数据统计。 bild-ctl xdp-redirect p2p21
2
3查看启动/关闭日志信息
- 可在/var/log/messages中查看bild日志