Gazelle 单网卡功能使用说明

背景介绍

目前使用 Gazelle 进行应用程序进行加速时,只能处理应用程序使用端口的报文,对网卡接收到的其他报文(如运维命令ssh 等),无法进行处理。

功能介绍

对于网卡接收到的所有报文,在 Gazelle 内部进行分流处理。分流原则如下:对于Gazelle 记录端口的报文在 Gazelle 处理后送到应用程序,对未记录端口的报文转送到内核。

举例:当Gazelle 加速redis时,Gazelle 会在启动时记录redis监听的端口6379。当Gazelle 收到网卡的报文后,进行每个报文进行判断,对于目的端口是6379 的报文送到Gazelle,其余的报文送到内核进行处理。

使用说明

虚机场景

  1. 安装dpdk Gazelle 配置大页

    shell
    yum install -y dpdk gazelle
    echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
    mkdir -p /mnt/hugepages-lstack
    chmod -R 700 /mnt/hugepages-lstack
    mount -t hugetlbfs nodev /mnt/hugepages-lstack

    详细步骤可参考:挂载大页内存

  2. dpdk 绑定网卡

    以网卡绑定 igb_uio 为例

    shell
    cd /lib/modules
    my_var=$(find /lib/modules/ -name igb_uio.ko)
    modprobe uio
    # 加载ko
    insmod ${my_var}
    #使用igb_uio
    dpdk-devbind -b igb_uio enp3s0

    详细步骤可参考: dpdk绑定网卡

  3. 修改Gazelle配置文件

    shell
    flow_bifurcation=1 # 打开分流开关
  4. 加速应用程序,启动Gazelle 以加速 redis 为例

    shell
    LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf

容器场景

  1. 安装dpdk、配置大页、dpdk 绑定网卡 同上述章节虚拟场景配置

  2. 安装 docker

    shell
    yum install -y docker
  3. 导入镜像

    shell
    docker load -i openEuler-docker.x86_64.tar.xz
host模式
  1. 启动容器

    shell
    docker run -d -it --privileged -v /lib/modules:/lib/modules -v /mnt:/mnt -v /dev:/dev -v /sys/bus/pci/drivers:/sys/bus/pci/drivers -v /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages -v /sys/devices/system/node:/sys/devices/system/node -v /dev:/dev openeuler-22.03-lts-sp4 bash
    shell
    docker 启动映射文件解释
    -v /lib/modules:/lib/modules 映射内核模块
    -v /mnt:/mnt 映射外部存储设备 文件系统
    -v /dev:/dev 映射内核设备
    -v /sys/bus/pci/drivers:/sys/bus/pci/drivers 映射驱动文件
    -v /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages 映射大页信息
    -v /sys/devices/system/node:/sys/devices/system/node 映射节点信息
  2. 进入容器

    shell
    docker exec -it xxxxx bash
  3. 安装dpdk Gazelle

    shell
    yum install -y dpdk gazele
  4. 修改配置文件

    shell
    flow_bifurcation=1 # 打开分流开关
    devices="52:54:00:de:2a:57" # 修改mac地址为 dpdk绑定的网卡地址
  5. 启动Gazelle 以加速 redis 为例

    shell
    LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf
VF 直通模式
  1. 启动容器

    shell
    docker run -d -it --network host --privileged -v /lib/modules:/lib/modules -v \
    /mnt:/mnt -v /dev:/dev -v /sys/bus/pci/drivers:/sys/bus/pci/drivers -v \
    /sys/kernel/mm/hugepages:/sys/kernel/mm/hugepages -v \
    /sys/devices/system/node:/sys/devices/system/node -v /dev:/dev  \
    openeuler-22.03-lts-sp4 bash
  2. 配置VF 直通网卡

    shell
    echo 2 > /sys/class/net/enp130s0f1/device/sriov_numvfs 
    docker ps
    PID=$(docker inspect -f '{{.State.Pid}}' 容器名称)
    mkdir -p /var/run/netns
    ln -s /proc/PID/ns/net /var/run/netns/PID
    ip link set enp129s0f1v0 netns PID
  3. 进入容器

    shell
    docker exec -it xxx bash
  4. 安装dpdk Gazelle

    shell
    yum install -y dpdk gazele
  5. 修改配置文件

    shell
    flow_bifurcation=1 # 打开分流开关
    devices="52:54:00:de:2a:57" # 修改mac地址为VF直通的网卡
  6. 启动Gazelle 以加速 redis 为例

    shell
    LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf

功能限制

  1. 同节点通信(用户态服务端+内核态客户端 或者 用户态客户端+ 内核态服务端)只支持TCP协议,UDP 协议暂不支持。
  2. 不支持和kni 功能同时开启。
  3. 对不携带端口的报文无法做到分流。
  4. 开启此功能后,性能会下降 2% 左右。
  5. 虚拟环境及容器环境需要支持ip a命令查询网卡信息。若不支持此命令,可能影响虚拟网卡IPV6地址状态,进而影响IPV6通信。

已支持运维命令

  • ifconfig

  • tcpdump

  • ifconfig

  • ftp/sftp

  • sar

  • netstat

  • ssh -- 需开启ssh 登录,若未开启可按照下面方式开启

shell
[root@eb2936ebeaaf ~]# yum install openssh-server
[root@eb2936ebeaaf ~]# vim /etc/ssh/sshd_config
Port 22 # 开启端口
PubkeyAuthentication yes # 修改登录验证方式
[root@eb2936ebeaaf ~]# /usr/sbin/sshd  # 启动ssh服务
[root@eb2936ebeaaf ~]# netstat -pant | grep sshd # 查询 ssh 服务是否开启