安装K-NET
安装依赖
K-NET编译依赖用户态协议栈的实现,当前以一个示例用户态协议栈为依赖编译K-NET。
K-NET在代码仓中提供了统一的编译构建脚本build.py,可以直接执行该脚本进行编译构建rpm包,这一步会自动拉取开源securec, cJSON, dpdk
$ python build.py rpm 生成Release版本
# 若需要调试版本,执行以下命令
$ python build.py debug rpm
执行以下操作进入构建目录找到rpm包并安装,这里以ARM环境为例
$ cd ./build/rpmbuild/RPMS
$ rpm -Uvh ./ubs-knet-1.0.0.aarch64.rpm --force --nodeps
redis安装
上传源码、解压并进入源码目录
$ cd redis-6.0.20
$ make && make install
运行环境配置
使用用户态协议栈需要配置相关环境, 比如大页等
加载vfio驱动
硬直通模式:
$ modprobe vfio enable_unsafe_noiommu_mode=1
$ modprobe vfio-pci
配置大页内存
服务端为物理机场景:
$ cat /sys/class/net/ens6f0/device/numa_node # ens6f0根据实际使用的网卡名替换
# 假设回显所在numa为1
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled # 关闭透明大页
$ echo 2 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages # 具体node编号根据查询到的网卡所在NUMA进行更改
# $ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # 根据实际配置的大页调整
服务端为虚拟机场景:
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled # 关闭透明大页
$ echo 2 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
确认大页配置成功:
$ grep Huge /proc/meminfo
# 也可以用dpdk查看当前大页内存配置信息
$ dpdk-hugepages.py -s
配置动态库查找路径环境变量
$ echo "/<K-NET path>/opensource/dpdk/output/lib64" >> /etc/ld.so.conf
$ echo "/usr/local/lib64" >> /etc/ld.so.conf
$ echo "/usr/local/lib" >> /etc/ld.so.conf
$ echo "/usr/lib64" >> /etc/ld.so.conf
$ echo "/usr/lib" >> /etc/ld.so.conf
$ ldconfig
dpdk接管网卡
如果是mlx网卡硬直通场景不需要执行dpdk-devbind。
以华为SP670网口enp6s0为例,具体以网口function名为准。
$ ip link set dev enp6s0 down
$ dpdk-devbind.py -b vfio-pci enp6s0
修改KNET配置文件
KNET配置
$ vim /etc/knet/knet_comm.conf
mac填绑定网卡的mac。 ip填绑定网卡的ip。 ctrl_vcpu_ids 为控制面线程绑核,需要在有效核号内,且需要与数据面分开。数据面绑核见dpdk配置项core_list_global参数。其他配置参数可参考参数配置参考
服务端中运行redis
$ LD_PRELOAD=/usr/lib64/libknet_frame.so redis-server /usr/local/redis/redis.conf --port 6380 --bind 192.168.1.6
# 注:bind的ip 192.168.1.6 替换为具体网卡配置的ip
客户端运行redis
$ taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.1.6 -p 6380 -c 1000 -n 10000000 -r 100000 -t set --threads 15
$ taskset -c 33-62 /path/redis-6.0.20/src/redis-benchmark -h 192.168.1.6 -p 6380 -c 1000 -n 100000000 -r 10000000 -t get --threads 15
# 注:bind的ip 192.168.1.6 替换为具体网卡配置的ip
清理set数据,提升get性能
$ redis-cli -h 192.168.1.6 -p 6380 flushall
# 注:ip 192.168.1.6 替换为具体网卡配置的ip