请帮我理解这一点。
我有一个STA VB6应用程序。它与.net Web应用程序在同一虚拟服务器上运行。该服务器上有两个核心。为了测量.net应用程序的性能,我记录了大约30%的CPU利用率。 VB6应用程序使用大约20%的CPU。它还会锁定核心一段时间,同时它会对数据库进行公寓调用。
如果VB6应用程序在公寓电话中花费1分钟,我可以假设核心已完全锁定一分钟吗?换句话说,我可以假设每个核心为VB6应用程序每小时提供一小时的“cpu时间”吗?所以如果我有两个核心,我还可以说这个设置每小时提供120分钟的“CPU时间”吗?
谢谢!
答案 0 :(得分:1)
永远都没有锁定核心。你将线程与核心混淆。
线程可能(但可能不会)在远程调用期间阻塞一分钟。但是Core并不仅仅依赖于运行一个线程,或者现代Windows(Windows 95和更新版本)根本无法工作。 Windows需要能够同时为数百个进程提供服务,只需一个核心。
在典型的会话中,内核将暂停数十次或每秒数百次部分或全部进程的线程,并指定每个内核执行其他操作。最终,你的线程将恢复生存 - 可能在同一个核心,也许在不同的核心。
特别是进行远程调用的线程通常处于“等待状态”,这意味着在远程调用完成之前,内核不会将Core分配给所有线程。
(已经采用了几个近似值,但这就是它的要点)
我可以假设每个核心为VB6应用程序每小时提供一小时的“cpu时间”吗?所以如果我有两个核心,我还可以说这个设置每小时提供120分钟的“CPU时间”吗?
没有。找出进程消耗多少CPU时间的唯一实用方法是查看其性能计数器。每个小时的CPU时间肯定会少于1小时。因为它甚至接近每小时CPU时间的一小时,所以你必须最终得到几乎100%的CPU利用率(对于VB6进程本身而言)。例如,在双核系统上每个核心占48%,所有这些都由VB6进程消耗,或者其他一些。
此外,对于像VB6一样使用的STA线程,添加核心将没有任何区别(禁止在STA外部执行重要工作的多线程COM对象)该进程所花费的(经过的,而不是CPU)时间量。运行
添加CPU内核几乎从不会增加进程的有益CPU时间消耗,因为完成任务所需的通常CPU时间量不会因为附近有额外的硅而改变。
但我认为我们都缺少一些东西。您试图找出的确切是什么?我不知道你的真正问题是什么,但我敢打赌“cpu time”不是答案。
答案 1 :(得分:0)
您的问题被标记为COM +,因此您需要考虑COM +如何管理组件的线程。
核心不应该“锁定”。并且COM +中的线程也不应该(取决于你如何定义锁定),因为一个线程可以为多个请求提供服务。
也就是说,一个STA COM +组件在COM +的公寓呼叫中长时间(60秒!)就是出现性能问题的方法。
基本上,COM + STA线程池最多绑定5个活动到每个STA线程。当您离开公寓时,COM +允许其他请求作为STA线程上的另一个活动进行服务。最多5个活动(每个线程)可能会发生这种情况。此外,一旦对另一个活动进行了控制,原始活动就无法重新获得控制,直到第二个活动完成。在负载很重和/或如果调用“长时间运行”,则第一个活动完成的时间是完成所有其他活动(在线程上)的时间总和。这可能会影响你的表现。
关于此的最佳文章是Avoid Long Running Method Calls from a Single-Threaded Apartment (STA)。我找不到原始的Microsoft文章,所以我链接到这个第三方存档版本。