Minecraft服务端性能测试:容器与虚拟化(host)

一、测试环境
测试分为四组:宿主机、LXC容器、虚拟机(12线程)、虚拟机(6线程)。虚拟机的CPU类型改为host,其他方面与容器与虚拟化(kvm64)相同。
二、测试项目
1. 侦测器音符盒
增加了有效层数。

2. 漏斗

3. 村民
以村民代表实体。尝试降低村民走动带来的mspt波动。

4. TNT
用命令方块循环填充玻璃、生成TNT爆炸。方块从雪块改成玻璃,原因是玻璃被炸不掉落物品,也不产生光照更新。

5. 活塞
完全重构了活塞测试。

五项测试中,仅有活塞测试包含了光照更新。后面我们也会看到,服务端仅在活塞测试中有明显的多线程调用。
三、测试流程
启动计算机。
启动容器或虚拟机(如果是容器或虚拟机测试)。
启动Minecraft服务端。每次启动均使用完全相同的存档,而不是上次测试结束后的存档。
tick warp 12000
player Steve spawn at -864 32 -864 #侦测器音符盒
tick warp 12000 #记录输出的mspt
tick warp 12000 #记录输出的mspt
tp Steve 1000 256 1016 #漏斗
tick warp 12000 #记录输出的mspt
tick warp 12000 #记录输出的mspt
tp Steve 1000 24 -1000 #村民
tick warp 12000 #记录输出的mspt
tick warp 12000 #记录输出的mspt
tp Steve -1000 256 1000 #TNT
tick warp 12000 #记录输出的mspt
tick warp 12000 #记录输出的mspt
tp Steve 2000 7 0 #活塞
tick warp 12000 #记录输出的mspt
tick warp 12000 #记录输出的mspt
停止Minecraft服务端。
关闭容器或虚拟机(如果是容器或虚拟机测试)。
关闭计算机。
上述流程在每组中重复了16次,共64次。
接下来看看这种流程中的CPU占用。图6由上至下分别是宿主机、LXC容器、虚拟机(12线程)、虚拟机(6线程)的CPU占用情况。明显可见,前四项测试均为12线程处理器典型的单线程占用,而活塞测试调用了更多的线程,合理推断这些额外的线程被用于计算光照更新。此外,宿主机与容器在活塞测试中的占用更低(20%-25%),虚拟机(6线程)占用略高(~30%),虚拟机(12线程)占用最高(~35%)。




图6 CPU占用情况
四、测试结果
测试得到的数据如下。

做可视化处理。

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

做可视化处理。

五、总结
五项测试中LXC容器均有不同的性能衰减。侦测器音符盒、漏斗、TNT测试中虚拟机与宿主机性能几乎完全相同,村民测试中虚拟机性能表现甚至优于宿主机,但在活塞测试中虚拟机有约10%的性能衰减,6线程虚拟机表现比12线程虚拟机更好,但差距不大。
至于为什么在活塞测试中虚拟机占用更高、表现更差呢?我暂时没有什么头猪。