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

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

我知道top最适合测量整个系统的核心CPU使用率, taskset可以提供关于哪个CPU核心可以运行的信息。

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

你仍然可以做到这一点

types1 – 它显示每个CPU

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

您可以使用:

  mpstat -P ALL 1 

它显示每个内核有多less忙,每秒钟会自动更新。 输出结果如下(在四核处理器上):

 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 

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

ps解决scheme几乎是我所需要的,并且抛出一些bash,正是原始问题所要求的: 查看特定进程的每核心使用情况

这也显示了multithreading进程的每核心使用情况。

使用像: cpustat`pgrep进程名“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秒,因此您需要重新启动进程来重置计数器。

 dstat -C 0,1,2,3 

也会给你第一个4核的CPU使用率。 当然,如果你有32个内核,那么这个命令会稍微长一些,但是如果你只对less量核心感兴趣的话,这个命令会有用处。

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

 dstat -C 3,7 

我刚刚遇到了这个问题,我在这里find了类似的答案。

方法是按您想要的方式设置top ,然后按W (大写W)。 这将top的当前布局保存到$ HOME / .toprc中的configuration文件中

尽pipe如果你想用不同的configuration运行多个top这可能不起作用。

所以通过我认为一个工作,你可以写入不同的configuration文件/使用不同的configuration文件,通过执行下列之一…

1)重命名二进制文件

  ln -s /usr/bin/top top2 ./top2 

现在.top2rc将被写入您的$ HOME

2)将$ HOME设置为一些替代path,因为它会将其configuration文件写入$ HOME / .binary-name.rc文件

 HOME=./ top 

现在.toprc将被写入当前文件夹。

通过使用其他人民的意见,以添加各种使用情况的帐户,您可以创build一个批量输出的信息和后者通过脚本合并信息。 也许不像你的脚本那么简单,但是我发现top为我提供了所有进程,以便稍后我可以在长时间内回顾并捕获一个状态,否则我可能会错过(由于杂散进程而导致原因不明的突然CPU使用率)

我认为perf stat是你需要的。

当您指定--cpu=list选项时,它将显示进程的特定用法。 下面是一个使用perf stat --cpu=0-7 --no-aggr -- make all -j监视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 ,这将呈现更多-a --per-core信息。

有关perf stat使用情况的更多信息,请参阅本教程: perf cpu statistic和perf help stat将帮助您了解选项的含义。

htop给出了个人核心使用情况的一个很好的概述