SPDK中自带isal-crc32c与isal-crc16算法,在spdk21.01.1-for-KAE分支中,引入了华为自研的ksal-crc算法,自研的ksal-crc算法相较于isal2.29版本的crc算法有20% 以上的性能提升。本章节主要介绍在SPDK中如何对ksal-crc进行性能测试和系统测试。
1 2 | cd /home/spdk/test/unit/lib/util/crc16.c/ ./crc16_ut |
执行./crc16_ut 默认取大小为4k的数据块进行100000次的crc16计算,然后取平均值,由于crc的计算非常快,以ns为单位才能统计到一次的计算时间,因此需要多取几次计算平均值才能得到一个较为稳定正确的数值。在执行中也可以指定块的大小、计算的次数、以及验证校验和(计算结果是否正确)。具体如何指定可执行 ./crc16_ut -h 查看。
1 2 | cd /home/spdk/test/unit/lib/util/crc32c.c/ ./crc32c_ut |
1 2 3 | cd /home/spdk ./configure --with-crypto --with-reduce --without-ksal --with-crypto_openssl make -j |
1 | ./build/bin/nvmf_tgt --wait-for-rpc
|
1 | ./scripts/rpc.py framework_start_init
|
1 2 | ./scripts/rpc.py bdev_aio_create /dev/sda sda ./scripts/rpc.py bdev_crypto_create sda crypto crypto_openssl 0123456789123456 -c AES_CBC |
此处创建了一块加解密的bdev盘,也可以创建其他的bdev盘进行测试。
1 2 3 4 5 6 | ./scripts/rpc.py nvmf_create_transport -t TCP -u 16384 -m 8 -c 8192 ./scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode2 -a -s SPDK00000000000001 -d SPDK_Controller1 ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode2 crypto ./scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode2 -t TCP -a 90.90.82.112 -s 4420 nvme discover -t tcp -a 90.90.82.112 -s 4420 nvme connect -t tcp -n "nqn.2016-06.io.spdk:cnode2" -a 90.90.82.112 -s 4420 -g -G |
1 | fio -filename=/dev/nvme0n1 -direct=1 -iodepth=64 -thread -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -group_reporting -name=mytest --verify_pattern=0x12345678 |
此处fio下发的读写数据是通过NVMe-oF协议与nvme盘进行传输的。在SPDK中,NVMe-oF协议会对传输的每个数据单元(pdu)进行校验,采用的就是crc算法,因此每次io操作都会进行一次crc计算。判断ksal-crc是否使能,在执行fio操作的过程中,可通过perf工具抓取SPDK进程的函数热点信息。然后在函数热点信息中查找是否有KsalCrc32c函数,如果存在该函数则说明ksal-crc使能成功。