Gazelle是一款高性能用户态协议栈。它基于DPDK在用户态直接读写网卡报文,共享大页内存传递报文,使用轻量级LwIP协议栈。能够大幅提高应用的网络I/O吞吐能力。专注于数据库网络性能加速,如MySQL、redis等。
单进程且网卡支持多队列时,只需使用liblstack.so有更短的报文路径。其余场景使用ltran进程分发报文到各个线程。
配置openEuler的yum源,直接使用yum命令安装
#dpdk >= 21.11-2
yum install dpdk
yum install libconfig
yum install numactl
yum install libboundscheck
yum install libpcap
yum install gazelle
配置运行环境,使用Gazelle加速应用程序步骤如下:
根据实际情况选择使用ko,提供虚拟网口、绑定网卡到用户态功能。
若使用虚拟网口功能,则使用rte_kni.ko
modprobe rte_kni carrier="on"
网卡从内核驱动绑为用户态驱动的ko,根据实际情况选择一种
#若IOMMU能使用
modprobe vfio-pci
#若IOMMU不能使用,且VFIO支持noiommu
modprobe vfio enable_unsafe_noiommu_mode=1
modprobe vfio-pci
#其它情况
modprobe igb_uio
将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。
#使用vfio-pci
dpdk-devbind -b vfio-pci enp3s0
#使用igb_uio
dpdk-devbind -b igb_uio enp3s0
Gazelle使用大页内存提高效率。使用root权限配置系统预留大页内存,可选用任意页大小。因每页内存都需要一个fd,使用内存较大时,建议使用1G的大页,避免占用过多fd。
根据实际情况,选择一种页大小,配置足够的大页内存即可。配置大页操作如下:
#配置2M大页内存:在node0上配置 2M * 1024 = 2G
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
#配置1G大页内存:在node0上配置1G * 5 = 5G
echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
#查看配置结果
grep Huge /proc/meminfo
创建两个目录,分别给lstack的进程、ltran进程访问大页内存使用。操作步骤如下:
mkdir -p /mnt/hugepages
mkdir -p /mnt/hugepages-2M
chmod -R 700 /mnt/hugepages
chmod -R 700 /mnt/hugepages-2M
mount -t hugetlbfs nodev /mnt/hugepages
mount -t hugetlbfs nodev /mnt/hugepages-2M
有两种使能Gazelle方法,根据需要选择其一
#makefile中添加Gazelle的Makefile
-include /etc/gazelle/lstack.Makefile
#编译添加LSTACK_LIBS变量
gcc test.c -o test ${LSTACK_LIBS}
GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test
选项 | 参数格式 | 说明 |
---|---|---|
dpdk_args | --socket-mem(必需) --huge-dir(必需) --proc-type(必需) --legacy-mem --map-perfect 等 |
dpdk初始化参数,参考dpdk说明 |
use_ltran | 0/1 | 是否使用ltran |
num_cpus | "0,2,4 ..." | lstack线程绑定的cpu编号,编号的数量为lstack线程个数(小于等于网卡多队列数量)。可按NUMA选择cpu |
low_power_mode | 0/1 | 是否开启低功耗模式,暂不支持 |
kni_swith | 0/1 | rte_kni开关,默认为0。只有不使用ltran时才能开启 |
host_addr | "192.168.xx.xx" | 协议栈的IP地址,必须和redis-server配置 文件里的“bind”字段保存一致。 |
mask_addr | "255.255.xx.xx" | 掩码地址 |
gateway_addr | "192.168.xx.1" | 网关地址 |
devices | "aa:bb:cc:dd:ee:ff" | 网卡通信的mac地址,需要与ltran.conf的bond_macs配置一致 |
lstack.conf示例:
dpdk_args=["--socket-mem", "2048,0,0,0", "--huge-dir", "/mnt/hugepages-2M", "--proc-type", "primary", "--legacy-mem", "--map-perfect"]
use_ltran=1
kni_switch=0
low_power_mode=0
num_cpus="2,22"
host_addr="192.168.1.10"
mask_addr="255.255.255.0"
gateway_addr="192.168.1.1"
devices="aa:bb:cc:dd:ee:ff"
功能分类 | 选项 | 参数格式 | 说明 |
---|---|---|---|
kit | forward_kit | "dpdk" | 指定网卡收发模块。 保留字段,目前未使用。 |
forward_kit_args | -l --socket-mem(必需) --huge-dir(必需) --proc-TYPE(必需) --legacy-mem(必需) --map-perfect(必需) 等 |
dpdk初始化参数,参考dpdk说明。 注:--map-perfect为扩展特性,用于防止dpdk占用多余的地址空间,保证ltran有额外的地址空间分配给lstack。 |
|
kni | kni_switch | 0/1 | rte_kni开关,默认为0 |
dispatcher | dispatch_max_clients | n | ltran支持的最大client数。 1、多进程单线程场景,支持的lstack实例数不大于32,每lstack实例有1个网络线程 2、单进程多线程场景,支持的1个lstack实例,lstack实例的网络线程数不大于32 |
dispatch_subnet | 192.168.xx.xx | 子网掩码,表示ltran能识别的IP所在子网网段。参数为样例,子网按实际值配置。 | |
dispatch_subnet_length | n | 子网长度,表示ltran能识别的子网长度,例如length为4时,192.168.1.1-192.168.1.16 | |
bond | bond_mode | n | bond模式,目前只支持Active Backup(Mode1),取值为1 |
bond_miimon | n | bond链路监控时间,单位为ms,取值范围为1到2^64 - 1 - (1000 * 1000) | |
bond_ports | "0xaa" | 使用的dpdk网卡,0x1表示第一块 | |
bond_macs | "aa:bb:cc:dd:ee:ff" | 绑定的网卡mac地址,需要跟kni的mac地址保持一致 | |
bond_mtu | n | 最大传输单元,默认是1500,不能超过1500,最小值为68,不能低于68 |
ltran.conf示例:
forward_kit_args="-l 0,1 --socket-mem 1024,0,0,0 --huge-dir /mnt/hugepages --proc-type primary --legacy-mem --map-perfect --syslog daemon"
forward_kit="dpdk"
kni_switch=0
dispatch_max_clients=30
dispatch_subnet="192.168.1.0"
dispatch_subnet_length=8
bond_mode=1
bond_mtu=1500
bond_miimon=100
bond_macs="aa:bb:cc:dd:ee:ff"
bond_ports="0x1"
tcp_conn_scan_interval=10
ltran --config-file ./ltran.conf
export LSTACK_CONF_PATH=./lstack.conf
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server redis.conf
Gazelle wrap应用程序POSIX接口,应用程序无需修改代码。
Usage: gazellectl [-h | help]
or: gazellectl ltran {quit | show} [LTRAN_OPTIONS] [time]
or: gazellectl lstack show {ip} [LSTACK_OPTIONS] [time]
quit ltran process exit
where LTRAN_OPTIONS :=
show ltran all statistics
-r, rate show ltran statistics per second
-i, instance show ltran instance register info
-b, burst show ltran NIC packet len per second
-l, latency show ltran latency
where LSTACK_OPTIONS :=
show lstack all statistics
-r, rate show lstack statistics per second
-s, snmp show lstack snmp
-c, connetct show lstack connect
-l, latency show lstack latency
[time] measure latency time default 1S
如果是root用户,dpdk启动后的配置文件将会放到/var/run/dpdk目录下; 如果是非root用户,dpdk配置文件的路径将由环境变量XDG_RUNTIME_DIR决定;
使用 Gazelle 存在一些约束限制:
Gazelle可能存在如下安全风险,用户需要根据使用场景评估风险。
共享内存
流量限制 Gazelle没有做流量限制,用户有能力发送最大网卡线速流量的报文到网络,可能导致网络流量拥塞。
进程仿冒 合法注册到ltran的两个lstack进程,进程A可仿冒进程B发送仿冒消息给ltran,修改ltran的转发控制信息,造成进程B通讯异常,进程B报文转发给进程A信息泄露等问题。建议lstack进程都为可信任进程。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型