限制进程使用的处理器数量

时间:2010-11-02 17:35:54

标签: .net multithreading

背景

我目前正在重构遗留的.NET应用程序。该应用程序在相对较长的时间段内(最多几个小时)执行复杂的数学计算,在此期间,在多个线程上几乎连续的处理器使用时段发生。

每个用户都有一台8核心机器,专门用于运行应用程序实例(它们使用其他机器运行所有其他应用程序)。应用程序使用共享系统帐户执行,该帐户允许支持人员在需要时通过远程桌面连接到计算机并监视应用程序(这种情况经常发生)。

当应用程序进程启动时,它会设置自己的处理器关联性,以便允许进程使用除一个处理器之外的所有处理器。例如。在8处理器机器上,亲和性设置为0x007F(01111111),将应用程序限制为处理器1到7,并防止它执行处理器8上的任何线程。排除的处理器始终是由关联性中最高位表示的处理器值。

这样做的理由是,排除一个处理器可以让机器在提供远程桌面会话时以及使用可能需要不时使用的任何其他临时监控工具时保持更快的响应速度(Baretail,Process资源管理器等。)。

问题

考虑到应用程序的一个CPU资源成本,这是否可能带来很多好处?

显然,我可以执行一些测试以收集经验证据,但测试机器的可用性是有限的,并且应用程序的行为具有许多外部依赖性,这意味着密集处理器使用的时间很难确定。正确地对此进行基准测试所需的时间和资源可能远非微不足道。出于这个原因,我正在寻找支持或反对这样做的理论原因。对我来说,这似乎是一个坏主意,因为应用程序被阻止使用整个CPU的资源,这些资源不太可能被其他进程完全占用。我想删除处理器限制,并允许Windows无限制地管理CPU分配。但是,如果我的怀疑是正确的,我需要能够提出一些 hard facts 令人信服的论据,以便出售这种变化。

1 个答案:

答案 0 :(得分:3)

虽然我现在无法提供很多关于你如何做的事实,但我的反应是你是对的,你所描述的当前方法是错误的。

我建议的是减少长时间运行进程的执行优先级。在典型情况下,任何低于正常水平的情况都会同样有效。这使得进程可以使用所有可用资源,只要没有其他任何需要它们,但是在需要时将所有必要的资源专用于其他进程。