如何度量进程的单独 CPU 核心使用情况?

有没有办法通过内核来衡量特定进程的 CPU 使用量?

我知道 头儿可以很好地通过内核来衡量整个系统的 CPU 使用情况,而且 任务集可以提供关于进程可以在哪个 CPU 内核上运行的信息。

但是如何通过 CPU 内核度量特定进程的 CPU 使用量呢?

231990 次浏览

你可以使用 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 核心,或者在后一种情况下,两个线程被报告在同一个核心上。.

头儿中仍然可以这样做。当 头儿运行时,按键盘上的“1”,它将显示每个核的 CPU 使用情况。

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

你可使用:

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

ps解决方案几乎就是我所需要的,在引入一些 bash 之后,完全可以满足原始问题的要求: 查看特定流程的每个核心使用情况

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

用法如下: Cpustat‘ pgrep processname‘ pgrep other processname’..。

#!/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秒,因此您需要重新启动进程来重置计数器。

我有这个问题,我找到了一个类似的答案 给你

该方法是设置 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 使用)

我认为 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 help stat将帮助对选项的意义。

dstat -C 0,1,2,3

还将给出前4个核的 CPU 使用率。当然,如果你有32个核心,那么这个命令会稍微长一点,但是如果你只对少数核心感兴趣的话,这个命令会很有用。

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

dstat -C 3,7

htop给出了单个核心使用的一个很好的概述