ela*_*ang 109 linux performance multicore measurement
有没有办法测量核心的特定进程CPU使用率?
我知道top对于测量核心的整个系统的CPU使用率是有好处的,而taskset可以提供有关允许进程运行的CPU核心的信息.
但是,如何通过CPU内核测量特定进程的CPU使用率?
abd*_*lar 128
你仍然可以在顶部做到这一点.当top正在运行时,按键盘上的"1",它将显示每个核心的CPU使用率.
通过在特定用户帐户下运行特定流程来限制所显示的流程,并使用"u"类型限制该用户
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核心使用情况.
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核心,或者在后一种情况下,报告两个线程打开相同的核心..
该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秒,因此您需要重新启动进程以重置计数器。