keelOS 和 KVM 的性能对比
结果
| 项目 | 单位 | keelOS | KVM | keelOS / KVM |
|---|---|---|---|---|
| 7-Zip 压缩跑分 | MIPS (越高越好) | 23,251 | 24,533 | 95% |
| sysbench CPU | events/s (越高越好) | 4,773 | 4,905 | 97% |
| sysbench 内存 | MiB/s (越高越好) | 5,203 | 5,182 | 100% |
| 编译 Redis(make -j4) | s (越低越好) | 41.42 | 39.96 | 96% |
| 进程互相唤醒(perf sched pipe) | s (越低越好) | 4.598 | 3.579 | 78% |
| 4K 随机读,QD32 | IOPS (越高越好) | 42,724 | 79,368 | 54% |
| 4K 随机写,QD32 | IOPS (越高越好) | 12,579 | 36,366 | 35% |
| 4K 随机读,QD1 | IOPS (越高越好) | 5,461 | 6,456 | 85% |
| 4K 随机读,QD1,p99 延迟 | us (越低越好) | 264 | 264 | 100% |
| 1M 顺序读,QD8 | MB/s (越高越好) | 1,509 | 1,970 | 77% |
| 1M 顺序写,QD8 | MB/s (越高越好) | 1,810 | 1,906 | 95% |
| 虚拟机 → 另一台机器(千兆口) | Mbit/s (越高越好) | 941 | 941 | 100% |
| 另一台机器 → 虚拟机(千兆口) | Mbit/s (越高越好) | 940 | 941 | 100% |
| 同一宿主上虚拟机 → 虚拟机,单流 | Mbit/s (越高越好) | 7,579 | 31,070 | 24% |
| 同一宿主上虚拟机 ← 虚拟机,单流 | Mbit/s (越高越好) | 7,473 | 30,519 | 24% |
| 同一宿主上虚拟机 → 虚拟机,4 流 | Mbit/s (越高越好) | 6,837 | 26,991 | 25% |
| 同一宿主上虚拟机 ← 虚拟机,4 流 | Mbit/s (越高越好) | 6,983 | 27,018 | 26% |
测试环境
- 服务器:Supermicro X11SPW,Xeon Gold 5122(4 核 8 线程),16 GB,两块 Samsung PM1725a NVMe。为什么不用首页数字那台(2 × Xeon Gold 6144):对比要清空硬盘、装 Proxmox VE,我们两台服务器里只有这台可以清空,另一台在跑长时间测试。
- 虚拟机:Debian 13,4 vCPU,4 GiB,virtio-blk 和 virtio-net。两边用同一份磁盘镜像、同一组 ZFS 卷(volblocksize 16K,不压缩)、同一个 MAC 地址,测试盘事先整盘写过一遍。
- keelOS:开发版 89cdaaf(FreeBSD 14.5,bhyve)。Proxmox VE 9.2:内核 7.0,QEMU 11.0,ZFS 2.4;
--cpu host,磁盘cache=none、aio=io_uring、iothread;vhost-net。两边 ZFS 缓存上限相同,测试时没有别的虚拟机在跑。 - 存储两边都只用一块 NVMe(Linux 读不了第二块盘上的保护信息)。
- 每项跑三次,表里是中位数,三次的数值都在原始数据里。
为什么有些项目落后
- 同一宿主上虚拟机之间。KVM 在内核里转发数据包(vhost-net),虚拟机之间能传大包;keelOS 的 virtio 网卡在 bhyve 的用户态进程里处理。物理千兆口两边都跑满,所以只有同一宿主上虚拟机之间才看得出差别。这一项 keelOS 也有约 7.5 Gbit/s,比千兆、2.5G 网络都快,所以 NAS 虚拟机前面放一台软路由虚拟机,不会卡住局域网里的客户端。更快的路径做好之前,可以给两台虚拟机各一个同一块网卡的 SR-IOV VF,由网卡硬件交换。
- 并发很多的随机磁盘读写。单个请求和 KVM 一样快(QD1 的 p99 延迟相同);QD32 时 bhyve 的 virtio 磁盘同时在处理的请求比 QEMU 的 iothread + io_uring 少。
- 进程互相唤醒。在 keelOS 的 hypervisor 下,唤醒另一个 vCPU 上的进程代价更高;
perf sched pipe里看得到,编译和压缩里也有一点。
我们在做什么
virtio 磁盘的多队列和异步 IO、virtio 网卡更快的数据路径正在做。每个版本都在同一台服务器上重新测,这一页显示最新的一次。