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 楼
Procpath2020更新(仅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的作者)以及psutil
和statsd
客户端。 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
pidstat
(sysstat
软件包的一部分)可以产生易于解析的输出。如果您需要流程中的其他指标,例如最有用的3个组(CPU,内存和磁盘)包含:%usr
,%system
,%guest
,%CPU
,minflt/s
,majflt/s
,VSZ
,RSS
,%MEM
,kB_rd/s
,kB_wr/s
,kB_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 楼
htop
是top
的理想替代品。它有...颜色!简单的键盘快捷键!使用箭头键滚动列表!在不离开且不注意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 楼
使用top
和awk
可以轻松创建例如%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
评论
您想要什么内存统计信息?有很多。给定时间范围内的内存使用率,当前使用率,最大使用率,平均值。