bild 部署

创建时间:2024-04-02 最近修改时间:2024-04-02

#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.rpm
      
      1
    • 生效

    准备脚本:i40e_update.sh

    #! /bin/bash
    rmmod i40e
    modprobe i40e
    systemctl restart network
    
    1
    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: 1
      
      1
      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,23
      
      1

      添加 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 获取。
  • 安装
    yum --disablerepo=* localinstall -y ./{iproute,bild}-*.rpm
    
    1

说明:bild 对系统包 glibc 有一定的要求,需要 >=2.17-260 如果版本过低需要通过 yum update glibc 进行更新。

  • 创建虚接口
    • 在文件 /sbin/ifup-local 追加下面,添加权限并执行 chmod +x /sbin/ifup-local; sh /sbin/ifup-local
      for 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
      done
      
      1
      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: 0
    
    1
    2
    3
    4
    5
  • 启动 bild
    systemctl enable bild.service
    systemctl start bild.service
    
    1
    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,10
    
    1
    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
1
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
1
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_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
  • hi_delay_usec

    • 硬件中断延迟,一般无需配置,增大延迟可在CPU硬件中断过高时优化性能,最大可配置125
    • 默认配置成hi_delay_usec: 0,0表示中断不做延迟马上让CPU收包,让CPU处理更多的数据包。
  • xdp_qsize

    • XDP重定向CPU的队列大小设置,默认配置为xdp_qsize: 2048
    • 此项只有xdp_cpu_redirect: true才有意义。
  • ethtool_cmd

    • 直接执行ethtool命令。
    • 默认值配置为ethtool_cmd “”
  • 启用nic_optimize/usr/share/bild/data/nic_info.<接口名字>会备份硬件网卡信息。

  • 为了得到更好的性能,会停用irqbalance服务。

点击查看

注:修改配置文件后,需重启bild才能生效

#1.5 调试方法

#1.5.1 功能:查看实际配置,统计和调试信息

  • 通过bild-map命令,查看实际配置,统计信息
    • 查看实际配置
      bild-map lookup
      
      1
    • 查看统计信息
      • 查看所有源接口,每种数据方向上,数据包被均摊到每个目的接口的统计信息
        bild-map stats redirect
        
        1
      • 查看指定源接口,指定源/目的方向上,数据包被均摊到每个目的接口的统计信息
        # 查看源接口p2p2均摊数据包的统计
        bild-map stats redirect p2p2 0 0
        
        1
        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,tap7
        
        1
        2
        3
      点击查看

注:打印信息中,均用ifindex代替接口名称; 0: ingress,1: egress :::

  • ebpf调试

    • 开启/关闭
      # 开启
      bild-ctl debug
      # 关闭
      bild-ctl nodebug
      
      1
      2
      3
      4
    • 查看
      tc exec bpf dbg
      
      1
    点击查看

    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 p2p2
    
    1
    2
    3
  • 查看启动/关闭日志信息

    • 可在/var/log/messages中查看bild日志