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