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

评论

您想要什么内存统计信息?有很多。

给定时间范围内的内存使用率,当前使用率,最大使用率,平均值。

#1 楼

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

top -p PID


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

top -pid PID


评论


而且由于您可能不想每次都查找PID,请尝试使用诸如top -p`pgrep -f / usr / bin / kvm`之类的方法。

– Stefan Lasiewski
2010年8月17日在3:33



我使用Cacti监视某些单独的进程,但是对于此处要求的简单情况,安装完整的Cacti安装听起来太复杂了。

– Stefan Lasiewski
2010年8月17日,下午3:34

@Stefan:我假设我必须远程运行它?

–乔什·K(Josh K)
2010年8月17日于4:00

@Josh:是的,您需要在另一台服务器上运行Cacti(需要MySQL,Apache和一些其他软件包)。在大多数发行版中,使用Yum或apt-get安装非常简单。

– Stefan Lasiewski
2010年8月17日在20:48

@Stefan如果要远程检查,可以执行ssh @ remotehost'top -p PID>〜hostname pid.txt;退出并

– klerk
2014年5月13日在20:02

#2 楼

Procpath
2020更新(仅Linux / procfs)。经常回到过程分析的问题,并且对最初描述的解决方案不满意,因此我决定编写自己的解决方案。它是一个纯Python CLI程序包,包括几个依赖项(没有繁重的Matplotlib),可以潜在地绘制从procfs,JSONPath查询到流程树的许多指标,具有基本的抽取/聚合(Ramer-Douglas-Peucker和移动平均值),过滤根据时间范围和PID以及其他一些信息。
pip3 install --user procpath

这是Firefox的示例。这会每秒记录一次120次在其cmdline中显示所有带有“ firefox”的进程(通过PID查询看起来像'$..children[?(@.stat.pid == 42)]')。每秒记录120次。
procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'

绘制单个进程(或多个进程)的RSS和CPU使用率在所有记录中看起来像:
procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg

图表看起来像这样(它们实际上是交互式Pygal SVG):


psrecord
以下是某种历史记录图。 Python psrecord软件包完全可以做到这一点。
对于单个进程,请执行以下操作(由Ctrl + C停止):
对于多个进程,以下脚本可帮助同步图表:
pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

图表看起来像:

memory_profiler
该软件包提供仅RSS采样(加上一些Python特定的选项)。它还可以使用子进程记录进程(请参阅mprof --help)。
psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

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

graphite-stack和statsd
对于一个简单的一次性测试来说似乎有些过头了,但是对于像几天调试这样的事情,它肯定是合理的。方便的多合一raintank/graphite-stack图像(来自Grafana的作者)以及psutilstatsd客户端。 procmon.py提供了一个实现。
#!/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'

然后在另一个终端中,启动目标过程后:
pip install memory_profiler
mprof run /path/to/executable
mprof plot

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

石墨堆栈和Telegraf
代替使用Python脚本将度量标准发送到Statsd,可以使用telegraf(和procstat输入插件)将度量标准直接发送到Graphite。
最小的telegraf配置如下所示:
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

然后运行telegraf --config minconf.conf。除指标名称外,Grafana的部分相同。
pidstat
pidstatsysstat软件包的一部分)可以产生易于解析的输出。如果您需要流程中的其他指标,例如最有用的3个组(CPU,内存和磁盘)包含:%usr%system%guest%CPUminflt/smajflt/sVSZRSS%MEMkB_rd/skB_wr/skB_ccwr/s。我在一个相关的答案中对此进行了描述。

评论


pgrep systemd提供多行输出,从而使psrecord出错,应该怎么做?我只想测试任何过程。

– EralpB
18年4月11日在7:09

@EralpB pgrep-帮助进行救援。至少-最新和最旧。

– saaj
18年4月11日在9:03

这应该是公认的答案,因为它实际上给出了内存使用历史记录。请注意,对于psrecord方法,psrecord进程上的Ctrl + C会在不保存图的情况下退出,您需要结束被测进程。

–user2561747
19年1月26日在3:03

psrecord运行良好,谢谢。为了使其能够在没有GUI(X11)的服务器上工作,我必须按照stackoverflow.com/a/37605654/3018750中所述配置matplotlibrc

– rkok
19-10-25在4:52



一个简单的单行代码,如果您想运行命令并立即使用psrecord配置它:my-command&psrecord $! --interval 1 --plot plot1.png。 $!返回最后执行的命令的PID,因此您不需要pgrep。并使用一个&分开的运行my命令,这意味着shell在运行psrecord之前不会等待它完成。

– Gus
19/12/4在2:27



#3 楼

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

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

真的,您应该尝试htop。在第一次使用top之后,我再也没有启动过htop

显示单个过程:

htop -p PID

评论


+1为htop。这是我在新系统上安装的第一个程序之一。它使我的生活更加轻松。树状视图也非常方便。

– Barthelemy
2010-11-24 12:22

顶部也有颜色。按z。

– tshepang
2011年1月12日,下午1:41

你是对的!顶部有颜色!不幸的是,它的颜色是没有用的,特别是与htop相比(它使其他用户的进程褪色并突出显示程序的基本名称)。

– DenilsonSáMaia
2011年1月12日在18:17

top也可以终止进程而不会离开。只需按一下k。

– AvatarOfChronos
2012年7月19日在13:57

htop -p PID也将起作用,就像@Michael Mrozek给出的示例一样。

–噪音很大
2014年11月25日12:05

#4 楼

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

calcPercCpu.sh

#!/bin/bash
nPid=;
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;(.*)[+]$;;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu


用法类似:calcPercCpu.sh 1234其中1234是pid

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

根据您的需要调整变量。

评论


嗯,监视10个CPU使用率的10个进程?

– xebeche
19年3月13日在14:19

@xebeche“它将测量10个快照的平均值”“ nTimes = 10;#自定义它” :)

–水瓶座力量
19 Mar 19 '19在22:55



我的意思是我不喜欢您调用10个进程来检索1个数字($ nPercCpu)的事实:shell,top,grep,sed,cut ... bc。例如,您可以将许多(如果不是全部)合并成1个Sed或Awk脚本。

– xebeche
19年3月19日在23:29

@xebeche很酷,可以随时进行编辑,在现有命令中添加一个更好的命令(作为一种替代方法),我很好奇:)

–水瓶座力量
19-3-24在1:03



我已经添加了自己的答案。顺便说一句,请注意,没有必要计算平均值,因为top的输出是超过$ delay的平均值。 cf.如何计算CPU使用率

– xebeche
19-3-26在17:12



#5 楼

我通常使用以下两个工具:HP caliper:它是监视过程的很好工具,您还可以检查调用图和其他低层信息。但是请注意,它仅免费供个人使用。
daemontools:用于管理UNIX服务的工具的集合


评论


我使用daemontools多年了。作为其他过程的主管/监督者,这很棒。它如何帮助您监视一个进程的CPU /内存使用情况?

– Stefan Lasiewski
2010年8月19日下午4:05

#6 楼

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

top -b -d $delay -p $pid | awk -v OFS="," '+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),,$NF,,; 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来说,这不会产生很好的结果,因为由于$delay的输出方式,打印的时间戳实际上落后于top。无需赘述,一种简单的方法是记录top提供的时间:

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


然后时间戳是准确的,但是输出仍然会延迟由$delay

#7 楼

我在这里有点晚了,但是我将仅使用默认的ps分享我的命令行技巧。我将其用作单线。在这里,第一行触发命令并将PID存储在变量中。然后ps将打印经过时间,PID,CPU使用百分比,内存百分比和RSS内存。您还可以添加其他字段。

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

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

您将获得类似以下的输出:

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


#8 楼

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

top -p $(pidof <process_name>)


评论


这几乎是几年前被接受的答案及其第一条评论所说的内容。

– dhag
15年4月29日在15:26

#9 楼

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

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


#10 楼

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

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


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

#11 楼

 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的使用情况

#12 楼

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

top -c a -pid PID


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

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

评论


您可能想添加更多详细信息,以了解哪个top版本实际提供了此功能。我的Fedora 19版本没有。在Ubuntu 13.04上也是如此。

–slm♦
2014年5月12日在1:22

你是对的!我很高兴找到有用的东西,但我忘了在家中的Mac。

–基里斯
2014年5月13日19:34