【问题标题】:How do I measure separate CPU core usage for a process?如何测量进程的单独 CPU 核心使用率?
【发布时间】:2010-07-27 11:00:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux multicore measurement performance


    【解决方案1】:

    您仍然可以在 top 中执行此操作。 top 正在运行时,按键盘上的“1”,它将显示每个内核的 CPU 使用率。

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

    【讨论】:

    • 您也可以按I 切换Irix 模式(相对于Solaris 模式)。当on 时,进程列表中显示的百分比是相对于一个CPU 线程。当off 时,所述百分比显示相对于CPU 总容量(即所有线程 - 也就是所有内核)。
    • 这不是针对单个进程的,它显示了跨多个核心的所有进程的cpu使用率
    • 我们如何将“1”作为参数传递给topman 页面显示top -1,但它抱怨!最好让top -1 -n 1 获得top 的单次迭代但显示单独的CPU 使用率。
    【解决方案2】:

    你可以使用:

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

    【讨论】:

    • 我认为这并不能真正回答这个问题。如果没有其他进程在运行,这只是同样的事情。此外,这似乎不是四核 CPU,更像是八核(可能是启用了 HT 的四核)。
    • 这是一个启用了 HT 的四核。
    • 不回答原始问题。但是,我没有提到它(-1)。
    • 我同意@KGhatak,这不回答原来的问题-1
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      htop 很好地概述了各个核心的使用情况

      【讨论】:

        【解决方案5】:

        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
        

        注意:这些统计信息基于进程 lifetime,而不是最后 X 秒,因此您需要重新启动进程以重置计数器。

        【讨论】:

        • 您可以使用 C lib 函数 read() 和 open() 打开 /proc/pid/* 中的伪文件并解析出您需要的任何数据。
        【解决方案6】:

        我认为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 statisticperf help stat也将有助于了解选项的含义。

        【讨论】:

          【解决方案7】:

          我刚遇到这个问题,我找到了类似的答案here

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

          通过使用其他人的 cmets 在顶部添加各种使用情况统计,您可以为该信息创建批处理输出,然后通过脚本合并信息。也许不像您编写的脚本那么简单,但我发现 top 可以为我提供所有进程,以便稍后我可以回顾并捕获长时间运行期间我可能会错过的状态(由于杂散进程导致无法解释的突然 CPU 使用率)

          【讨论】:

            【解决方案8】:
            dstat -C 0,1,2,3 
            

            还将为您提供前 4 个内核的 CPU 使用率。当然,如果你有 32 个内核,那么这个命令会有点长,但如果你只对几个内核感兴趣,这个命令很有用。

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

            dstat -C 3,7
            

            【讨论】:

            • 这与单个进程有何关系?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-05
            • 2016-08-19
            • 1970-01-01
            • 2010-12-17
            • 2022-11-24
            • 2011-05-03
            • 1970-01-01
            相关资源
            最近更新 更多