单进程模式加速

功能描述

提供高性能用户态协议栈处理能力,支持针对单进程业务场景进行网络加速。

使用示例

本章示例以Redis为例。

说明

  • 该模式支持服务端为配置VF直通的虚拟机以及物理机两种场景,服务端为物理机场景下使用DPDK接管网卡PF运行K-NET,按照配置大页内存进行环境配置。
  • 首先确认knet_comm.conf配置文件中配置运行模式为单进程,如果“mode”不为0,则应修改为0。
  • 若任务运行失败,可参见日志工具knet_comm.log查看日志排查原因。
vi /etc/knet/knet_comm.conf
#common配置项
    "common": {
        "mode": 0, # 运行模式,0表示单进程模式,1表示多进程模式;
        ...
    }

单实例加速

说明

服务端组网参考物理机组网规划或虚拟机组网规划,已按照配置大页内存进行环境配置。

  1. 服务端中运行Redis服务端。

    说明

    • 以KNET_USER为用户名占位符,推荐在“/home/KNET_USER“目录下执行该命令(KNET_USER用户在此目录下拥有读写权限),实际运行时将其替换为实际用户名。KNET_USER需具有命令执行权限。
    • 若为root用户,执行时需添加so文件路径,运行命令如下:
    taskset -c 33-62 LD_PRELOAD=/usr/lib64/libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.*.*
    
    taskset -c 33-62 LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.*.*
    

    说明

    • taskset -c 33-62:将进程绑定到编号33到62的CPU上运行(可选项,CPU范围选择参考性能调优)。
    • --port:Redis Server侦听的端口,请用户根据实际情况替换。且绑定端口后,请勿再使用此端口运行其他业务。
    • --bind:Redis Server侦听的IP地址,为具体网卡配置的IP地址,请用户根据实际情况替换。
    • redis-server和redis.conf的路径根据实际安装Redis的路径填写。
  2. 客户端主机中运行redis-benchmark进行测试。

    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.*.* -p 6380 -c 1000 -n 10000000 -r 100000 -t set --threads 15
    

    回显如下,这里以set测试为例:

    说明

    • taskset -c 33-62:将进程绑定到编号33到62的CPU上运行(可选项,CPU范围选择参考性能调优)。
    • /path/redis-6.0.20/src/redis-benchmark:redis-benchmark是Redis自带的基准测试工具,用于测试Redis的性能,路径根据实际安装Redis的路径填写。
    • -h 192.168.*.*:Redis服务器的IP地址,这里是步骤1中绑定的IP地址。
    • -p 6380:Redis服务器的端口号,这里是步骤1中绑定的端口号。
    • -c 1000:并发连接数,即同时向Redis服务器发送请求的客户端数量。
    • -n 10000000:总请求数,即客户端向Redis服务器发送的请求总数。
    • -r 100000:配置指定数据的key,对SET/GET/INCR使用随机key,对SADD使用随机value,对ZADD使用随机成员和分数。
    • -t set:测试类型,set对应测试类型为set操作,如果是-t get表示测试类型为get操作。
    • --threads 15:线程数,即每个客户端使用的线程数。同一个客户端可以使用多个线程来发送请求,从而提高并发量和吞吐量。

    结果形如以下示例输出:

    ====== SET ======
    10000000 requests completed in 25.75 seconds
    1000 parallel clients
    3 bytes payload
    keep alive: 1
    host configuration "save": 900 1 300 10 60 10000
    host configuration "appendonly": no
    multi-thread: yes
    threads: 15
                    
    0.00% <= 0.4 milliseconds
    0.00% <= 0.5 milliseconds
    0.00% <= 0.6 milliseconds
    0.00% <= 0.7 milliseconds
    0.01% <= 0.8 milliseconds
    ...
    388274.12 requests per second
    

    则性能为388274.12 rps,实际性能以运行为准。

  3. 客户端清理set数据。

    redis-cli -h 192.168.*.* -p 6380 flushall
    

  4. 客户端主机中运行redis-benchmark进行get测试。

    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.*.* -p 6380 -c 1000 -n 10000000 -r 10000000 -t get --threads 15
    

    结果形如以下示例输出:

    ====== GET ======
    1000000 requests completed in 64.26 seconds  
    1000 parallel clients  
    3 bytes payload  
    keep alive: 1  
    host configuration "save": 900 1 300 10 60 10000  
    host configuration "appendonly": no  
    multi-thread: yes  
    threads: 1  
    
    0.00% <= 0.6 milliseconds  
    0.00% <= 0.7 milliseconds  
    0.00% <= 0.8 milliseconds  
    0.00% <= 2 milliseconds  
    0.00% <= 3 milliseconds  
    0.00% <= 4 milliseconds  
    0.01% <= 5 milliseconds
    ...
    305608.11 requests per second
    

    则性能为305608.11 rps,实际性能以运行为准。

    说明

    测试内核协议栈相同场景下Redis set、get性能,可以与上述K-NET结果进行对比,观测提升效果。

  5. (可选)使用内核协议栈测试Redis性能对比K-NET加速性能。

    1. 参考DPDK接管网卡说明中的取消接管网卡步骤。

      dpdk-devbind.py -b "hisdk3" 0000:06:00.0
      
    2. 服务端不使用K-NET运行Redis业务:

      /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.*.*
      

      观察到如下输出,表示启动成功:

       * Ready to accept connections
      

      客户端运行redis-benchmark方式与K-NET场景一致,参考步骤2步骤4

    3. 使用内核协议栈测试后,若需重新使用K-NET特性,需参考DPDK接管网卡重新接管网卡。

      dpdk-devbind.py -b vfio-pci 0000:06:00.0
      dpdk-devbind.py -s                 #确认是否接管
      
  6. 完成后在服务端结束K-NET进程,按Ctrl+C结束Redis进程。

虚拟机VF硬直通对Redis业务主从场景加速

说明

一主一从场景,虚拟机均按配置大页内存进行环境配置。 以主服务端使用的网卡IP地址为192.168.0.1,从服务端使用的网卡IP地址为192.168.0.2为例。

组网参考:

  1. 服务端虚拟机(主)运行Redis服务端。

    说明

    • 以KNET_USER为用户名占位符,推荐在“/home/KNET_USER“目录下执行该命令(KNET_USER用户在此目录下拥有读写权限),实际运行时将其替换为实际用户名。KNET_USER需具有命令执行权限。
    • 若为root用户,执行时需添加so文件路径,运行命令如下:
    taskset -c 33-62 LD_PRELOAD=/usr/lib64/libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.0.1
    
    taskset -c 33-62 LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.0.1
    
  2. 服务端虚拟机(从)运行Redis服务端。

    说明

    • 以KNET_USER为用户名占位符,推荐在“/home/KNET_USER“目录下执行该命令(KNET_USER用户在此目录下拥有读写权限),实际运行时将其替换为实际用户名。KNET_USER需具有命令执行权限。
    • root用户下执行时需添加so文件路径,运行命令如下:
    taskset -c 33-62 LD_PRELOAD=/usr/lib64/libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.0.2 --slaveof 192.168.0.1 6380
    
    taskset -c 33-62 LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --port 6380 --bind 192.168.0.2 --slaveof 192.168.0.1 6380(主服务端绑定端口)
    

    说明

    --slaveof 192.168.0.1 6380:用于将当前Redis实例设置为一个从服务器,并指定主服务器的IP地址为192.168.0.1,端口号为6380。

    回显如下说明成功使能主从:

  3. 客户端主机中运行redis-benchmark对主服务端进行测试。

    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.0.1 -p 6380(主服务端绑定端口) -c 1000 -n 10000000 -r 100000 -t set --threads 15
    redis-cli -h 192.168.0.1 -p 6380(主服务端绑定端口) flushall #客户端清理set数据
    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.0.1 -p 6380(主服务端绑定端口) -c 1000 -n 100000000 -r 100000 -t get --threads 15
    

    说明

    • taskset -c 33-62:将进程绑定到编号33到62的CPU上运行(可选项,CPU范围选择参考性能调优)。
    • /path_/redis-6.0.20/src/_redis-benchmark:redis-benchmark是Redis自带的基准测试工具,用于测试Redis的性能,路径根据实际安装Redis的路径填写。
    • -h 192.168.*.*:Redis服务器的IP地址,这里是步骤1中绑定的IP地址。
    • -p 6380:Redis服务器的端口号,这里是步骤1中绑定的端口号。
    • -c 1000:并发连接数,即同时向Redis服务器发送请求的客户端数量。
    • -n 10000000:总请求数,即客户端向Redis服务器发送的请求总数。
    • -r 100000:配置指定数据的key,对SET/GET/INCR使用随机key,对SADD使用随机value,对ZADD使用随机成员和分数。
    • -t set:测试类型,参数set表示本次测试为set操作。如果是-t get表示测试类型为get操作。
    • --threads 15:线程数,即每个客户端使用的线程数。同一个客户端可以使用多个线程来发送请求,从而提高并发量和吞吐量。
  4. 客户端主机中运行redis-benchmark对从服务端进行测试。

    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.0.2 -p 6379 -c 1000 -n 100000000 -r 100000 -t get --threads 15
    

    说明

    -p 6379:从服务端运行redis命令没有指定端口号,因此其绑定端口号为redis配置文件默认值6379。

虚拟机VF硬直通对Redis业务集群场景加速

说明

三主三从集群场景,虚拟机均按配置大页内存进行环境配置。 以6个服务端虚拟机使用的网卡IP地址分别为192.168.0.1、192.168.0.2、192.168.0.3、192.168.0.4、192.168.0.5、192.168.0.6为例。

组网参考:

  1. 六台服务端虚拟机分别运行Redis客户端。

    说明

    • 以KNET_USER为用户名占位符,推荐在“/home/KNET_USER“目录下执行该命令(KNET_USER用户在此目录下拥有读写权限),实际运行时将其替换为实际用户名。KNET_USER需具有命令执行权限。
    • 若为root用户,执行时需添加so文件路径,以虚拟机1为例,运行命令如下:
    LD_PRELOAD=/usr/lib64/libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-1.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.1
    
    • 虚拟机1:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-1.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.1
      
    • 虚拟机2:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-2.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.2
      
    • 虚拟机3:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-3.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.3
      
    • 虚拟机4:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-4.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.4
      
    • 虚拟机5:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-5.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.5
      
    • 虚拟机6:

      LD_PRELOAD=libknet_frame.so /path/redis-6.0.20/src/redis-server /path/redis-6.0.20/redis.conf --cluster-enabled yes --cluster-config-file /path/nodes-6.conf --cluster-node-timeout 15000 --port 6379 --bind 192.168.0.6
      

    说明

    • _192.168._0.*:表示不同虚拟机的使用网卡IP地址,请根据实际情况替换。
    • --cluster-enabled yes:启用Redis集群模式。
    • --cluster-config-file /path/nodes-1.conf:集群配置信息文件,由Redis自行更新生成,不用手动配置,每个节点都有一个集群配置文件用于持久化保存集群信息,需确保与运行中实例的配置文件名不冲突,另外路径(path)要在/home/_KNET_USER_下(KNET_USER用户在此目录下拥有读写权限),推荐直接填/home/KNET_USER。
    • --cluster-node-timeout 15000:集群超时时间(毫秒),节点超时多久则认为它宕机了。如果主节点超过指定的时间不可达,进行故障切换,将其对应的从节点提升为主。
  2. 客户端主机中运行redis-cli创建集群。

    redis-cli --cluster create --cluster-replicas 1 192.168.0.1:6379 192.168.0.2:6379 192.168.0.3:6379 192.168.0.4:6379 192.168.0.5:6379 192.168.0.6:6379
    

    回显如下,说明成功创建集群:

    说明

    • --cluster create:创建集群。
    • --cluster-replicas 1:从节点个数设置为1(这里有六个节点,因此组成三主三从集群)。
  3. 客户端主机中运行redis-benchmark对集群的每个节点进行测试。

    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.0.* -p 6379 -c 1000 -n 10000000 -r 100000 -t set --threads 15 --cluster
    redis-cli -h 192.168.0.* -p 6379 flushall  #仅限主节点IP地址执行该操作
    taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.0.* -p 6379 -c 1000 -n 100000000 -r 100000 -t get --threads 15 --cluster 
    

    说明

    --cluster:开启集群模式。

  4. 客户端关闭服务端Redis实例。

    redis-cli -h 192.168.0.* -p 6379 shutdown
    
  5. 服务端删除运行目录下的dump.rdb文件以及运行生成的nodes-*.conf文件。

    说明

    这两个文件包含集群配置缓存信息,如果不删除,下次在客户端进行执行创建集群会有异常报错。

    • 虚拟机1:

      rm /path/nodes-1.conf dump.rdb
      
    • 虚拟机2:

      rm /path/nodes-2.conf dump.rdb
      
    • 虚拟机3:

      rm /path/nodes-3.conf dump.rdb
      
    • 虚拟机4:

      rm /path/nodes-4.conf dump.rdb
      
    • 虚拟机5:

      rm /path/nodes-5.conf dump.rdb
      
    • 虚拟机6:

      rm /path/nodes-6.conf dump.rdb