绘制进程的内存使用情况图表

60

有没有工具可以在Ubuntu上可视化显示选中进程的内存使用情况?

ps aux 可以展示一个数字快照,但我真的想要一条线,可以看着它随着我操作进程而变化,希望能够发现意外行为。

有人有什么建议吗?

7个回答

128

我找不到任何真正的工具来做这件事。

但我找到了一组整洁的小脚本,可以完成此任务。

使用这个小巧的Bash循环进行日志记录:

while true; do
ps -C <ProgramName> -o pid=,%mem=,vsz= >> /tmp/mem.log
gnuplot /tmp/show_mem.plt
sleep 1
done &

这将创建一个名为 /tmp/mem.log 的内存使用日志文件。然后,使用以下脚本(放在 /tmp/show_mem.plt 中)使用 gnuplot 生成数据的图像:

set term png small size 800,600
set output "mem-graph.png"

set ylabel "VSZ"
set y2label "%MEM"

set ytics nomirror
set y2tics nomirror in

set yrange [0:*]
set y2range [0:*]

plot "/tmp/mem.log" using 3 with lines axes x1y1 title "VSZ", \
     "/tmp/mem.log" using 2 with lines axes x1y2 title "%MEM"

使用默认的GNOME图像查看器打开图像时,当它发生变化时,它会不断重新加载。因此,如果所有上述循环都在后台运行,它将出现在图像查看器内运行一个令人惊叹的内存使用图形工具:)

我现在正在跟踪的进程看起来像这样: 不断升高的内存使用图表

看起来我确实有一些内存问题:(

这其中有很多是从http://brunogirin.blogspot.com.au/2010/09/memory-usage-graphs-with-ps-and-gnuplot.html中摘录的,应该给予信用。


我喜欢你的贡献!只是提醒一句,在我的机器上,1秒的延迟太快了,CPU使用率飙升到了大约50%,我将其改为5秒,这对我来说仍然足够好,现在一切都很棒 :) - Purefan
4
我稍微改进了一下,使它完全自动化。我的版本在https://gist.github.com/nicolasazrak/32d68ed6c845a095f75f037ecc2f0436。 - The SWE

25

接受的答案对我有用,但是每次想要测量内存时都要做很多复制/粘贴,让我感到有些疲倦,因此我创建了一个小工具来解决这个问题:https://github.com/parikls/mem_usage_ui

安装方法:

pip install mem_usage_ui

在shell中输入mem_usage_ui来启动浏览器GUI界面。

下面是结果的样子:

enter image description here


2
mem_usage_ui 很好用。谢谢! - silviot
很棒的工具,只用了20秒就完成了工作 :) - programort
回答应该不仅仅是一个链接,还应包括以下细节:a)如何安装,b)如何运行。类似于这个答案:https://dev59.com/BWsz5IYBdhLWcg3wTl0T#62876993 - Cornelius Roemer
安装和运行的详细说明可以在以下链接找到:https://stackoverflow.com/a/62876993/7483211 - undefined

18

可以将目标进程 $PID 的常驻集大小流式传输到 ttyplot 进行实时显示:

while :; do grep -oP '^VmRSS:\s+\K\d+' /proc/$PID/status \
    | numfmt --from-unit Ki --to-unit Mi; sleep 1; done | ttyplot -u Mi

asciicast

ttyplot -u Mi 可以被替换为 feedgnuplot --stream --line --point --xlen 20,在 GUI(例如 gnuplot 的图像导出)中获得几乎相同的绘图效果。feedgnuplot 可以通过 apt-get 安装


好的答案,因为它是一个实时绘图的答案。 - bux
只有在 tty 上显示随时间变化的用法!不错。 - Endareth
1
while :; do grep -oP '^MemAvailable:\s+\K\d+' /proc/meminfo | numfmt --from-unit Ki --to-unit Mi; sleep 1; done | ttyplot -u Mi 可以绘制出所有可用的系统内存。 - Jamie Pate
在启动进程之前,我如何获取进程的PID号码?我要使用运行shell的PID号码吗?很不幸,这并不是一个完整的答案。 - Cornelius Roemer
尝试使用 pgrep 命令。将 $PID 替换为 $(pgrep --newest PROGRAM) - saaj

12

Python包Memory Profiler也可用于非Python可执行文件。

使用mprof生成完整的内存使用报告,并绘制它:

mprof run <executable>
mprof plot

剧情大致如下:

性能图

它已经可以在PyPI上安装了:

pip install -U memory_profiler

1
内存分析器的自述文件让我认为它更加复杂,所以我忽略了它,尝试使用其他答案的变体来编写自己的代码。这就是缺失的快速入门指南! - Iain Samuel McLean Elder
1
现在这是快速入门指南:https://github.com/pythonprofilers/memory_profiler/pull/358 - Iain Samuel McLean Elder
哇!我很高兴它对你有帮助! - cartoonist
与排名最高的两个答案相比,这个可以直接使用。非常简单。 - Cornelius Roemer

9

我非常喜欢使用"htop"而不是"top"。它非常丰富多彩,并且具有许多选项,例如设置、搜索、反转、树形结构、排序方式、优先级和进程终止等。你可以尝试一下:

$ sudo apt-get install htop

htop


6
谢谢,César。不过我希望有一个图形用户界面……能够在时间和内存轴上显示漂亮的线条。我不想自己编写程序来提取数据并绘制图表。你对此有什么想法吗? - BanksySan
大多数电子表格程序都可以按列导入数据,然后绘制图表。 - DaveWalley
3
虽然我很喜欢htop,但它更适合显示瞬时内存使用情况,而不是随时间变化的内存使用情况。 - Nick Desaulniers
2
htop有一个图形模式,可以显示随时间变化的内存/CPU使用情况:https://hisham.hm/htop/index.php?page=screenshots - ybeltukov

4

使用Top命令可以轻松解决问题。

top -b | grep {name of process}
top -b -p {PID}
top -b -u {userid}

1
干杯,虽然“顶级”,但我正在寻找图形表示。 - BanksySan

-3
尝试在命令行中运行命令"top"。这将显示一个类似于Windows任务管理器的进程列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接