我们的IT人员创建了一个分配了2个CPU的虚拟机,而不是我要求的4个。他们的理由是,使用2个CPU而不是4个CPU(根据它们),VM的性能更好。理由是VM虚拟机管理程序(在本例中为VMWare)在使所有CPU投入使用之前等待所有CPU可用。因此,等待4个而不是2个CPU需要更长的时间。

这条语句有意义吗?

#1 楼

这曾经是正确的,但不再完全是正确的。

他们指的是严格的协同调度。


最重要的是,在严格的协同调度算法中,滞后的vCPU的存在导致整个虚拟机被协同停止。在宽松的协同调度算法中,领先的vCPU根据相对于最慢的同级vCPU的偏斜来决定是否应自行停止

现在,如果仅主机有4个线程,那么分配所有线程将很愚蠢。如果它有两个处理器,每个处理器有4个线程,那么您可能不希望分配单个处理器的所有内容,因为虚拟机管理程序应尝试将vCPU保持在同一NUMA节点上,以加快内存访问速度,并且通过将整个套接字分配给单个VM来使这项工作变得更加困难(请参见上面的PDF第12页)。

因此,在某些情况下,vCPU的性能要好于其他,而不是100 % 的时间。

说了这么多,我很少为每个来宾分配超过3个vCPU。默认情况下,每个人都会得到2个,如果工作量很大,则每个人都会得到3个,而对于SQL Server或真正繁重的批处理VM​​或具有很多用户的终端服务器,则每个人都会得到4个。

评论


顺便说一句-即使没有虚拟化障碍,编写利用并行性的软件通常也很棘手。如果您的软件工程师还不够好,那么让四个虚拟主机分别运行一个软件实例可能比一个主机运行四个执行线程更好。

–罗安
15年4月30日在16:06

@Luaan盒子上有SQL Server,所以我认为他们那里有一些不错的软件专家。

–AngryHacker
15年4月30日在21:33

@AngryHacker是,假设您具有适当的MAXDOP设置,SQL Server可以非常高效地使用所有4个内核。但是,根据工作负载,负担过重的SQL Server通常是数据库设计不佳的标志-索引错误,没有聚集索引,索引太多,没有优化等(不总是,但经常)。

–马克·亨德森(Mark Henderson)
2015年4月30日23:12



@Luaan仍然是并行性...如果他们需要彼此交谈,则延迟要高得多。 :)

– reirab
2015年5月1日2:00

@MarkHenderson它的优化效果非常好,但是有些工作量太大,无法同时由2个CPU和大量其他查询轻松处理。

–AngryHacker
2015年5月1日下午5:23

#2 楼

这在很大程度上取决于底层的虚拟机管理程序和运行它的管理员,让我解释一下:


仅仅因为您请求而随意给您4个CPU是不好的做法。一般来说,您认为您需要4;但是资源监视说您只需要1。
例如,VMware ESXi要求在vCPU发出对CPU资源的请求时锁定所有pCPU。因此,在此虚拟机监控程序上,这会降低性能。 KVM不会像ESXi那样进行锁定。它使用底层的内核调度程序,但从长远来看仍然会造成CPU争用。
如果您从一开始就使用4个CPU构建系统,则实际上并没有向外扩展,而是向上扩展(尤其是不好的做法)在VM上)。您可能想检查一下如何构建您正在使用的内容,以便可以将其构建为可扩展到当今的现代云基础架构。

您可以从中学到什么?始终使用最少的资源创建VM,并根据需要增加VM。始终横向扩展而不是向上扩展,您将可以在任何地方运行您的应用。

由于虚拟机管理程序可以实现锁定,因此确实可以理解,两个CPU的速度可以比四个CPU快。 CPU。

#3 楼

是的,该声明通常是合理的。但是,您应该测试一下它的确切配置和工作负载。如果您可以真正利用它们,有时更多的CPU会更好。但是,如果您实际上并没有那么多的并行性,那么配置有较少CPU的VM的性能通常会稍好一些,因为它避免了由于CPU就绪状态暂停而导致的速度降低。

我减少了vCPU我们有许多虚拟机,并且大多数虚拟机的吞吐量都有所提高。少数情况变得更糟,需要提高vCPU数量。