如何判断一个多核机器(Linux)是否为NUMA结构

在Redhat或Centos系统中,可以通过命令#grep-inuma/var/log/dmesg查看输出结果:如果输出结果为:NoNUMAconfigurationfound,说明numa被禁用。
如果不是以上内容,说明numa已启用。

获知Linux的进程运行在哪个CPU内核上的方法

当您在多核NUMA处理器上运行HPC(高性能计算)程序或使用大量网络资源的程序时。
CPU/内存亲和性是限制其最大性能的重要因素之一。
在同一NUMA节点上调度最相关的进程可以减少缓慢的远程内存访问。
像带有集成PCIe控制器的IntelSandyBridge处理器;您可以在同一NUMA节点上调度网络I/O负载(例如网卡),以克服PCI和CPU关联性限制。

作为性能优化和故障排除的一部分;您可能想知道哪个CPU核心(或NUMA节点)被安排运行特定进程。

有多种方法可以找出调度哪个CPU核心来运行给定的Linux进程或线程。

方法一如果使用taskset命令将进程固定在CPU的特定核心上;您可以使用taskset命令找出固定的CPU核心:

复制下面的代码。
:$taskset-c-p

例如,如果您对PID5357过程感兴趣。
复制代码如下:$tasksset-c-p5357pid5357'scurrentaffinitylist:5输出显示该进程挂载到CPUcore5。

但是,如果进程没有明确绑定到任何CPU核心。
描述如下您将获得与此类似的亲和力列表。

pid5357'scurrentaffinitylist:0-11输出表明该进程可以调度在0到11之间的任何CPU核心上。
在这种情况下,任务集不识别分配给哪个CPU核心进程;你应该使用下面的方法。

方法2:ps命令可以告诉你当前分配给每个进程/线程的CPUID(在“PSR”列中)。

复制代码如下:$ps-opid,psr,comm-p

PIDPSRCOMMAND535710prog输出表明进程PID5357(名为“prog”)当前正在CPU核心10上运行。
如果该进程附加到主进程PSR列会根据内核是否将进程调度到不同的内核而变化。

方法3:top命令还可以显示CPU分配的进程。
第一的,使用top命令中的“P”选项。
然后按“f”键,屏幕上会出现“LastusedCPU”栏。
当前使用的CPU核心将出现在“P”(或“PSR”)列下。

复制代码如下:$top-p5357与ps命令相比;使用top命令的优点是可以随着时间的变化持续监控CPU的分配情况。

方法4检查进程/更新当前使用哪个CPU核心的另一种方法是使用htop命令。

从命令行启动htop。
按按钮进入“Columns”,PROCESSOR将显示“AvailableColumns”。
下面会补充的。

每个进程当前正在使用的CPUID将出现在“CPU”栏中。
身份证号0,1、2、...,以前使用过的N-1组任务;请注意,ps和所有CPU核心都是顶级指定的。
然而,htop指定从1开始(最多N)的CPU核心ID。

Linux内核:内存管理——NUMA架构

在单CPU时代初期,CPU与内存的交互是基于北桥芯片和前端总线。
随着技术的发展,CPU主频不断提升并扩展到多核,共享北桥的UMA架构逐渐暴露出性能瓶颈。
为了优化,内存控制器被移至CPU中,形成NUMA架构。
每个CPU都有自己的本地内存,并通过QPI总线访问远程内存。
这导致访问速度的差异,即不均匀的内存访问模式。
UMA架构的限制是资源共享和有限的可扩展性。
NUMA提高了多个内存控制器的带宽,您可以使用numactl命令查看和更改CPU和内存策略。
然而,不正确的策略可能会导致内存分配不均匀。
例如,数据库应用程序中内存回收策略不足可能会导致频繁的内存交换,从而影响服务性能。
要解决这些问题,您可以更改内存分配策略,例如使用interleave=all,以确保内存均匀分布。
对于内存回收,数据库通常选择vm.zone_reclaim_mode=0来限制内存区域的内部回收,减少频繁的页面交换。
如需深入理解,可以参考相关文档和教程,例如腾讯云、GitHub、知乎等文章。