Gazelle单网卡功能使用说明
背景介绍
目前使用 Gazelle 进行应用程序进行加速时,只能处理应用程序使用端口的报文,对网卡接收到的其他报文(如运维命令ssh 等),无法进行处理。
功能介绍
对于网卡接收到的所有报文,在 Gazelle 内部进行分流处理。分流原则如下:对于Gazelle 记录端口的报文在 Gazelle 处理后送到应用程序,对未记录端口的报文转送到内核。
举例:当Gazelle 加速redis时,Gazelle 会在启动时记录redis监听的端口6379。当Gazelle 收到网卡的报文后,进行每个报文进行判断,对于目的端口是6379 的报文送到Gazelle,其余的报文送到内核进行处理。
使用说明
虚机场景
- 安装dpdk Gazelle 配置大页
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
详细步骤可参考:挂载大页内存
- dpdk 绑定网卡
以网卡绑定 igb_uio 为例
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绑定网卡
- 修改Gazelle配置文件
flow_bifurcation=1 # 打开分流开关
- 加速应用程序,启动Gazelle 以加速 redis 为例
LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf
容器场景
- 安装dpdk、配置大页、dpdk 绑定网卡 同上述章节虚拟场景配置
- 安装 docker
yum install -y docker
- 导入镜像
docker load -i openEuler-docker.x86_64.tar.xz
host模式
- 启动容器
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
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 映射节点信息
- 进入容器
docker exec -it xxxxx bash
- 安装dpdk Gazelle
yum install -y dpdk gazele
- 修改配置文件
flow_bifurcation=1 # 打开分流开关
devices="52:54:00:de:2a:57" # 修改mac地址为 dpdk绑定的网卡地址
- 启动Gazelle 以加速 redis 为例
LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf
VF 直通模式
- 启动容器
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
- 配置VF 直通网卡
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
- 进入容器
docker exec -it xxx bash
- 安装dpdk Gazelle
yum install -y dpdk gazele
- 修改配置文件
flow_bifurcation=1 # 打开分流开关
devices="52:54:00:de:2a:57" # 修改mac地址为VF直通的网卡
- 启动Gazelle 以加速 redis 为例
LD_PRELOAD=/usr/lib64/liblstack.so Gazelle_BIND_PROCNAME=redis-server /root/redis-server /root/redis.conf
功能限制
- 同节点通信(用户态服务端+内核态客户端 或者 用户态客户端+ 内核态服务端)只支持TCP协议,UDP 协议暂不支持。
- 不支持和kni 功能同时开启。
- 对不携带端口的报文无法做到分流。
- 开启此功能后,性能会下降 2% 左右。
- 虚拟环境及容器环境需要支持
ip a
命令查询网卡信息。若不支持此命令,可能影响虚拟网卡IPV6地址状态,进而影响IPV6通信。
已支持运维命令
ifconfig
tcpdump
ifconfig
ftp/sftp
sar
netstat
ssh -- 需开启ssh 登录,若未开启可按照下面方式开启
[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 服务是否开启
文档捉虫