Linux:如何知道哪些进程固定到哪个核心?

Linux:如何知道哪些进程固定到哪个核心?

有没有办法知道哪些核心当前有固定的进程?

即使是其他用户运行的进程也应该在输出中列出。

或者,是否可以尝试将进程固定到核心,但如果所需的核心已经固定了一个进程,则会失败?

PS:感兴趣的进程必须将 bin 固定到给定的核心,而不仅仅是当前在给定的核心上运行

PS:这不是重复的,另一个问题是如何确保一个进程独占一个CPU。在这里,我们询问如何检测进程是否固定到给定的核心(即使用了 cpuset,而不是如何使用它)。

答案1

在正常情况下,Linux 进程不会明确固定到给定的核心,通常没有理由这样做,但这是可能的。

您可以taskset使用 ps 和“psr”字段来管理进程关联性,或查看当前时刻哪个进程在哪个 CPU 上运行。

检查进程 27395 的当前 CPU 亲和性:

$ ps -o psr 27395
PSR
  6

检查进程27395的关联列表:

$ taskset -pc 27395
pid 27395's current affinity list: 0-7

设置进程 27395 与 CPU 3 的亲和性

$ taskset -pc 3 27395
pid 27395's current affinity list: 0-7
pid 27395's new affinity list: 3

检查进程 27395 的当前 CPU 亲和性:

$ ps -o psr 27395
PSR
  3

要检查是否有任何进程固定到任何 CPU,您可以循环遍历进程标识符并taskset -p针对它们运行:

$ for pid in $(ps -a -o pid=); do taskset -pc $pid 2>/dev/null; done
pid 1803's current affinity list: 0-7
pid 1812's current affinity list: 0-7
pid 1986's current affinity list: 0-7
pid 2027's current affinity list: 0-7
pid 2075's current affinity list: 0-7
pid 2083's current affinity list: 0-7
pid 2122's current affinity list: 0-7
pid 2180's current affinity list: 0-7
pid 2269's current affinity list: 0-7
pid 2289's current affinity list: 0-7
pid 2291's current affinity list: 0-7
pid 2295's current affinity list: 0-7
pid 2300's current affinity list: 0-7
pid 2302's current affinity list: 0-7
pid 3872's current affinity list: 0-7
pid 4339's current affinity list: 0-7
pid 7301's current affinity list: 0-7
pid 7302's current affinity list: 0-7
pid 7309's current affinity list: 0-7
pid 13972's current affinity list: 0-7

答案2

首先打开终端并cat /proc/cpuinfo列出所有核心。核心 0 = 第一个核心,核心 1 = 第二个核心...

然后

CORENUM=0
ps -e -o pid,psr,cpu,cmd | grep -E  "^[[:space:]][[:digit:]]+[[:space:]]+${CORENUM}"

查看CORENUM=分配给它的核心 1(将 0 替换为所需的核心编号)。

答案3

当前分配的 vCPU

您可以使用该-F开关ps查看进程当前正在哪个核心 (vCPU) 上运行。 PSR 列指示:

$ man ps
...
       psr         PSR       processor that process is currently assigned to.
...

例如:

$ ps -Fae | head
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          1      0  0 211946 655576 13 Oct17 ?       00:51:28 /usr/lib/systemd/systemd --system --deserialize 14
root          2      0  0     0     0  16 Oct17 ?        00:00:02 [kthreadd]
root          6      2  0     0     0   0 Oct17 ?        00:50:36 [ksoftirqd/0]
root          7      2  0     0     0   0 Oct17 ?        00:02:04 [migration/0]
root          8      2  0     0     0   0 Oct17 ?        00:00:00 [rcu_bh]
root          9      2  0     0     0   0 Oct17 ?        02:02:22 [rcu_sched]
root         10      2  0     0     0   5 Oct17 ?        00:00:00 [lru-add-drain]
root         11      2  0     0     0   0 Oct17 ?        00:00:10 [watchdog/0]
root         12      2  0     0     0   1 Oct17 ?        00:00:09 [watchdog/1]

可以使用topP通过添加字段来选择字段来完成类似的操作f

  1. P——最后使用的CPU(SMP)

代表最后使用的处理器的数字。在真正的 SMP 环境中,这可能会频繁更改,因为内核有意使用弱关联性。此外,运行 top 的行为本身可能会破坏这种弱关联性,并导致更多进程更频繁地更换 CPU(因为对 cpu 时间有额外的需求)。

例如:

Tasks: 623 total,   3 running, 620 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.7 us, 11.0 sy,  0.0 ni, 79.2 id,  0.1 wa,  0.0 hi,  1.0 si,  0.0 st
KiB Mem : 26397158+total, 18521476+free, 35842280 used, 42914536 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 22101484+avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                        P
  2061 root      20   0  414648  15104   9068 S  38.6  0.0   2:06.82 sssd_be                                        2
 58915 root      20   0 2366608 130232  12288 S  29.5  0.0 478:46.62 filebeat                                      15
  4851 root      20   0 3740952 125192  18412 S  15.9  0.0   2944:25 metricbeat                                     4
104253 1007430+  20   0   16.0t   2.0g   1.6g S  13.6  0.8 138:59.97 java                                           3
  7617 root      20   0 5160288 399292  49324 S  11.4  0.2  12066:35 hyperkube                                      5
100062 1002840+  20   0   52440  17892   3800 R  11.4  0.0   0:00.34 cub                                            8
100202 smingol+  20   0  172872   2984   1712 R  11.4  0.0   0:00.09 top                                            8
112115 1007680+  20   0 5747228   1.2g  23428 S  11.4  0.5   1457:10 java                                          11
  2645 root      20   0 5425332 253544  18132 S   9.1  0.1   4549:50 dockerd-current                               12

CPU亲和力

如果您对进程与特定 vCPU 可能具有的任何关联性更感兴趣,您可以使用taskset它。下面我们可以看到一个进程 ( sleep) 在第一个示例中已关联到特定 vCPU,并允许在第二个示例中的任何 vCPU 上运行:

$ taskset -c 0,2,4,6 sleep 10000 &
[1] 119472
$ taskset -cp 119472
pid 119472's current affinity list: 0,2,4,6

$ sleep 10001  &
[2] 85436
$ taskset -cp 85436
pid 85436's current affinity list: 0-71

要查看盒子上的所有进程:

$ ps -ae -o pid= | xargs -n 1 taskset -cp
pid 116921's current affinity list: 47
pid 117171's current affinity list: 0-71
pid 117189's current affinity list: 0-71
pid 117248's current affinity list: 36
pid 117665's current affinity list: 0-71
pid 117681's current affinity list: 10
pid 118635's current affinity list: 0-71
pid 118665's current affinity list: 0-71
pid 118873's current affinity list: 44
pid 119472's current affinity list: 0,2,4,6
...

参考

答案4

对我自己的回答:来自 Linux(以及 Mac 的自制程序)包 hwloc 的 hwloc-bind。比照。https://www.open-mpi.org/projects/hwloc/tutorials/20130115-ComPAS-hwloc-tutorial.pdf对于某些文档。

相关内容