0

请帮助我理解这一点。

我有一个 STA VB6 应用程序。它与 .net Web 应用程序在同一虚拟服务器上运行。该服务器上有两个核心。为了衡量 .net 应用程序的性能,我记录了大约 30% 的 cpu 利用率。VB6 应用程序使用大约 20% 的 cpu。它还会在对数据库进行公寓调用时锁定核心一段时间。

如果 VB6 应用程序在公寓外呼叫上花费 1 分钟,我可以假设核心完全锁定一分钟吗?换句话说,我可以假设每个内核为 VB6 应用程序每小时提供一小时的“cpu 时间”吗?所以如果我有两个核心,我可以说这个设置每小时提供 120 分钟的“cpu 时间”吗?

谢谢!

4

2 回答 2

1

从来没有人锁定核心。您将线程与核心混淆了。

在远程调用期间,线程可能(但可能不会)阻塞一分钟。但是核心并不依赖于只运行一个线程,否则现代 Windows(Windows 95 和更新版本)根本不可能工作。Windows 需要能够同时为数百个进程提供服务,并且只需一个内核。

在典型的会话中,内核每秒会挂起数十次或数百次进程的部分或全部线程,并分配每个内核执行其他操作。最终,您的线程将恢复运行——可能在同一个核心上,也可能在不同的核心上。

特别是进行远程调用的线程通常处于“等待状态”,这意味着内核在远程调用完成之前根本不会为线程分配核心。

(采取了几个近似值,但这就是它的要点)

我可以假设每个内核为 VB6 应用程序每小时提供一小时的“cpu 时间”吗?所以如果我有两个核心,我可以说这个设置每小时提供 120 分钟的“cpu 时间”吗?

不。找出进程消耗多少 cpu 时间的唯一实用方法是查看它的性能计数器。每经过一小时,它肯定会远远少于 1 小时的 CPU 时间。为了使每经过一小时的 CPU 时间接近一小时,您最终必须获得接近 100% 的 CPU 总利用率(对于 VB6 进程本身而言)。例如,在双核系统上,每个内核的 48% 左右,全部由 VB6 进程消耗,或类似的。

此外,对于像 VB6 使用的 STA 线程,添加内核对于进程运行所需的时间量(经过的时间,而不是 CPU)没有任何影响(除非多线程 COM 对象在 STA 之外完成重要工作)。

添加 CPU 内核几乎不会增加进程的有益 CPU 时间消耗,因为完成任务所需的通常 CPU 时间量不会因为附近有额外的芯片而改变。

但我认为我们都缺少一些东西。你到底想找出什么?我不知道你真正的问题是什么,但我敢打赌“cpu time”不是答案。

于 2013-05-22T16:05:28.037 回答
0

您的问题被标记为 COM+,因此您需要考虑 COM+ 如何管理组件的线程。

核心不应“锁定”。COM+ 中的线程也不应该(取决于您如何定义锁定),因为一个线程可以服务多个请求。

也就是说,STA COM+ 组件在 COM+ 中的公寓调用时间很长(60 秒!)是导致性能问题的原因。

基本上,COM+ STA 线程池将最多 5 个活动绑定到每个 STA 线程。当您进行公寓外呼叫时,COM+ 允许将其他请求作为 STA 线程上的另一个活动提供服务。最多 5 个活动(每个线程)会发生这种情况。同样,一旦将控制权授予另一个活动,原始活动将无法重新获得控制权,直到第二个活动完成。在重负载下和/或如果调用“长时间运行”,则第一个活动完成的时间是所有其他活动(在线程上)完成的时间的总和。这会扼杀你的表现。

最好的文章是避免来自单线程单元 (STA) 的长时间运行方法调用。我找不到原始的 Microsoft 文章,所以我链接到这个第三方存档版本。

于 2013-06-14T04:11:35.647 回答