如何测量一个进程的单独CPU内核使用率?


114

有什么方法可以衡量内核的特定进程CPU使用率吗?

我知道top可以很好地按内核衡量整个系统的CPU使用率,而taskset可以提供有关允许该进程在哪个CPU内核上运行的信息。

但是,如何通过CPU内核衡量特定进程的CPU使用率?

Answers:


139

您仍然可以在顶部执行此操作。虽然运行时,按键盘上的'1',它将显示每个内核的CPU使用率。

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


3
您也可以按I切换Irix模式(与Solaris模式相反)。时on,进程列表中显示的百分比是相对于CPU线程的百分比。如果为off,则显示的百分比相对于CPU的总容量(即,所有线程 -亦称所有内核)。
7heo.tk 2015年

8
这并非特定于单个进程,而是显示了跨多个内核的所有进程的cpu使用情况
m_vitaly 2015年

我们如何将“ 1”作为参数传递给topman页面top -1却说不出来!top -1 -n 1得到一个单次迭代top但显示单独的CPU使用率将是一个不错的选择。
量子

76

您可以使用:

 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内核使用情况。


3
我认为这并不能真正回答问题。如果没有其他进程在运行,这只是同一件事。同样,这似乎不是四核CPU,更像是八核(可能是启用了HT的四核)。

1
这是一个启用HT的四核。
Kamran Bigdely

不回答原始问题。但是,我没有提到它(-1)。
KGhatak '16

1
我同意@KGhatak,这不能回答原始问题-1
jodag '17

41

您可以使用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)

您会看到线程在同一个CPU内核上运行(因为有GIL)

我们在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。

不幸的是,这种方法似乎并不是100%可靠的,有时我看到在第一种情况下,两个工作线程被报告为与每个CPU内核分离,或者在后一种情况下,两个线程被报告为处于打开状态。相同的核心


13

htop 很好地概述了各个核心的用法


4

ps解决方案几乎是我所需要的,并且抛出了一些bash确实符合原始问题的要求:查看特定进程的每核使用情况

这也显示了多线程进程的每核使用情况。

像这样使用: cpustat`pgrep processname``pgrep otherprocessname` ...

#!/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年

2
dstat -C 0,1,2,3 

还将为您提供前4个内核的CPU使用率。当然,如果您有32个核心,则此命令会花一些时间,但如果您只对少数几个核心感兴趣,则该命令很有用。

例如,如果您只对核心3和7感兴趣,则可以

dstat -C 3,7

这与单个过程有什么关系?
einpoklum

1

我只有这个问题,在这里找到了类似的答案。

方法是设置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将要写入当前文件夹。

通过使用其他人的注释在顶部添加各种使用情况记帐,您可以为该信息创建批输出,然后通过脚本合并该信息。也许不如您编写脚本那么简单,但我发现top可以为我提供所有进程,以便以后我可以概述并捕获长期可能会错过的状态(由于进程混乱而无法解释的CPU突然使用)


1

我以为perf stat是你所需要的。

当您指定--cpu=list选项时,它显示了过程的特定用法。这是一个使用perf stat --cpu=0-7 --no-aggr -- make all -j命令监视cpu使用情况以构建项目的示例。输出为:

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将有助于了解选项的含义。

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.