getcpu - 获取当前 CPU 和 NUMA 节点信息]()
1. 函数介绍
getcpu 是一个 Linux 系统调用,用于获取当前线程正在运行的 CPU 核心编号和 NUMA(Non-Uniform Memory Access)节点编号。这个函数对于性能分析、负载均衡、线程亲和性设置等场景非常有用。
data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">NUMA 是一种多处理器计算机内存设计,其中内存访问时间取决于内存相对于处理器的位置。了解当前线程在哪个 CPU 核心和 NUMA 节点上运行,有助于优化程序性能。
2. 函数原型
1 | #define _GNU_SOURCE |
注意:该函数不是标准 C 库的一部分,需要通过 syscall() 调用或者包含 glibc 2.29+ 版本后才能直接调用。
3. 功能
获取当前线程正在运行的 CPU 核心编号和 NUMA 节点编号。这是一个轻量级的操作,通常用于性能监控和调度优化。
4. 参数
unsigned *cpu: 指向存储 CPU 核心编号的变量的指针
如果为 NULL:不返回 CPU 信息
如果非 NULL:存储当前 CPU 核心编号(从 0 开始)
unsigned *node: 指向存储 NUMA 节点编号的变量的指针
如果为 NULL:不返回 NUMA 节点信息
如果非 NULL:存储当前 NUMA 节点编号(从 0 开始)
struct getcpu_cache *tcache: 缓存结构体指针,用于优化性能
通常传入 NULL(内核会使用默认缓存机制)
主要供内核内部使用
5. 返回值
成功时返回 0
失败时返回 -1,并设置 errno
6. 常见 errno 错误码
EFAULT: 指针参数指向无效内存地址
EINVAL: 无效参数
ENOSYS: 系统不支持该功能
7. 相似函数,或关联函数
sched_getcpu(): glibc 提供的获取当前 CPU 的便捷函数
sched_setaffinity(): 设置进程 CPU 亲和性
sched_getaffinity(): 获取进程 CPU 亲和性
pthread_setaffinity_np(): 设置线程 CPU 亲和性
pthread_getaffinity_np(): 获取线程 CPU 亲和性
/proc/cpuinfo: 查看 CPU 信息
/sys/devices/system/cpu/: CPU 拓扑信息
numactl: NUMA 控制工具
8. 示例代码
示例1:基本使用 - 获取当前 CPU 和 NUMA 节点信息
1 | #define _GNU_SOURCE |
示例2:使用 glibc 提供的 sched_getcpu 函数
1 | #define _GNU_SOURCE |
示例3:监控 CPU 迁移情况
1 | #define _GNU_SOURCE |
示例4:多线程环境下的 CPU 信息
1 | #define _GNU_SOURCE |
9. NUMA 系统信息查看
1 | #include <stdio.h> |
10. 性能优化应用场景
getcpu 在以下场景中非常有用:
场景1:线程绑定优化
1 | #include <sched.h> |
场景2:内存分配优化
1 | #include <numa.h> |
11. 实际系统中的应用
- 数据库系统: 将查询线程绑定到特定 CPU 以提高缓存命中率2. Web 服务器: 均衡分配请求处理线程到不同 CPU 核心3. 高性能计算: 优化 MPI 进程的 CPU 和 NUMA 布局4. 实时系统: 确保关键任务在指定 CPU 上运行5. 容器技术: Docker 和 Kubernetes 中的 CPU 资源管理
总结
getcpu 是一个重要的系统调用,用于获取当前线程的 CPU 和 NUMA 节点信息。关键要点:
- 轻量级操作: 快速获取当前执行环境信息2. NUMA 感知: 支持现代多核 NUMA 系统3. 性能优化: 为调度和内存访问优化提供基础信息4. 多线程支持: 在并发环境中准确反映线程位置5. 系统监控: 用于负载均衡和性能分析工具
在编写高性能应用程序时,了解和利用 CPU 和 NUMA 信息可以显著提升程序性能,特别是在多核和 NUMA 系统上。】