如何在Linux上记录内存消耗?

如何在Linux上记录内存消耗?,linux,logging,memory-consumption,Linux,Logging,Memory Consumption,是否有现成的解决方案记录从系统开始的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便以后进行分析 我正在研究基于Linux 2.4的嵌入式系统。我需要调试与内存消耗有关的问题。每次系统启动时,我的应用程序都会自动启动。我需要从固定的时间间隔(尽可能多地)获取带有时间戳的数据,以便跟踪问题 我的问题的症状是:当系统启动时,它启动我的主应用程序和GUI来可视化系统的主要参数。基于GTK+(X服务器)的GUI。如果我禁用GUI和X服务器,那么我的应用程序工作正常。如果我启用GUI和X服务器

是否有现成的解决方案记录从系统开始的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便以后进行分析

我正在研究基于Linux 2.4的嵌入式系统。我需要调试与内存消耗有关的问题。每次系统启动时,我的应用程序都会自动启动。我需要从固定的时间间隔(尽可能多地)获取带有时间戳的数据,以便跟踪问题


我的问题的症状是:当系统启动时,它启动我的主应用程序和GUI来可视化系统的主要参数。基于GTK+(X服务器)的GUI。如果我禁用GUI和X服务器,那么我的应用程序工作正常。如果我启用GUI和X服务器,当我在主板上安装了256 MiB或512 MiB的物理内存时,它将无法工作。如果我安装了1 GiB内存,那么一切都正常

你可以把

vmstat X >> mylogfile
进入启动脚本。由于您的应用程序已经在启动中,您可以将这一行添加到您的应用程序已经使用的初始化脚本的末尾。 (其中X是日志消息之间的秒数)

一个小脚本,如

rm memory.log
while true; do free >> memory.log; sleep 1; done

有一个叫做

sar
on*nix系统。您可以尝试使用它来监视内存使用情况。它定期进行测量。做一个

man sar

更多细节。我认为选项是-r用于进行内存测量,-I用于指定您想要的间隔。

我认为添加crontab条目就足够了

*/5 *  *  *  *  free -m >> some_output_file

还有其他工具,例如,etc,它们几乎可以完成相同的任务,但安装和配置起来要容易得多。我最喜欢的是SeaLion,因为它是免费的,而且它提供了常见linux命令原始输出的很棒的时间轴视图

以下脚本打印时间戳和标题

#/bin/bash-e
echo“日期时间$(免费-m | grep total | sed-E's/^(.*)/\1/g)”
虽然真实;做
echo“$(日期'+%Y-%m-%d%H:%m:%S')$(免费-m | grep Mem:| sed'S/Mem://g)”
睡眠1
完成
输出如下所示(在Ubuntu 15.04上测试,64位)

缓存的可用共享缓冲区使用的日期时间总计
2015-08-01 13:57:27          24002      13283      10718        522        693       2308
2015-08-01 13:57:28          24002      13321      10680        522        693       2308
2015-08-01 13:57:29          24002      13355      10646        522        693       2308
2015-08-01 13:57:30          24002      13353      10648        522        693       2308

我非常喜欢记录所有内容,我发现了解哪些进程正在使用内存以及每个进程使用了多少内存(以及sumary统计数据)非常有用。以下命令每0.5秒记录一次按内存消耗排序的顶部打印输出:

top -bd0.5 -o +%MEM > memory.log

请注意,日志文件的增长速度将比仅存储总内存利用率统计数据快得多,因此请确保磁盘空间不会用完。

因此我知道我参加此游戏已经晚了,但我只是想出了这个答案,因为我需要这样做,而且我真的不想要额外的字段
vmstat
免费
等。。。所有的输出似乎都没有过多的过滤。下面是我得出的答案:

top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 > memory.txt
或:

grep
Kib Mem
绑定时,
top
的标准输出为:

KiB Mem : 16047368 total,  8708172 free,  6015720 used,  1323476 buff/cache
通过运行此直通切割,我们可以过滤到所使用的之前的数字

用户确实可以将
0.1
修改为另一个数字,以运行不同的捕获采样率。在我的例子中,我想使用
top
,这也是因为每次捕获内存统计数据的速度可以超过1秒,正如您在这里看到的,我希望每1/10秒捕获一次统计数据

注意事项: 事实证明,管道通过
切割
会导致文件归档的大量延迟。正如我们后来发现的那样,在数据采集过程中省去
剪切
命令,然后在输出文件上执行剪切命令要快得多。 此外,我们在测试中不需要时间戳

因此,情况如下:

开始记录:

退出日志记录:

过滤器:

两级剪切(过滤),首先是逗号,然后是空格。这是由于顶部对齐,并提供更干净的输出:

cut memory_raw -d',' -f3 | tee memory_used_withlabel.txt
cut memory_used_withlabel.txt -d' ' -f3 | tee memory_used.txt

这看起来类似于这个问题:你的应用程序在崩溃之前是否至少运行了一段时间?是的,以前的版本在同一系统中运行正常。现在我们开发了新版本,并开始解决这个问题。感谢您的提示,尽管我需要比每秒钟更频繁地记录数据。事实上,这非常接近我所需要的。我可以自己添加时间戳。
free-s1>memory.log
;这不会导致每秒启动一个新流程的成本。不过,它没有时间戳。(我知道这是一篇老文章,但我一直在寻找同样的东西,其他人也一样)。在某些免费版本中,由于存在错误,需要指定使用-c打印的次数。否则,它将显示无错误:秒参数'1'FailedTanks@Sputnik,您还必须指定秒数之前的计数。例如,
free-h-c3-s1
@hirschhornsalz-是否可以读取任何特定的
sysfs
,然后记录内存使用情况?我正在使用一个用
C
编写的程序,并希望以最小的开销登录使用它?+1用于Sealion,这是有史以来最快的注册/设置速度。我想整件事花了我大约6秒钟——我输入了我的电子邮件,一个密码。将一个命令粘贴到ssh中,弹出我的统计数据。肯定会有更多的pow
top -bd 0.1 | grep 'KiB Mem' | tee memory_raw.txt
ctrl-z (to exit logging)
cut memory_raw -d',' -f3 | tee memory_used_withlabel.txt
cut memory_used_withlabel.txt -d' ' -f3 | tee memory_used.txt