it-swarm.cn

如何监视单个进程的CPU /内存使用情况?

我想实时监视一个进程的内存/ CPU使用率。与top类似,但仅针对一个过程,最好具有某种历史记录图。

194
Josh K

在Linux上,top实际上支持专注于单个进程,尽管它自然没有历史记录图:

top -p PID

这在Mac OS X上也可以使用不同的语法:

top -pid PID
157
Michael Mrozek

记录

以下地址某种历史记录图。 Python psrecord )包正是这样做的。

_pip install psrecord                             # local user install
Sudo apt-get install python-matplotlib python-tk # for plotting; or via pip
_

对于单个过程,如下所示(按 Ctrl+C):

_psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png
_

对于以下几个过程,以下脚本有助于同步图表:

_#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'
_

图表如下: psrecord example

memory_profiler

package 提供仅RSS采样(以及一些特定于Python的选项)。它还可以使用子进程记录进程(请参见_mprof --help_)。

_pip install memory_profiler
mprof run /path/to/executable
mprof plot
_

默认情况下,这会弹出基于Tkinter的(可能需要_python-tk_)图表浏览器,可以将其导出:

mprof

石墨堆和统计

对于简单的一次性测试而言,这似乎有些过头,但是对于几天调试而言,这肯定是合理的。方便的多合一 _raintank/graphite-stack_ (来自Grafana的作者)图像和 psutil_statsd =客户。 _procmon.py_ 提供了一个实现。

_$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
_

然后在另一个终端中,启动目标进程后:

_$ Sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'
_

然后在 http:// localhost:808 处打开Grafana,身份验证为_admin:admin_,设置数据源 https:// localhost ,您可以绘制如下图:

grafana chart

石墨叠层和Telegraf

代替Python将指标发送到Statsd的脚本, telegraf (和procstat输入插件)可用于将指标发送到Graphite直。

最小的telegraf配置看起来像:

_[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"
_

然后运行_telegraf --config minconf.conf_行。除指标名称外,Grafana部分相同。

pidstat

pidstatsysstat程序包的一部分)可以产生易于解析的输出。如果您需要流程中的其他指标,例如最有用的3个组(CPU,内存和磁盘)包括:_%usr_,_%system_,_%guest_,_%CPU_,_minflt/s_,_majflt/s_,VSZRSS,_%MEM_,_kB_rd/s_,_kB_wr/s_,_kB_ccwr/s_。我在 相关答案 中描述了它。

87
saaj

htoptop的绝佳替代。它有...颜色!简单的键盘快捷键!使用箭头键滚动列表!在不离开且不注意PID的情况下终止进程!标记多个进程并杀死所有进程!

在所有功能中,联机帮助页上说您可以按 F 来跟随一个过程。

确实,您应该尝试htop。第一次使用top之后,我再也没有开始htop

显示单个过程:

htop -p PID

67
Denilson Sá Maia

要在脚本上使用该信息,您可以执行以下操作:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

使用方式:calcPercCpu.sh 1234其中1234是pid

对于指定的$ nPid,它将在整个1秒钟内测量cpu使用情况的10个快照的平均(每个0.1s的延迟* nTimes = 10);可以提供当下正在发生的事情的快速,准确的结果。

根据您的需要调整变量。

8
Aquarius Power

我通常使用以下两个:

  1. HP caliper :它是监视过程的非常好的工具,您还可以检查调用图和其他低层信息。但请注意,它仅供个人使用免费。

  2. daemontools :用于管理UNIX服务的工具集合

5
Hemant

使用topawk可以轻松创建例如用%CPU($9)+%MEM($10)使用逗号分隔的日志,以后可以将其输入到任何统计信息和图形工具中。

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

输出会像

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

但是,对于较大的$delay而言,这不会产生良好的结果,因为由于top的输出工作方式,打印的时间戳实际上落后$delay。无需赘述,一种简单的方法是记录top提供的时间:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

这样时间戳是准确的,但输出仍会延迟$delay

5
xebeche

如果您知道进程名称,则可以使用

top -p $(pidof <process_name>)
2
user4757345

我在这里有点晚,但是我将仅使用默认的ps分享我的命令行技巧

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

我将此用作单线。在这里,第一行触发命令并将PID存储在变量中。然后ps将打印经过时间,PID,CPU使用百分比,内存百分比和RSS内存。您也可以添加其他字段。

该过程结束后,ps命令将不会返回“成功”,并且while循环将结束。

如果要分析的PID已在运行,则可以忽略第一行。只需将所需的id放在变量中即可。

您将获得如下输出:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....
2
theist

没有足够的声誉来评论,但是对于psrecord,您还可以直接在Python中以编程方式直接调用它:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

如果您有一个简化的Linux发行版,其中top没有每个进程(-p)选项或相关选项,则可以解析top命令的输出以获取进程名,以获取每个进程的CPU使用率信息。

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8表示我的嵌入式Linux发行版中top命令的输出中每个进程的CPU使用率

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

每2秒打印过程7994 cpu的使用

0
赵宝磊

如果您需要特定过程一段时间的平均值,请尝试使用top的-c选项:

top -c a -pid PID

在Mac 10.8.5的顶部找到“ -c a”。

对于Scientific Linux,该选项是-S,可以交互设置。

0
Kieleth