进程路径

进程路径

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

答案1

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

top -p PID

这在 Mac OS X 上也可用,但语法不同:

top -pid PID

答案2

进程路径

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

pip3 install --user procpath

这是一个使用 Firefox 的示例。这将记录所有带有“firefox”的进程cmdline(通过 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):

RSS 中央处理器

记录

以下地址某种历史图表。 Pythonpsrecord包正是这样做的。

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'

图表看起来像: ps记录示例

内存分析器

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

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

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

教授

石墨堆栈和统计

对于简单的一次性测试来说,这似乎有些过分了,但对于像几天的调试这样的事情来说,这肯定是合理的。方便的一体机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,您可以绘制如下图表:

格拉法纳图表

石墨堆栈和电报

不是使用 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 部分是相同的。

PID统计

pidstat(包的一部分sysstat)可以产生易于解析的输出。当您需要进程的额外指标时,它非常有用,例如最有用的 3 组(CPU、内存和磁盘)包含:%usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s,kB_ccwr/s。我在中描述了它相关答案

答案3

htop是 . 的一个很好的替代品top。它有……颜色!简单的键盘快捷键!使用箭头键滚动列表!杀死一个进程而不离开也不记下 PID!标记多个进程并将其全部杀死!

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

真的,你应该尝试一下htoptop自从我第一次使用之后,我就再也没有开始过htop

显示单个进程:

htop -p PID

答案4

我来晚了一点,但我将仅使用默认值分享我的命令行技巧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
  ....

相关内容