【发布时间】:2019-01-24 10:25:08
【问题描述】:
我有许多规格非常高(32 个 CPU)的 VMWare Server 2012 实例,但在运行某些应用程序时似乎存在性能问题。
所以,我创建了一个 .Net winforms EXE,它简单地循环直到达到一个计数器:
do
{
mystring = counter++.ToString();
} while (counter != loops);
我在我的生产服务器上发现,我可以在 1 分钟内运行 1.2M 循环。但是,当我运行多个可执行文件实例时,它只需要两倍的时间。
不用说,我运行的实例越多,所需的时间就越长。 IE。 10 个实例大约需要 11 分钟。
当我查看 CPU 使用率时: 1 个实例 = 6% 10 个实例 = 每个实例 0.5%
所以,我的问题是..为什么服务器似乎是按顺序运行,而不是并行运行?这是一个.Net问题吗?服务器配置问题? VMware 问题?
【问题讨论】:
-
服务器不按顺序运行任何东西。每个进程都有自己的线程,操作系统会调度 线程 来执行。如果两个线程最终安排在同一个核心上,它们将不得不互相等待。由于您有一个服务器,很可能桌面的优先级低于服务,甚至可能仅限于核心子集
-
另一方面,您的循环不只是增加一个值,它会在每次迭代时生成一个临时字符串。这意味着,1.2M 临时对象需要在一分钟内进行垃圾回收。我怀疑循环运行时内存使用量也会增加。您看到的性能可能只是垃圾收集,而不是循环本身。一分钟 1.2M 仅是每秒 20K 次迭代
-
@panagiotis 感谢您的回复。性能监视器显示每个应用程序使用 4 个内核,跨多个 CPU,但似乎并未使用所有可用的 CPU。如何检查我的 UI 应用程序是否仅限于核心子集。顺便说一句,'mystring' 是在循环外声明的,所以每次内存使用量不变时,它都不会生成一个新字符串。
-
字符串是不可变的。它制作了一个新的字符串。请返回测量并接受您当前的结果是垃圾。
-
@Quibblesome 我看不出这与问题有什么关系。应用程序的每个实例都在为处理器创建相同的工作负载。然而,该工作负载并未均匀分布在所有可用资源中。 50% 的可用 CPU 保持空闲。完全删除 toString 会在资源分配方面产生相同的结果。
标签: .net multithreading winforms vmware windows-server-2012