确定运行进程的特定处理器


10

我可以访问Linux集群的8核节点。登录到节点后,可以使用以下命令查看处理器列表:

more /proc/cpuinfo

在我的8核心节点中,处理器的编号从0到7。每个处理器都是Intel Xeon CPU(E5430 @ 2.66GHz)。

现在假设我foo使用一些参数调用该程序args

foo args

该程序foo需要很长时间才能执行(例如,数小时或数天)。调用foo完,是否可以确定正在运行的特定处理器(即0到7)foo?该top程序向我显示了进程ID和类似信息,但是没有看到处理器编号。有这样的信息吗?


1
除非您执行了特定的操作,否则该进程不会一直保持在同一CPU上。为什么需要该信息?
马太福音

@Mat谢谢您的时间。这是一个单独的问题,但最终我想看看是否可以将两个调用分配foo给两个不同的处理器。当我打电话foo一次时,它的运行率%CPU非常接近100%(根据top)。但是,当我叫foo了第二次,这两个foo进程中运行,使得%CPU两个过程总和至小于100%(通常约45%为每个foo处理)。对我来说,这表明对的两个调用foo同一处理器上运行(即使有八个处理器可用);我想证明是这种情况。
安德鲁

1
术语被称为处理器的亲和性
SLM

1
调度程序允许事物在多个(不同的)处理器上运行。...但是,您的程序必须构造为多线程程序,以利用对特定程序或任务使用并发多重处理的优势。根据应用程序的编写者,java程序会尝试执行此操作。
mdpc

Answers:


11

ps如果您要求该psr列(或使用-F包含它的标志)可以为您提供该信息。

例如:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

要么:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

运行第一个命令时,我的外壳程序在CPU 2上运行,运行第二个命令时,我的外壳程序在CPU 0上运行。请注意,进程可以非常非常快地更换CPU,因此实际上您看到的信息已经过时了。

此超级用户问题的答案中的更多信息:

Linux:命令是否知道加载进程的处理器号?


4

使用topfrom procps(当今通常是Linux发行版中的默认设置)在中top,按f,导航至P = Last User CPU (SMP),然后按Space以进行选择(例如,您也可以COMMAND使用Right键将字段移动到该字段之前,然后上下移动)。q返回主屏幕(除非您明确配置它与之保持一致,否则您将看到进程在处理器之间移动)。您可以按W将其保存为默认值。

?寻求帮助。


4

该命令taskset是您要查找的内容:

任务集-检索或设置进程的CPU关联性

$ taskset -p 12345
pid 12345's current affinity mask: f

f表示所有处理器的掩码0x00000001将只是处理器0。

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

以列表格式显示CPU。在此示例中,我的笔记本电脑上有4个内核。

请参见手册页以获取更多详细信息


1

您也可以直接从 /proc/[pid]/stat。这是第39个以空格分隔的字段(自Linux 2.2.8起)。

例如,显示当前外壳程序在哪个CPU处理器上运行(在这种情况下):

cat  /proc/$$/stat | cut -d' ' -f39
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.