10

我有一个带有第三方应用程序的四核系统,它偶尔会旋转几个进程(总是相同的可执行文件,但它有几个实例)并占用 100% 的 CPU 时间。我还在同一个盒子(IIS 和第三方)上运行了几个 Web 服务。

所有核心都忙的问题是它使这个第三方 Web 服务器超时(IIS 工作正常,只是比平时慢)。我无法控制第三方网络服务器,它是更大产品的一部分并且必须能够运行。因此,我尝试使用处理器亲和性(通过 SysInternals Process Explorer)并将那些讨厌的进程限制为 4 个内核中的 3 个内核,并将第 4 个内核专用于第三方 Web 服务器,它似乎工作得很好。

问题是它只在正在运行的进程上设置亲和力,而不是在可执行级别上,所以在这些进程完成并稍后作为新进程重生之后,它又是一样的——它们占用了所有 4 个内核。因此,我在 Google 上搜索了 Microsoft 提供的这个 ImageCfg.exe 实用程序,但我无法在 Microsoft 网站上找到它以供下载,我看到有些人尝试过它,但现在抱怨它并没有真正起作用。

有没有办法将亲和力与可执行文件联系起来?

4

8 回答 8

6

http://waynes-world-it.blogspot.com/2009/06/processor-affinity-on-windows-server.html

电源外壳

使用 PowerShell 为一个或多个正在运行的进程设置处理器关联。下面有一个示例脚本,将 calc.exe 的处理器掩码设置为前 4 个处理器。我喜欢这种方法,因为脚本很简单,很容易安排,适用于 x86 和 x64,支持同名的多个进程,至少部分是因为它突出了使用 PowerShell 进行管理是多么容易。

请注意,如果您在 calc.exe (n!) 中使用大量的阶乘,您将生成 100% 的 CPU,这对于测试很有用。下面的掩码是 0xf = 1111 – 一个只允许使用前四个处理器的掩码:

$calcSet = Get-Process -ProcessName "calc"
foreach ($calc in $calcSet) {$calc.ProcessorAffinity=0xF}
于 2010-01-23T11:24:55.607 回答
5

Process Lasso的一个功能是在启动进程时设置进程的亲和性。

于 2009-03-09T21:14:58.617 回答
4

您可能想查看 的/AFFINITY参数start

从帮助:

AFFINITY    The new application will have the specified processor
            affinity mask, expressed as a hexadecimal number.

由于 Windows 上的处理器亲和性是一个位掩码,您可能需要进行一些实验,但我假设1是第一个核心,因此7是前三个核心并且F全部是四个。或者8只有第四个。

start然后,您可以使用适当的参数调用来替换计划任务或快捷方式。

于 2009-03-09T21:15:56.383 回答
4

ImageCfg.exe 实用程序确实有效。我今天只是用它来解决公司问题。可从http://www.robpol86.com/pages/imagecfg.php获得

Imagecfg -a 0x3 xxx.exe

例如,将 .exe 限制为 CPU0 和 CPU1。

于 2009-06-12T20:42:36.003 回答
3

使用SetProcessAffinityMask()。请注意,处理器亲和力是继承的!

您需要使用 ImageFileExecutionOptions,特别是“调试器”选项,并编写自己的小型可执行文件,该可执行文件在其自身上调用 SetProcessAffinityMask(),然后生成一个新进程,即您要为其设置亲和力的进程。将其设置为调试器,您就完成了。

于 2009-03-09T21:15:00.147 回答
3

您可以使用单进程关联应用程序 shim 将一个处理器强制置于可执行级别,这会将进程强制到一个内核上。

这篇文章http://msdn.microsoft.com/en-us/library/bb173458.aspx有一段关于使垫片朝向底部。

于 2009-03-09T21:16:38.410 回答
1

显然这个帖子已经过时了,但我还是添加了一条评论,以防万一有人在这个主题上搜索(就像我一样)

您可以尝试设置进程的优先级,这样即使它决定使用 100% 的 CPU,在需要时,更高优先级的东西也可以接管。

自动执行此操作(而不是必须在任务管理器中播放)是我不久前询问的问题。

start 命令可用于设置进程的启动优先级。

例如。start "my path\my process" /LOW为低优先级。

允许的优先级开关 LOW, NORMAL, HIGH, REALTIME, ABOVENORMAL, BELOWNORMAL

例如,可以从批处理文件中调用。

于 2012-09-14T17:58:44.910 回答
0

您可以尝试设置进程的优先级,这样即使它决定使用 100% 的 CPU,在需要时,更高优先级的东西也可以接管。

自动执行此操作(而不是必须在任务管理器中播放)是我不久前询问的问题。

于 2009-03-09T21:28:29.193 回答