是否有任何现成的解决方案来记录系统启动时的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便稍后进行分析。
我正在研究基于Linux 2.4的嵌入式系统。我需要调试与内存消耗相关的问题。我的应用程序会自动启动每个系统启动。我需要从定期间隔(尽可能经常)获取带时间戳的数据的方法,这样我就可以追踪问题。
我的问题的症状:当系统启动时,它启动了我的主应用程序和GUI,以可视化系统的主要参数。 GUI基于GTK +(X服务器)。如果我禁用GUI和X服务器,那么我的应用程序工作正常。如果我启用GUI和X服务器,当我在主板上安装256 MiB或512 MiB的物理内存时,它不起作用。如果我安装了1 GiB内存,那么一切正常。
答案 0 :(得分:31)
像
这样的小脚本rm memory.log
while true; do free >> memory.log; sleep 1; done
答案 1 :(得分:23)
以下脚本打印时间戳和标题。
#!/bin/bash -e
echo " date time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')"
while true; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')"
sleep 1
done
输出看起来像这样(在Ubuntu 15.04,64位上测试)。
date time total used free shared buffers cached
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
答案 2 :(得分:4)
有一个名为
的程序sar
man sar
了解更多详情。我认为选项是-r用于记忆测量,-i用于指定你想要的间隔。
答案 3 :(得分:4)
我认为添加crontab条目就足够了
*/5 * * * * free -m >> some_output_file
还有其他工具,例如SeaLion,New Relic,Server Density等,它们几乎可以相同,但更容易安装和配置。我最喜欢的是SeaLion,因为它是免费的,并且它提供了常见的linux命令的原始输出的令人敬畏的时间线视图。
答案 4 :(得分:2)
你可以放点像
vmstat X >> mylogfile
进入启动脚本。由于您的应用程序已经处于启动状态,您只需将此行添加到应用程序已在使用的初始化脚本的末尾即可。 (其中X是日志消息之间的秒数)
答案 5 :(得分:0)
我非常喜欢记录所有内容,并且发现了解哪些进程正在使用内存以及每个进程正在使用多少(以及汇总统计信息)非常有用。以下命令记录每0.5秒按内存消耗排序的顶部打印输出:
top -bd0.5 -o +%MEM > memory.log
请注意,与仅存储总内存利用率统计信息相比,日志文件的增长速度要快得多,因此请确保不会用完磁盘空间。
答案 6 :(得分:0)
所以我知道我对这个游戏迟到了,但是我只是想出了这个答案,因为我需要这样做,而且我真的不希望 vmstat
strong>, free
等...似乎都在没有过多过滤的情况下输出。所以这是我想出的答案:
top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 > memory.txt
OR:
top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 | tee memory.txt
top
中的标准输出,当 grep
与 > Kib Mem
是:
KiB Mem : 16047368 total, 8708172 free, 6015720 used, 1323476 buff/cache
通过切入进行此操作,我们筛选出的字面大小仅为已使用
之前的数字用户确实可以将 0.1
修改为另一个数字,以运行不同的捕获采样率。就我而言,我还想使用 top
,因为每次捕获运行的内存统计信息都快于1秒,如您所见,我想捕获一个统计信息,每1/10秒。
注释:
事实证明,通过 cut
进行管道传输会导致大量延迟,无法进行任何归档。正如我们后来发现的,在数据获取过程中省去 cut
命令,然后稍后在输出文件上执行cut命令要快得多。
另外,我们的测试中不需要时间戳。
因此,其外观如下:
开始记录:
top -bd 0.1 | grep 'KiB Mem' | tee memory_raw.txt
退出日志记录:
ctrl-z (to exit logging)
过滤器:
2个级别的剪切(过滤),首先是逗号,然后是空格。这是由于 top
的对齐方式,并提供了更清晰的输出:
cut memory_raw -d',' -f3 | tee memory_used_withlabel.txt
cut memory_used_withlabel.txt -d' ' -f3 | tee memory_used.txt