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


170

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


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

给定时间范围内的内存使用量,当前使用量,最大使用量,平均值。
乔什·K

Answers:


139

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

top -p PID

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

top -pid PID

9
并且由于您可能不想每次都查找PID,因此请尝试类似top -p `pgrep -f /usr/bin/kvm`
Stefan Lasiewski,2010年

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

@Stefan:我假设我必须远程运行它?
乔什(Josh K)2010年

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

@Stefan如果要远程检查,可以执行ssh @ remotehost'top -p PID> hostname〜_pid.txt; exit'and
klerk

61

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

在所有的功能,该手册页说,你可以按F跟随的过程。

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

显示单个过程:

htop -p PID


7
+1为htop。这是我在新系统上安装的第一个程序。它使我的生活更加轻松。树状视图也非常方便。
巴泰勒米(Barthelemy),2010年

9
top也有颜色 按z
tshepang 2011年

2
你是对的!top有颜色!不幸的是,它的颜色非常无用,特别是与相比时htop(它会使其他用户的进程褪色并突出显示程序的基本名称)。
DenilsonSáMaia

1
并且htop -p PID也将工作,就像@Michael Mrozek给出的示例一样。
2014年

1
然后,使用top的唯一原因是因为htop不可用或无法安装。这就是为什么创建htop来提供更多功能的原因。
lepe 2015年

59

psrecord

以下是某种历史记录图。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示例

memory_profiler

软件包提供仅RSS采样(以及一些特定于Python的选项)。它还可以使用子进程记录进程(请参阅参考资料mprof --help)。

pip install memory_profiler
mprof run /path/to/executable
mprof plot

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

mprof

石墨堆和统计

对于简单的一次性测试而言,这似乎有些过头,但是对于几天调试而言,这肯定是合理的。方便的多合一raintank/graphite-stack图像(来自Grafana的作者)psutilstatsd客户。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:8080打开Grafana ,身份验证为admin:admin,设置数据源https:// localhost,您可以绘制出如下图:

格拉那那图

石墨叠层和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部分相同。

系统摘要

sysdig(在Debian和Ubuntu的仓库中可用)带有sysdig-inspect的 UI看起来非常有前途,它提供了非常细粒度的详细信息以及CPU利用率和RSS,但不幸的是,UI无法呈现它们,并且无法按顺序sysdig 过滤 procinfo事件。写作时间。不过,这可以通过定制凿子sysdig用Lua编写的扩展名)来实现。


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

1
@EralpB pgrep --help进行救援。至少有--newest--oldest
saaj

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

8

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

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秒内测量10次​​cpu使用情况的快照的平均值(每个延迟为0.1s * nTimes = 10);可以提供当下正在发生的事情的快速,准确的结果。

根据您的需要调整变量。


嗯,有10个进程监视1的cpu使用情况?
xebeche

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

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

@xebeche很酷,随时进行编辑,向现有命令添加一个更好的命令(作为替代),您会感到好奇:)
Aquarius Power

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

5

我通常使用以下两个:

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

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


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

3

使用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但是,这对于大字体来说不会产生良好的结果,因为$delay由于top输出的工作方式,打印的时间戳实际上落后了。无需赘述,一种简单的方法是记录由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


2

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

top -p $(pidof <process_name>)

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

1

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

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

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


1

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

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

0

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

top -c a -pid PID

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

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


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

你是对的!,我很高兴发现有用的东西,却忘记了自己在家里的Mac中。
Kieleth 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.