欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-06-06 22:58:34
这篇文章主要介绍了获知Linux的进程运行在哪个CPU内核上的方法,在服务器维护方面有时候会用得到,需要的朋友可以参考下... 15-10-07...

当你在 多核 numa 处理器上运行需要较高性能的 hpc(高性能计算)程序或非常消耗网络资源的程序时,cpu/memory 的亲和力是限度其发挥最大性能的重要因素之一。在同一 numa 节点上调度最相关的进程可以减少缓慢的远程内存访问。像英特尔 sandy bridge 处理器,该处理器有一个集成的 pcie 控制器,你可以在同一 numa 节点上调度网络 i/o 负载(如网卡)来突破 pci 到 cpu 亲和力限制。

作为性能优化和故障排除的一部分,你可能想知道特定的进程被调度到哪个 cpu 内核(或 numa 节点)上运行。

这里有几种方法可以 找出哪个 cpu 内核被调度来运行给定的 linux 进程或线程。

方法一
如果一个进程使用 taskset 命令明确的被固定(pinned)到 cpu 的特定内核上,你可以使用 taskset 命令找出被固定的 cpu 内核:

复制代码
代码如下:

$ taskset -c -p <pid>

例如, 如果你对 pid 5357 这个进程有兴趣:

复制代码
代码如下:

$ taskset -c -p 5357

pid 5357's current affinity list: 5
输出显示这个过程被固定在 cpu 内核 5上。

但是,如果你没有明确固定进程到任何 cpu 内核,你会得到类似下面的亲和力列表。

pid 5357's current affinity list: 0-11
输出表明该进程可能会被安排在从0到11中的任何一个 cpu 内核。在这种情况下,taskset 不能识别该进程当前被分配给哪个 cpu 内核,你应该使用如下所述的方法。

方法二
ps 命令可以告诉你每个进程/线程目前分配到的 (在“psr”列)cpu id。

复制代码
代码如下:

$ ps -o pid,psr,comm -p <pid>

  pid psr command
 5357  10 prog
输出表示进程的 pid 为 5357(名为"prog")目前在cpu 内核 10 上运行着。如果该过程没有被固定,psr 列会根据内核可能调度该进程到不同内核而改变显示。

方法三
top 命令也可以显示 cpu 被分配给哪个进程。首先,在top 命令中使用“p”选项。然后按“f”键,显示中会出现 "last used cpu" 列。目前使用的 cpu 内核将出现在 “p”(或“psr”)列下。

复制代码
代码如下:

$ top -p 5357

获知Linux的进程运行在哪个CPU内核上的方法
相比于 ps 命令,使用 top 命令的好处是,你可以连续监视随着时间的改变, cpu 是如何分配的。

方法四
另一种来检查一个进程/线程当前使用的是哪个 cpu 内核的方法是使用 htop 命令。

从命令行启动 htop。按 键,进入"columns",在"available columns"下会添加 processor。

每个进程当前使用的 cpu id 将出现在“cpu”列中。
获知Linux的进程运行在哪个CPU内核上的方法
请注意,所有以前使用的命令 taskset,ps 和 top 分配cpu 内核的 ids 为 0,1,2,...,n-1。然而,htop 分配 cpu 内核 ids 从 1开始(直到 n)。