如何指定处理器关联?

Posted

技术标签:

【中文标题】如何指定处理器关联?【英文标题】:How can I specify processor affinity? 【发布时间】:2010-05-31 16:39:32 【问题描述】:

我的应用程序在处理多处理器系统时遇到了一些问题。这不是我特别喜欢修改的应用程序,如果可能的话,我想避免它。但是,如果必须,我不会修改代码。该应用程序是用 VBA 编写的(因此我倾向于避免接触它)。

我们注意到,如果我们使用任务管理器将处理器亲和性设置为单个处理器,应用程序似乎运行得相当顺利,只有在未设置处理器亲和性时才会表现出不稳定。

我知道我可以使用 .NET 指定任务的处理器亲和性,因此,我有可能编写一个外壳应用程序,该应用程序可用于运行具有指定处理器亲和性的遗留应用程序,有人有吗?有这方面的经验,并且可以提出一些关于我可能会遇到这种方法的头痛的想法?

另一个问题是:实际上是否可以修改核心 VBA 产品来处理它自己的处理器亲和性?我从来不需要在我的任何应用程序中处理这个问题,所以这(在这个时间点)完全超出了我的专业领域。

提前致谢

【问题讨论】:

我很想知道您在未设置处理器关联时遇到的问题。这些问题是如何表现出来的? @Gary McGill:我们看到的问题(应用程序是为 Access 2003 编写的 - 在 Access 2007/2010 中不起作用)是应用程序崩溃和一般 Access 不稳定。该应用程序最初是在单 CPU/单核机器上编写的,我们现在在更换时遇到了问题。该应用程序在多 CPU 和多核机器上存在各种不稳定性,但在旧机器上仍然可以正常工作。当我们设置处理器亲和性时,不稳定性不再是问题。该应用程序正在重写,但在完成之前,我们陷入了困境。 您是否在 VBA 应用程序中使用多个线程?如果将多线程应用程序限制在单个处理器上可以提高性能,这通常表明存在错误缓存问题 【参考方案1】:

您可以使用Windows Application Compatibility Toolkit 来做到这一点。

你给它一种方法来识别你的应用程序(例如通过 .exe 位置),然后它允许你指定一些调整。处理器亲和性就是其中之一。它会创建一个数据库来保存您的所有调整。

它是每台机器的,因此对于广泛分布的应用程序来说不是一个好的解决方案,但如果这个应用程序只需要在一台机器上运行,它就可以节省您更改代码的时间。

【讨论】:

另外,请注意,默认情况下,版本号是它选择用于识别您的应用程序的项目之一。如果您在更新时定期更改版本号,则可能需要取消选中它作为标准,否则您的调整将在下次升级时停止工作。【参考方案2】:

您可以使用 Sysinternal 的 PsExec 以特定的处理器亲和性来启动您的应用程序,例如将 Access 绑定到 CPU 1 调用

psexec.exe -a 1 "%ProgramFiles%\Microsoft Office\Office12\access.exe"

回答您的第二个问题:当您使用 access-vba 标记问题时,我假设您的 VBA 代码是 Access 解决方案。然后您的 VBA 代码将在进程中执行,即您必须修改 access.exe 进程的处理器关联。无法单独修改 VBA 引擎的亲和性。

但是,在您指定处理器关联之前,请确保您完全了解后果。摆弄此设置可能会产生不良影响。一个很好的例子请阅读 Raymond Chen 的帖子:

Psychic debugging: Why your expensive four-processor machine is ignoring three of its processors

【讨论】:

我们的 IT经理发现这个黑客可以制作一个不能很好地处理多核/多处理器环境的应用程序。它。正在测试修改处理器关联是否会稳定应用程序。如果是,那么它将是一个 I.T.倡议。我被要求从开发的角度提供意见。【参考方案3】:

旧线程,但这里有一些 VBA。可以,但是我没写。

Option Compare Database
Option Explicit

Private Declare Function GetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByRef dwProcessAffinityMask As Long, ByRef dwSystemAffinityMask As Long) As Boolean

Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Boolean

Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long

Public Function SetAffinity()

    Dim hRet As Long
    Dim dwProcMask As Long
    Dim dwSysMask As Long

    hRet = GetProcessAffinityMask(GetCurrentProcess(), dwProcMask, dwSysMask)

    'Set affinity to the first processor
    hRet = SetProcessAffinityMask(GetCurrentProcess(), &H1)

    If hRet <> 0 Then
        MsgBox "Process Affinity successfully set for this application."
    Else
        MsgBox ("Error : " & Err.LastDllError)
    End If

End Function

【讨论】:

以上是关于如何指定处理器关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows XP 的批处理文件中设置处理器关联?

怎样在我的文档里“控制面板里的文件夹选项中创建关联”?

如何以及在哪里处理关联记录的更新过程?

如何手动指定 X-Cloud-Trace-Context 标头值以关联和跟踪单独的 Cloud Run 请求中的日志?

mytabits表关联一对一(多对一?)

MongoDB多表关联分组查询指定行数数据实践遇坑记及解析