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

时间:2009-12-08 16:41:27

标签: linux logging memory-consumption

是否有任何现成的解决方案来记录系统启动时的内存消耗?我想将数据记录到简单的文本文件或某个数据库中,以便稍后进行分析。

我正在研究基于Linux 2.4的嵌入式系统。我需要调试与内存消耗相关的问题。我的应用程序会自动启动每个系统启动。我需要从定期间隔(尽可能经常)获取带时间戳的数据的方法,这样我就可以追踪问题。

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

7 个答案:

答案 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
在* nix系统上。您可以尝试使用它来监视内存使用情况。它定期进行测量。做一个

man sar

了解更多详情。我认为选项是-r用于记忆测量,-i用于指定你想要的间隔。

答案 3 :(得分:4)

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

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

还有其他工具,例如SeaLionNew RelicServer 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