问题
最近遇到一个场景,在多NUMA节点(Xeon E5-2620 v2 x2, 2 NUMA, node, 24线程)的机器上,希望部署可以充分利用CPU资源的虚拟机方案。由于没有在多NUMA环境下的经验,一上来直接安装了virtualbox,并指定了24个核心到虚拟机上。但是在配置时发现virtualbox提示说有存在问题的配置,只有分配不超过12个核时才正常。同时启动virtualbox虚拟机后发现,虚拟机运行十分卡顿,且在宿主机上观察CPU有大量的sys占用。如何才能解决在linux下让虚拟机用上超多核心的问题呢。
探索
经过一番搜索,发现已经有人遇到过类似问题了。有人在几年前说,使用virtualbox,只能用满一个CPU插槽上的核心,多了反而会更慢。他提到的理由是,进程只能在一个NUMA节点上运行,但是我查了下好像系统级别并没有这么一说。看起来这个问题只是因为virtualbox虚拟的CPU都是完全相同的(类似SMP),没有体现出分布在多个NUMA节点上的差异;或者是virtualbox的实现中只会考虑一个NUMA节点的情况。后一种可能性比较大,感觉像是oracle的策略问题,virtualbox的目标用户群是使用非NUMA机器的桌面用户而不是用多NUMA节点机器的服务器。
至少现在确认问题了,virtualbox想用在多NUMA上应当是不可能了。接下来要挑选一个新的方案。再次经过搜索,virt-manager + kvm的方案进入了我的视野。起码在创建机器设设置时,可以选择CPU的模拟配置,比如CPU插座数,单个CPU的核数,单个核的线程数。
方案
接下来在debian宿主机上安装好整套工具,接下来通过X11转发运行virt-manager管理器,可以看到非常简洁实用的界面。于是创建虚拟机,使用已有的磁盘镜像,绑定好CPU的布局,配置好内存核网络等其他参数,配置完成。接下来启动机器,果然效果不一般,运行比之前顺畅了许多,并且CPU空载占用也低了不少。
回顾
还是要多玩玩高级货。要不是这一次经历,对于NUMA没有这么深的体感。借此机会了解NUMA时,发现了NUMA对于应用的运行也有至关重要的影响,特别是一些传统的关系型数据库。并行计算坑还是不少啊。