开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

单进程模式加速

功能描述

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

使用示例

本章示例以Redis为例。

说明:

  • 该模式支持服务端为配置VF直通的虚拟机以及物理机两种场景,服务端为物理机场景下使用DPDK接管网卡PF运行K-NET,按照配置大页内存进行环境配置。
  • 首先确认knet_comm.conf配置文件中配置运行模式为单进程,如果“mode”不为0,则应修改为0。
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文件路径,运行命令如下:
    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.*.*
    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.*.*

    说明:

    • --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结果进行对比,观测提升效果。

虚拟机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文件路径,运行命令如下:
    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
    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文件路径,运行命令如下:
    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
    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