使能Gazelle

简介

Gazelle是一款高性能用户态协议栈。它基于DPDK在用户态直接读写网卡报文,共享内存大页传递报文,使用轻量级LwIP协议栈,能够大幅提高应用的网络IO吞吐能力。Gazelle多用于数据库网络性能加速,如MySQL、redis等。高性能云盘优化方案使用Gazelle后,能进一步地优化Ceph在网络方面的瓶颈,实现云盘性能的提升。

Gazelle优势有:

Gazelle相关具体信息请参见Gazelle使用指南

安装

  1. 配置openEuler的Yum源,在“/etc/yum.repos.d”目录下openEuler.repo yum源文件中打开update源,即修改[update]源中enabled字段为1,如下所示:

    [update]
    name=update
    baseurl=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/update/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler

  2. 清除Yum缓存。

    yum clean all
    yum makecache

  3. 直接使用Yum命令安装Gazelle。

    yum install dpdk
    yum install libconfig
    yum install numactl
    yum install libboundscheck
    yum install libpcap
    yum install gazelle

环境配置

  1. 打开“lstack.conf”文件。

    vim /etc/gazelle/lstack.conf

  2. 配置DPDK参数。

    dpdk_args=["reinit-ok", "-l", "1", "--log-level", "lib.eal:6", "--log-level", "lib.cryptodev:5", "--log-level", "user1:6", "--match-allocations", "--file-prefix", "spdk_gazelle"]
    • Gazelle依赖DPDK,因此Gazelle的配置文件中的DPDK的配置决定SPDK的配置。在使能Gazelle的情况下,需要通过修改上述配置文件中的dpdk_args参数来调整SPDK的参数。
    • 上述配置第三个参数表示的是绑核位置,"1"表示当前SPDK绑了一个核,位置为cpu1。

  3. 在文件中修改或添加如下选项。

    use_ltran=0
    kni_switch=1
    listen_shadow=1
    mbuf_pool_size = 1024000
    num_cpus="2,3"
    app_bind_numa=0
    main_thread_affinity=1

  4. 配置Gazelle需要接管的端口信息。

    host_addr="192.168.1.148"
    mask_addr="255.255.255.0"
    gateway_addr="192.168.1.1"
    devices="aa:bb:cc:dd:ee:ff"

    请根据实际环境所使用的业务网口信息填写端口信息。

  5. “Esc”键退出编辑模式,输入“:wq!”并按“Enter”键保存退出文件。

使能Gazelle

  1. 使用Gazelle接管网口(以业务网口为enp3s0为例)。

    modprobe vfio enable_unsafe_noiommu_mode=1
    modprobe vfio-pci
    ip link set enp3s0 down
    dpdk-devbind -b vfio-pci enp3s0

  2. 查看接管网口是否已经成功。

    dpdk-devbind -s

    如果想取消Gazelle对网口的接管,请执行如下命令:

    dpdk-devbind -b hinic 0000:07:00.0

  3. 在应用进程上使能Gazelle。

    在执行启动SPDK的命令时通过LD_PRELOAD的方式,加载Gazelle功能库。

    LD_PRELOAD=/usr/lib64/liblstack.so" GAZELLE_BIND_PROCNAME=vhost build/bin/vhost -S /var/tmp -m 0x2
    • Gazelle优化的使能方式和TCMalloc比较相似,综合之后,可使用如下命令启动SPDK。
      TCMALLOC_MEMFS_MALLOC_PATH=/dev/hugepages/tcmalloc LD_PRELOAD="/usr/lib64/libtcmalloc_minimal.so.4 /usr/lib64/liblstack.so" GAZELLE_BIND_PROCNAME=vhost build/bin/vhost -S /var/tmp/ -m 0x02
    • 性能测试请采用该命令启动SPDK。

  4. Gazelle场景进行绑核。

    Gazelle运行需要单独占CPU,使能Gazelle功能后的vhost进程启动后,绑核方式需要根据实际情况进行调整。

    请参考线程绑核将Ceph Client绑核范围修改为:

    taskset -pc 4-12 $pid