当你在多核NUMA处理器上运行须要较高性能的HPC(高性能估算)程序或十分消耗网路资源的程序时,CPU/memory的亲和力是限度其发挥最大性能的重要诱因之一。在同一NUMA节点下调度最相关的进程可以降低平缓的远程显存访问。像英特尔SandyBridge处理器,该处理器有一个集成的PCIe控制器,你可以在同一NUMA节点下调度网路I/O负载(如网卡)来突破PCI到CPU亲和力限制。
作为性能优化和故障排除的一部份linux培训学校,你可能想晓得特定的进程被调度到那个CPU内核(或NUMA节点)上运行。
这儿有几种方式可以找出那个CPU内核被调度来运行给定的Linux进程或线程。
方式一
假如一个进程使用taskset命令明晰的被固定(pinned)到CPU的特定内核上arch linux,你可以使用taskset命令找出被固定的CPU内核:
复制代码
代码如下:
$taskset-c-p
比如,假如你对PID5357这个进程有兴趣:
复制代码
代码如下:
$taskset-c-p5357
pid5357'scurrentaffinitylist:5
输出显示这个过程被固定在CPU内核5上。
然而,倘若你没有明晰固定进程到任何CPU内核linux内核启动流程,你会得到类似下边的亲和力列表。
pid5357'scurrentaffinitylist:0-11
输出表明该进程可能会被安排在从0到11中的任何一个CPU内核。在这些情况下,taskset不能辨识该进程当前被分配给那个CPU内核linux内核启动流程,你应当使用如下所述的方式。
方式二
ps命令可以告诉你每位进程/线程目前分配到的(在“PSR”列)CPUID。
复制代码
代码如下:
$ps-opid,psr,comm-p
PIDPSRCOMMAND
535710prog
输出表示进程的PID为5357(名为"prog")目前在CPU内核10上运行着。假如该过程没有被固定,PSR列会依照内核可能调度该进程到不同内核而改变显示。
方式三
top命令也可以显示CPU被分配给那个进程。首先,在top命令中使用“P”选项。之后按“f”键,显示中会出现"LastusedCPU"列。目前使用的CPU内核将出现在“P”(或“PSR”)列下。
复制代码
代码如下:
$top-p5357
相比于ps命令,使用top命令的用处是,你可以连续监视随着时间的改变,CPU是怎样分配的。
方式四
另一种来检测一个进程/线程当前使用的是那个CPU内核的方式是使用htop命令。
从命令行启动htop。按键,步入"Columns",在"AvailableColumns"下会添加PROCESSOR。
每位进程当前使用的CPUID将出现在“CPU”列中。
请注意,所有原先使用的命令taskset,ps和top分配CPU内核的IDs为0,1,2,...,N-1。但是,htop分配CPU内核IDs从1开始(直至N)。