我正在分析一个问题,即虚拟机内受 CPU 限制的工作负载的性能通常(并非总是)低于我们基于底层硬件的预期。
我们在 Windows Server 2012 R2 上使用 Hyper-V。该服务器具有双 Intel Xeon E5-2643 v2 @ 3.50 GHz。
以下是一些似乎相关的数字:
在只有几个核心的台式机上,一旦开始受 CPU 限制的活动,核心速度就会立即提高。
然而,在我们的 Hyper-V 主机上,只有当整个系统负载似乎很高几秒钟时,核心速度才会上升。现在,例如,如果您有一个虚拟机,在总共 24 个物理 CPU 中有 4 个虚拟 CPU(打开超线程),并且此虚拟机需要 CPU 功率,并且虚拟机内的任务管理器显示接近 100% 的 CPU 使用率,大部分时间是时钟物理CPU的速度不会上升,性能很差。
显然,这是不需要的行为。想想一个数据库服务器需要 3 倍的时间来回答查询,因为服务器没有“足够”的负载来提高 CPU 频率。那没有任何意义。
我发现了一篇博客文章,描述了2011 年VMWare 和 Cisco …
我在 Win2003 32 位上运行一个 ASP.NET 应用程序,它往往会分配大量内存。为了避免在 W3P 进程超过 1 GB 时开始出现 OutOfMemoryExceptions,我为此应用程序池设置了 850 MB 的最大虚拟内存限制,因此应用程序将重新启动而不是抛出异常。
虽然不会抛出异常,但这些重启仍然会导致暂时的性能退化(低缓存命中率、aspx 编译等),所以我想尽量减少重启的次数。观察性能计数器,我可以看到 ASP.NET 缓存按设计工作(项目计数和缓存命中率在启动后增加,而某些项目可能由于到期日期而被删除),除了缓存修整。
例如 我希望缓存修整在例如 750 MB 正在使用并且其中一半是缓存时启动。但它永远不会发生,在负载下它会继续分配越来越多的内存,而不是例如丢弃低优先级缓存项,直到达到内存限制。
有人知道什么会真正触发缓存修剪吗?可用物理内存?是否有任何其他设置可用于优化此场景?
(是的,我知道,32 位是 2004 年,使用 x64 这个问题会消失,甚至可能使用相同数量的内存,但对于这个应用程序,我在这台服务器上又卡住了几个月,必须保持它跑步...)