如何为流程测量单独的CPU核心使用情况?

ela*_*ang 109 linux performance multicore measurement

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

我知道top对于测量核心的整个系统的CPU使用率是有好处的,而taskset可以提供有关允许进程运行的CPU核心的信息.

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

abd*_*lar 128

你仍然可以在顶部做到这一点.当top正在运行时,按键盘上的"1",它将显示每个核心的CPU使用率.

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

  • 这不是特定于单个进程,这显示了跨多个核心的所有进程的CPU使用情况 (5认同)
  • 您也可以按“ I”来切换“虹膜模式”(与“ Solaris模式”相反)。当打开时,进程列表中显示的百分比是相对于“ CPU线程”而言的。当“关闭”时,相对于** CPU总容量**(即* ALL线程*-亦称所有内核)显示该百分比。 (2认同)

Kam*_*ely 74

您可以使用:

 mpstat -P ALL 1
Run Code Online (Sandbox Code Playgroud)

它显示了每个核心忙碌的程度,并且每秒都会自动更新.输出将是这样的(在四核处理器上):

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
Run Code Online (Sandbox Code Playgroud)

此命令不回答原始问题,即它不显示特定进程的CPU核心使用情况.

  • 我认为这并没有真正回答这个问题.如果没有其他进程在运行,这只是一回事.此外,这似乎不是四核CPU,更像是八核(可能是启用了HT的四核). (3认同)
  • 我同意@KGhatak,这并没有回答原来的问题-1 (2认同)

myk*_*hal 37

你可以使用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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

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

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


WBM*_*WBM 10

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


Nat*_*idd 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
Run Code Online (Sandbox Code Playgroud)

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