Minecraft服务端性能测试:物理机、容器与虚拟机

这次测试的目的是探索Minecraft服务端在宿主机、LXC容器与虚拟机中运行时的性能。
一、测试环境
本次测试的硬件配置与红蓝对决中的蓝方相同。
软件方面分为四组:
①宿主机,或称物理机。操作系统为 Proxmox VE 7.4-16,服务端直接运行在宿主机上,不包含虚拟化。
②LXC容器。使用 Debian 12.0-1 的容器模板,服务端运行在容器中。
③虚拟机(12线程)。操作系统为 Debian 12.0-1,服务端运行在虚拟机中。虚拟机可以占用CPU的所有12个线程。
④虚拟机(6线程)。操作系统为 Debian 12.0-1,服务端运行在虚拟机中。虚拟机可以占用CPU的6个线程,这6个线程分别属于6个物理核心,可以不严谨地认为在虚拟化中关闭了超线程。

此外,Java 版本更新为 17.0.8,其他均与红蓝对决中相同。
下面说明一下设置6线程虚拟机的原因:
超线程在宿主机上能以正确的方式被识别和调用,但分配给虚拟机时,虚拟机可能无法认识到哪两个线程来自同一物理核心,因此在涉及多核计算时无法正确地调用。后面的数据将验证这一猜测。
红蓝对决中也对读者可能产生的一些问题做了说明。
二、测试项目
与红蓝对决中的项目相同,但取消了活塞测试,因为其数据不稳定。
三、测试流程
每次测试的流程与红蓝对决中相同,这样的流程重复了八次。第一、五次是宿主机测试,第二、六次是LXC容器测试,第三、七次是虚拟机(12线程)测试,第四、八次是虚拟机(6线程)测试。目的同样是排除偶然因素、获取能相互验证的测试结果。
四、测试结果
测试得到的数据如图2。

对数据做可视化。

将每项测试的数据除以宿主机平均值得到相对值。

五、总结
TNT测试中虚拟机(6线程)明显优于虚拟机(12线程),这项测试的CPU占用也确实超出了一个线程(注意,这可能是优化mod而非原版Minecraft的策略)。这一现象有力地验证了前面的猜测:虚拟机不能正确识别和调用超线程,因此只分配每个核心的一个线程给虚拟机能取得更大性能优势。
其他几项测试也说明,虚拟机相比于LXC容器在性能上更接近宿主机。尤其在村民测试中,虚拟机的性能甚至优于宿主机,这种差异由偶然因素导致的可能性较低,更可能是由操作系统不同导致的。尽管虚拟机本身也运行在PVE中,但其面向Minecraft服务端的操作系统是Debian。
综合以上结论:非超线程虚拟机对超线程虚拟机有性能优势,虚拟机对LXC容器有性能优势。