助力RV64ILP32 ABI探索嵌入式虚拟化
RV64ILP32 ABI (简称“新 32 位”)在高性能嵌入式应用领域的重要价值,苦芽科技在现有应用的基础上(参考:苦芽科技助力 RV64ILP32 ABI 率先完成应用落地),继续探索“新 32 位”生态在 Hypervisor 的诸多可能性。在 Sifive P550 硬件平台,开源小满(EasyXMen)成功以 VS-mode 方式运行在 KVM 上,并对虚拟化的性能损耗进行了度量。测试结论展示了开源小满(EasyXMen)运行虚拟化是可行的,虚拟化对性能的影响在可控制的范围内。
关于嵌入式虚拟化
开源小满(EasyXMen)虚拟化方案
在 RISC-V 架构,应用程序可以通过三种方式运行在硬件,分别是基于 ABI(裸机程序),基于操作系统(需要实现 SBI 规范),基于 Hypervisor 虚拟机(需要高性能 CPU),本次开源小满(EasyXMen)虚拟化方案基于第三种方式实现。
关于硬件平台 HiFive P550
P550 是一款高性能 RISC-V 开发板,搭载 ESWIN EIC7700X SoC 和 SiFive 四核 P550 64 位乱序 CPU,硬件支持 KVM。
探索策略
首先将 Dhrystone 在 P550 Linux 直接编译,然后以随机绑核的运行得到裸跑数据。接着,将同一份 Dhrystone 代码基于“新 32 位”工具链嵌入到开源小满(EasyXMen)里面的循环 Task。最后在 P550 上以绑核的方式运行多个 KVM 虚拟机,每个虚拟机都载入一份开源小满(EasyXMen),统计不同场景下的 Dhrystone 性能数据,输出图表对比虚拟化前后的性能差异。
确认操作系统内核支持 H 扩展并且启用了 KVM
确保 qemu-sytem-riscv64 支持 KVM
将 Dhrystone 移植到开源小满(EasyXMen)
准备源码,git clone https://github.com/iwannatto/dhrystone.git ,有几个函数需要自己实现:strcmp、strcpy,malloc 以及计算耗时的函数。
可以在本地调试代码
qemu-system-riscv64ilp32 -s -S -cpu rv64 -M virt -m 1G -nographic -bios ~/bins/riscv/qemu-linux/fw_dynamic.bin_m64lp64 -kernel riscv_helloworld.bin
riscv64-unknown-elf-gdb riscv_helloworld.elf
基于 RISC-V 新 32 位 工具链生成开源小满(EasyXMen)镜像
需要修改开源小满(EasyXMen)的内核入口地址
统计 Dhrystone 在 P550 上面裸跑的分数
cd Examples/riscv_helloworld/bench/
make
#测试
begin=0
while \[ $begin -le 12 \]
do
cid=\`expr $begin % 4\`
echo "####################"
echo begin=$begin,cid=$cid
echo "####################"
time taskset -c $cid ./dry2nr 20000000
((begin++))
done
记录 Dhrystone 在一个及多个 KVM 虚拟机里面运行时的性能数据
多核绑核情况(4 个 Guest)
taskset -c 0 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 1 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 2 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
多核绑核情况(8 个 Guest)
taskset -c 0 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 0 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 1 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 1 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 2 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 2 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
单核绑核测试(1 个 Guest)
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
单核绑核测试(4 个 Guest)
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
taskset -c 3 sudo qemu-system-riscv64 --nographic --enable-kvm -M virtilp32 -cpu host -m 1024M -smp 2 -kernel riscv_helloworld.bin
性能统计图表
通过 taskset 绑定 1 个 CPU 核心,在 KVM 里面运行 1-4 个 小满 Guest OS 时的 Dhrystone,性能数据如下:
通过 taskset 绑定 4 个 CPU 核心,在 KVM 里面运行 1-8 个小满 Guest OS 时的 Dhrystone 性能数据如下:
备注:黄色虚线表示,直接在 P550 Linux 运行 Dhrystone 的性能数据,蓝色柱状图表示虚拟化之后的性能数据,两组数据采用同一份 Dhrystone 源码,且采用相同的编译参数。
未来计划
苦芽科技会继续探索在 KVM 里多个开源小满(EasyXMen)之间内存隔离,安全性稳定性。