处理器关联组 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 组会是什么样子。 我需要在配置中设置这个才能使用所有内核吗?以上是关于处理器关联组 C#的主要内容,如果未能解决你的问题,请参考以下文章