Gazelle是一款高性能用户态协议栈。它基于DPDK(Data Plane Development Kit,数据平面开发工具集)在用户态直接读写网卡报文,共享大页内存传递报文,使用轻量级LwIP协议栈。能够大幅提高应用的网络I/O吞吐能力。专注于数据库网络性能加速,如MySQL、redis等。
高性能
报文零拷贝,无锁,灵活scale-out,自适应调度。
通用性
完全兼容POSIX,零修改,适用不同类型的应用。
单进程且网卡支持多队列时,只需使用liblstack.so,以缩短报文路径。其余场景使用ltran进程分发报文到各个线程。
安装
配置openEuler的yum源,直接使用yum命令安装。
yum install dpdkyum install libconfigyum install numactlyum install libboundscheckyum install libpcapyum install gazelle
使用方法
配置运行环境,使用Gazelle加速应用程序步骤如下:
- 使用root权限安装ko
根据实际情况选择使用ko,提供虚拟网口、绑定网卡到用户态功能。
若使用虚拟网口功能,则使用rte_kni.ko。
modprobe rte_kni carrier=“on”
配置NetworkManager不托管kni网卡。
[root@localhost ~]# cat /etc/NetworkManager/conf.d/99-unmanaged-devices.conf[keyfile]unmanaged-devices=interface-name:kni[root@localhost ~]# systemctl reload NetworkManager
网卡从内核驱动绑为用户态驱动的ko,根据实际情况选择一种。
#若IOMMU能使用modprobe vfio-pci#若IOMMU不能使用,且VFIO支持noiommumodprobe vfio enable_unsafe_noiommu_mode=1modprobe vfio-pci#其他情况modprobe igb_uio
说明:
可根据机器BIOS配置,查看是否启用IOMMU。 - dpdk绑定网卡
将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。
#使用vfio-pcidpdk-devbind -b vfio-pci enp3s0#使用igb_uiodpdk-devbind -b igb_uio enp3s0 - 大页内存配置
Gazelle使用大页内存提高效率。使用root权限配置系统预留大页内存,可选用任意页大小。因每页内存都需要一个fd,使用内存较大时,建议使用1G的大页,避免占用过多fd。
根据实际情况,选择一种页大小,配置足够的大页内存即可。配置大页操作如下:
#配置2M大页内存:在node0上配置 2M * 1024 = 2Gecho 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages#配置1G大页内存:在node0上配置1G * 5 = 5Gecho 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
说明:
cat查询实际预留页个数,连续内存不足时可能比预期少。 - 挂载大页内存
创建两个目录,分别给lstack进程、ltran进程访问大页内存使用。操作步骤如下:
mkdir -p /mnt/hugepages-ltranmkdir -p /mnt/hugepages-lstackchmod -R 700 /mnt/hugepages-ltranchmod -R 700 /mnt/hugepages-lstackmount -t hugetlbfs nodev /mnt/hugepages-ltran -o pagesize=2Mmount -t hugetlbfs nodev /mnt/hugepages-lstack -o pagesize=2M
说明:
/mnt/hugepages-ltran和/mnt/hugepages-lstack必须挂载同样pagesize的大页。 - 应用程序使用Gazelle
有两种使用Gazelle方法,根据需要选择其一。
重新编译应用程序,替换sockets接口
#makefile中添加Gazelle的Makefile-include /etc/gazelle/lstack.Makefile#编译添加LSTACK_LIBS变量gcc test.c -o test ${LSTACK_LIBS}
使用LD_PRELOAD加载Gazelle库
GAZELLE_BIND_PROCNAME环境变量指定进程名,LD_PRELOAD指定Gazelle库路径。
GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test - 配置文件
lstack.conf用于指定lstack的启动参数,默认路径为/etc/gazelle/lstack.conf,配置文件参数如下:
选项 参数格式 说明
dpdk_args --socket-mem(必需)
–huge-dir(必需)
–proc-type(必需)
–legacy-mem
–map-perfect
-d dpdk初始化参数,参考dpdk说明
–map-perfect为扩展特性,用于防止dpdk占用多余的地址空间,保证ltran有额外的地址空间分配给lstack。
-d参数加载指定so库文件。
listen_shadow 0/1 是否使用影子fd监听。单listen线程,多协议栈线程时使能。
use_ltran 0/1 是否使用ltran 。
num_cpus “0,2,4 …” lstack线程绑定的cpu编号,编号的数量为lstack线程个数(小于等于网卡多队列数量)。可按NUMA选择cpu。
low_power_mode 0/1 是否开启低功耗模式,暂不支持。
kni_switch 0/1 rte_kni开关,默认为0。只有不使用ltran时才能开启。
unix_prefix “string” gazelle进程间通信使用的unix socket文件前缀字符串,默认为空,和需要通信的ltran.conf的unix_prefix或gazellectl的-u参数配置一致。不能含有特殊字符,最大长度为128。
host_addr “192.168.xx.xx” 协议栈的IP地址,也是应用程序的IP地址。
mask_addr “255.255.xx.xx” 掩码地址。
gateway_addr “192.168.xx.1” 网关地址。
devices “aa:bb:cc:dd:ee:ff” 网卡通信的mac地址,需要与ltran.conf的bond_macs配置一致。
app_bind_numa 0/1 应用的epoll和poll线程是否绑定到协议栈所在的numa,默认值是1,即绑定。
send_connect_number 4 设置为正整数,表示每次协议栈循环中发包处理的连接个数。
read_connect_number 4 设置为正整数,表示每次协议栈循环中收包处理的连接个数。
rpc_number 4 设置为正整数,表示每次协议栈循环中rpc消息处理的个数。
nic_read_num 128 设置为正整数,表示每次协议栈循环中从网卡读取的数据包的个数。
mbuf_pool_size 1024000 设置为小于5120000的正整数,表示初始化时申请的mbuf地址池大小,需要根据网卡硬件支持进行合理配置,配置过小会启动失败。