处理器关联组 C#

Posted

技术标签:

【中文标题】处理器关联组 C#【英文标题】:processor affinity group C# 【发布时间】:2017-12-04 21:31:53 【问题描述】:

我正在使用具有 72 个内核的 Windows Server 2016。我看到有 2 组处理器。我的 .net 应用程序将使用一个或其他组。我需要能够强制我的应用程序使用我选择的组。 我在下面看到一个代码示例,但我无法使其工作。我可能传递了错误的变量。我希望应用选择第 1 组和所有处理器,然后选择第 2 组和所有处理器。

我的问题是如何强制我的 .net 应用使用第 1 组或第 2 组?我不确定下面的链接是否有效。

https://gist.github.com/alexandrnikitin/babfa4781c68f1664d4a81339fe3a0aa

我确实尝试将其添加到我的配置中,但该应用程序仅使用组 0,但我确实使用此代码显示了所有核心。我知道一个选项是转到 bios 并选择 flatten,但我不确定这是正确的做事方式。

   <Thread_UseAllCpuGroups enabled="true"/>  
      <GCCpuGroup enabled="true"/>  
      <gcServer enabled="true"/> 

【问题讨论】:

您不能将 72 个内核扁平化为一组。一个 CPU 组的限制是 64 个。HP 有一个 BIOS 功能,可以将 CPU 组设置为集群,不幸的是默认情况下是打开的。这为具有 嗨,我的目标是强制我的 .net 应用选择我想要的组。我有 10 个应用程序正在运行,我希望一组有 5 个,另一组有 5 个。我的问题是我该如何强制?该链接的代码显示您可以选择组,但是当我使用传递 1,0 的代码时,它似乎不起作用。也许我传递的值错误或代码不起作用 我重新提出这个问题。我认为这是关于在多个组上运行,而不是选择你想要运行的组。我的错。 【参考方案1】:

发布的示例仅将当前线程设置为 CPU 处理器组。但是您想为进程的所有线程设置它。您需要为您的流程调用 SetProcessAffinityMask。

不需要 PInvoke 到 SetProcessAffinityMask,因为 Process 类已经有一个属性 ProcessorAffinity 可以让您直接设置它。

class Program

    static void SetProcessAffinity(ulong groupMask)
    
        Process.GetCurrentProcess().ProcessorAffinity = new IntPtr((long)groupMask);
    
    static void Main(string[] args)
    
        SetProcessAffinity(1);    // group 0
        // binary literals are a C# 7 feature for which you need VS 2017 or later.
        SetProcessAffinity(0b11); // Both groups 0 and 1 
        SetProcessAffinity(0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111); // for all cpu groups all 64 bits enabled
    

【讨论】:

非常感谢。你能告诉我没有二进制文字的样子吗?我还在 2016 年, 如果我只想要第 1 组会是什么样子。 我需要在配置中设置这个才能使用所有内核吗? @Andre:不,你不需要这些 appsettings,因为只有当你想让你的线程在所有 CPU 组上运行时才需要它们。但是您只想在组 0 或 1 上运行。为此,您需要调用 SetProcessAffinity(1) 或 SetProcessAffinity(2) 来设置位 0 或位 1。 这个答案具有误导性。 @AndreDeMattia 想要将进程分配给特定的处理器组,因为系统有超过 64 个逻辑处理器,并且 Windows 已经创建了超过 1 个处理器组,每个处理器组最多有 64 个逻辑处理器。处理器组通常与机器的 NUMA 架构对齐。 .NET Process.ProcessorAffinity 只能设置进程的线程亲和性,而不能更改处理器组亲和性。

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

[C#] 学会处理异常

如何在 C# 中实现线程关联?

C#入门详解(11)

将进程分配给处理器组

C#多线程处理

处理从 C# 服务器返回的 SAFEARRAY