You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为超64核(双处理器组)环境获取各处理器组的亲和掩码?

处理超过64核服务器的处理器亲和掩码获取问题

刚好处理过类似的多处理器组场景,我来给你梳理下解决方案:

为什么原有方法不适用

咱们常用的GetProcessAffinityMask和.NET的Process.GetCurrentProcess().ProcessorAffinity都是基于单个处理器组设计的——它们的掩码是64位,只能覆盖一个组内的64个逻辑核心。当系统拆分出多个处理器组(比如你说的128核分成两组),这些方法只能返回进程关联的第一个组的掩码,完全没法获取其他组的亲和配置。

获取多组亲和掩码的具体步骤

1. 先拿到进程关联的所有处理器组

要获取多组信息,首先得用GetProcessGroupAffinity这个API,它能返回进程关联的所有处理器组ID,以及每个组的基础亲和框架。调用逻辑分两步:

  • 先传入dwGroupCount=0,获取进程关联的组总数
  • 分配足够内存存储GROUP_AFFINITY数组,再调用一次拿到所有组的详细信息

2. 针对每个组单独获取亲和掩码

拿到组列表后,对每个组用GetProcessAffinityMaskEx(Windows 7及以上系统支持)来获取该组内的进程亲和掩码和系统亲和掩码。这个API的核心是GROUP_AFFINITY结构体,它把组ID和对应的64位掩码绑定在一起:

typedef struct _GROUP_AFFINITY {
  KAFFINITY Mask;    // 64位亲和掩码
  WORD      Group;   // 处理器组ID
  WORD      Reserved[3];
} GROUP_AFFINITY, *PGROUP_AFFINITY;

3. .NET环境下的实现思路

如果是用C#这类.NET语言,得通过P/Invoke封装这些Windows API:

  • 先定义GROUP_AFFINITY结构体(记得加StructLayout(LayoutKind.Sequential)保证内存布局正确)
  • 声明GetProcessGroupAffinity和GetProcessAffinityMaskEx的P/Invoke方法
  • 按步骤先获取组列表,再遍历每个组拿到对应掩码

示例代码(C++)

给你一段可直接参考的C++代码,演示完整流程:

#include <windows.h>
#include <iostream>

int main() {
    HANDLE hProcess = GetCurrentProcess();
    DWORD returnedGroups = 0;

    // 第一步:获取进程关联的处理器组数量
    if (!GetProcessGroupAffinity(hProcess, 0, nullptr, &returnedGroups)) {
        std::cout << "Failed to get group count: " << GetLastError() << std::endl;
        return 1;
    }
    if (returnedGroups == 0) {
        std::cout << "No processor groups associated with this process." << std::endl;
        return 0;
    }

    // 分配内存存储组亲和信息
    GROUP_AFFINITY* groupAffinities = new GROUP_AFFINITY[returnedGroups];
    if (!GetProcessGroupAffinity(hProcess, returnedGroups, groupAffinities, &returnedGroups)) {
        std::cout << "Failed to get group affinities: " << GetLastError() << std::endl;
        delete[] groupAffinities;
        return 1;
    }

    // 第二步:遍历每个组获取亲和掩码
    for (DWORD i = 0; i < returnedGroups; ++i) {
        GROUP_AFFINITY processAffinity = {0};
        GROUP_AFFINITY systemAffinity = {0};
        processAffinity.Group = groupAffinities[i].Group;
        systemAffinity.Group = groupAffinities[i].Group;

        if (GetProcessAffinityMaskEx(hProcess, &processAffinity, &systemAffinity)) {
            std::cout << "=== Processor Group " << processAffinity.Group << " ===" << std::endl;
            std::cout << "Process Affinity Mask: 0x" << std::hex << processAffinity.Mask << std::endl;
            std::cout << "System Affinity Mask: 0x" << std::hex << systemAffinity.Mask << std::dec << std::endl;
        } else {
            std::cout << "Failed to get affinity for group " << groupAffinities[i].Group << ": " << GetLastError() << std::endl;
        }
    }

    delete[] groupAffinities;
    return 0;
}

关键注意事项

  • 确保目标系统是Windows Vista及以上版本,且硬件确实配置了多处理器组
  • 调用所有API都要检查返回值,处理权限不足、API不支持等错误情况
  • .NET中使用P/Invoke时,要注意数据类型的匹配(比如KAFFINITY对应ulong)

内容的提问来源于stack exchange,提问作者V. Dmitriy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:52