![Linux:如何知道哪些进程固定到哪个核心?](https://linux22.com/image/127955/Linux%EF%BC%9A%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%93%AA%E4%BA%9B%E8%BF%9B%E7%A8%8B%E5%9B%BA%E5%AE%9A%E5%88%B0%E5%93%AA%E4%B8%AA%E6%A0%B8%E5%BF%83%EF%BC%9F.png)
有没有办法知道哪些核心当前有固定的进程?
即使是其他用户运行的进程也应该在输出中列出。
或者,是否可以尝试将进程固定到核心,但如果所需的核心已经固定了一个进程,则会失败?
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]
可以使用top
并P
通过添加字段来选择字段来完成类似的操作f。
- 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对于某些文档。