判断 linux 进程运行在哪个 cpu 内核上的 4 个方法-mile米乐体育
问题:我有个 linux 进程运行在多核处理器系统上。怎样才能找出哪个 cpu 内核正在运行该进程?
当你在 多核 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 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 -ppid 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
相比于 ps 命令,使用 top 命令的好处是,你可以连续监视随着时间的改变, cpu 是如何分配的。
方法四
另一种来检查一个进程/线程当前使用的是哪个 cpu 内核的方法是使用 htop 命令。
从命令行启动 htop。按 键,进入”columns”,在”available columns”下会添加 processor。
每个进程当前使用的 cpu id 将出现在“cpu”列中。
请注意,所有以前使用的命令 taskset,ps 和 top 分配cpu 内核的 ids 为 0,1,2,…,n-1。然而,htop 分配 cpu 内核 ids 从 1开始(直到 n)。