如何测量一个进程在不同CPU核心上的使用情况?

144

有没有办法按核心测量特定进程的CPU使用率?

我知道top可以测量整个系统按核心计算的CPU使用率,而taskset可以提供有关进程允许在哪个CPU核心上运行的信息。

但是如何测量特定进程按CPU核心计算的CPU使用情况呢?

8个回答

171

您可以在 top 中执行此操作。在 top 运行时,按下键盘上的 '1',然后它将显示每个核心的 CPU 使用情况。

通过让特定进程在特定用户帐户下运行并使用类型“u”来限制显示的进程。


5
按下 I 键可以切换到 Irix模式(相对于 Solaris 模式)。打开后,进程列表中显示的百分比是相对于 CPU 线程 的。关闭后,百分比是相对于 CPU 总容量 显示的(即所有线程 - 即所有核心)。 - 7heo.tk
10
不仅适用于单个进程,它显示跨多个核心的所有进程的CPU使用情况。 - m_vitaly
我们如何将“1”作为参数传递给topman页面说top -1,但它会报错!使用top -1 -n 1可以得到单次迭代的top,并显示单独的CPU使用情况,这将非常好。 - quanta

90

您可以使用:

 mpstat -P ALL 1

它显示每个核心的忙碌程度,并且每秒钟自动更新。输出结果会类似于这样(在四核处理器上):

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

尽管如此,这个命令并没有回答原问题,也就是它不能显示特定进程的CPU核心使用情况。


4
我认为这并没有真正回答问题。只有在没有其他进程运行时,才会出现这种情况。此外,这似乎不是四核CPU,更像是八核(可能是启用了超线程的四核)。 - the swine
1
这是一个启用了超线程技术的四核处理器。 - Kamran Bigdely
1
不回答原问题。但是,因为没有提到它,我会扣除一分。 - KGhatak
2
我同意@KGhatak的观点,这并没有回答原问题-1。 - jodag

47

你可以使用ps命令。
例如,在双核CPU上有两个繁忙线程的Python进程:

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR是当前线程分配的CPU ID)

由于GIL(全局解释锁),你可以看到这些线程在同一个CPU核心上运行。

在Jython中运行相同的Python脚本时,我们可以看到该脚本利用了两个核心(还有许多其他服务或其他线程几乎处于空闲状态):

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

您可以处理输出并计算每个CPU核心的总CPU。

不幸的是,这种方法似乎并不完全可靠,有时我看到在第一种情况下,两个工作线程被报告为分别位于每个CPU核心上,或者在后一种情况下,这两个线程被报告为位于同一个核心上。


watch -n1 ps -p 28671 -L -o pid,tid,psr,pcpu 每秒运行一次。 - imix

20

htop 可以很好地概述每个核心的使用情况。


5
ps 的解决方案几乎符合我的需求,再加上一些 bash 命令,就可以完全实现原始问题的要求:查看特定进程的每个核心使用情况
这还显示了多线程进程的每个核心使用情况。
使用方法: cpustat `pgrep 进程名称` `pgrep 其他进程名称` ...
#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Usage: $0 <pid1> [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

注意:这些统计数据基于进程的生命周期,而不是最后的X秒,因此您需要重新启动进程以重置计数器。

你可以使用C库函数read()和open()来打开/proc/pid/*下的伪文件,并解析出所需的任何数据。 - GL2014
尝试执行以下命令:watch -n1 ps -L -o pid,tid,psr,pcpu,comm= $(pgrep processname) $(pgrep otheprocessname) - imix

3
我认为你需要使用perf stat。当你指定--cpu=list选项时,它可以显示一个进程的特定使用情况。以下是一个监控构建项目时CPU使用率的示例:perf stat --cpu=0-7 --no-aggr -- make all -j命令。输出如下:
CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

左侧列是特定CPU索引,右侧最后一列是CPU使用率。如果您没有指定--no-aggr选项,则结果将被聚合在一起。如果您想监视运行中的进程,则可以使用--pid=pid选项。
还可以尝试-a --per-core-a perf-socket,这将呈现更分类的信息。
有关perf stat的更多使用方法,请参见本教程:perf cpu statistic,另外perf help stat将有助于理解选项的含义。

2
我遇到了类似的问题,我在这里找到了一个类似的答案(链接)
方法是设置top并按W(大写W)。 这将当前top布局保存到$HOME /.toprc中的配置文件中。
虽然如果您想要运行具有不同配置的多个top,则此方法可能无效。
所以,通过我认为的解决方法,您可以通过执行以下操作之一来编写不同的配置文件 / 使用不同的配置文件...
1)重命名二进制文件
  ln -s /usr/bin/top top2
  ./top2

现在,.top2rc 将被写入您的 $HOME 目录。

2) 将 $HOME 设置为其他路径,因为它将把其配置文件写入 $HOME/.binary-name.rc 文件中。

HOME=./
top

现在将会在当前文件夹中写入.toprc
通过使用其他人的评论来添加顶部中各种用法计数,您可以为该信息创建批量输出,并通过脚本将信息合并。也许不像你的脚本那么简单,但我发现顶部提供了所有进程,因此稍后我可以回顾并捕获在长时间运行期间可能错过的状态(由于偏离进程而导致的未解释的突然CPU使用率)。

2
dstat -C 0,1,2,3 

这个命令还会给你前4个CPU核心的使用情况。当然,如果你有32个核心,那么这个命令就会变得有点长,但如果你只对几个核心感兴趣,它仍然很有用。

例如,如果你只对第3个和第7个核心感兴趣,那么可以执行以下命令:

dstat -C 3,7

1
这对单个进程有什么相关性? - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接