【问题标题】:Why does my test winforms application seem to run sequencially?为什么我的测试 winforms 应用程序似乎按顺序运行?
【发布时间】: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


【解决方案1】:

我认为这不是测试它的好方法。 基本上,您正在测试用户界面,并且认为用户界面仅由一个内核提供服务并不疯狂。

WinForm 应用程序(以及从它派生的东西,如 WPF)专门在一个主 UI 线程上处理 UI,如果它们试图在其他线程上处理 UI,则会发生竞争条件,这过去会导致随机锁定和冻结,但今天只是抛出异常(这更好)。您可以在 WinForm 应用程序中使用多线程(看起来不像您),但您不能触摸这些线程上的可视组件。所有可视组件事件(单击、鼠标悬停等)都将在 UI 线程上处理。

控制台应用程序可能会让您更清楚地阅读。最好找到其他人制作的工具,因为在衡量性能方面存在大量陷阱,您可能会遇到这些问题。

供参考:根据这样的测试得出的结论是有问题是不好的(例如在 VMWare、服务器或 Windows 中),如果您是同事,我会少考虑您。在这种大胆的断言中要更加谨慎,并相信问题出在您的测试first最重要的上。在尝试衡量绩效时,这是最好的心态始终
在您遇到同一堵墙可能一周或几个月后,您可能会开始质疑拥有庞大 用户群和高度复杂的发布流程和 QA 的软件产品。

【讨论】:

  • 感谢您的回复。我假设存在配置问题的原因是当我在本地硬件上运行相同的测试时,问题并不那么明显。运行 1 需要 2.5 分钟,但运行 10 只需 8 分钟,这比功能更强大的服务器要快。
  • 你是如何计时的?您应该使用 System.Diagnostics.StopWatch 然后 Elapsed.TotalMilliseconds
  • 我只是简单地运行应用程序,看看需要多长时间才能完成。我的假设是,如果一组硬件需要 1 分钟,运行相同的应用程序两次应该仍然只需要 1 分钟多一点,因为有足够的资源来处理同时运行 2 个简单的循环。
  • 是的,不要那样做。你是人,你很乱,你错了。让电脑来做计时,永远,永远,永远,相信自己。你所有的假设都将被证明是错误的。在大多数情况下,性能测试是关于质疑你自己。我建议做更多的研究。尝试前往 irc.freenode.net 并找到一个有系统管理员的房间并询问他们。或者在此处重新发布“如何测试这个”问题。
  • @user10960824 每分钟 120 万次迭代速度非常慢。每秒只有 20K 次迭代。另一方面,您正在创建 1.2M 必须被垃圾收集的临时字符串。我怀疑你的时间是垃圾收集器,而不是循环
猜你喜欢
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多