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)之间内存隔离,安全性稳定性。