Gazelle网络

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加速应用程序步骤如下:

  1. 使用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。
  2. dpdk绑定网卡
    将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。
    #使用vfio-pcidpdk-devbind -b vfio-pci enp3s0#使用igb_uiodpdk-devbind -b igb_uio enp3s0
  3. 大页内存配置
    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查询实际预留页个数,连续内存不足时可能比预期少。
  4. 挂载大页内存
    创建两个目录,分别给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的大页。
  5. 应用程序使用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
  6. 配置文件
    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地址池大小,需要根据网卡硬件支持进行合理配置,配置过小会启动失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值