假设一台单插槽 Xeon D 服务器,8 核,16 线程,两个 10G SFP+ 接口,64 GB RAM,两个 SSD……
包含 nginx、MariaDB、一些应用程序逻辑以及可能的 Redis 的应用程序包。操作系统可能是 FreeBSD 或 Fedora Server。
启动多个冗余虚拟机(每个虚拟机包含完整的捆绑包)与仅在没有虚拟化的裸机上运行捆绑包的一个实例相比,是否有任何好处?
您能预测网络性能或吞吐量会有什么不同吗?在多个虚拟机之间共享 NIC 是否会提高容量?我的意思是某种 SR-IOV 硬件虚拟化或类似技术。如果 NIC 被虚拟化,它可以处理更多连接吗?
只让应用程序的一个实例利用并直接控制硬件是否更好?
(假设在虚拟化情况下主机和客户机的操作系统相同。我猜使用 KVM 和 Fedora。)
谢谢。
答案1
这是一个简单的“一根绳子有多长”问题。取决于你的绳子;我们不知道你的绳子有多长。正如@ewwhite所说,做一些测试。如果这是一个完全理论/学术的问题,那么你问错网站了。
经验法则 - 当然,裸机的性能应该优于同一硬件上的一组虚拟机,因为虚拟化确实需要一些开销,尽管开销很小。而千兆位网卡只能移动 1 Gbps,虚拟化不会改变这一点。
但有很多实施细节可能意味着你的这样,应用程序就不会达到最佳效果。
如果您的应用程序是单线程的,并且 CPU 是瓶颈(而不是 RAM 或 IO),那么您将无法使用大部分硬件。假设它可以横向扩展而不是纵向扩展,那么只需将其变成一堆虚拟机,并拥有一大堆单 CPU 虚拟机即可。(或者可能是双 CPU 虚拟机。)
或者,您可能会在单个操作系统中遇到限制(最大打开文件句柄、TCP 临时端口,我相信还有其他限制),这些限制会限制潜在的吞吐量,因此将负载分散到该硬件上的多个虚拟机上可以让您克服这一问题。这不是性能瓶颈像这样但虚拟化可以解决这个瓶颈。
出于管理方面的原因,虚拟机也是首选。与裸机相比,虚拟机可以更轻松地自动启动和关闭,尤其是当您不拥有裸机(托管/云提供商)时;通常,虚拟机更有意义,即使它们的性能不如理论上底层硬件那么好。