56

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

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

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

4

8 回答 8

52

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

#!/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

输出看起来像这样(在 64 位 Ubuntu 15.04 上测试)。

      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
于 2015-08-01T11:48:25.293 回答
35

像这样的小脚本

rm memory.log
while true; do free >> memory.log; sleep 1; done
于 2009-12-08T16:46:42.350 回答
6

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

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

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

于 2018-08-18T03:20:35.940 回答
5

有一个程序叫

sar

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

man sar

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

于 2012-12-14T09:02:04.727 回答
5

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

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

还有其他工具,如SeaLionNew RelicServer Density等,它们几乎可以做同样的事情,但更容易安装和配置。我最喜欢的是 SeaLion,因为它是免费的,而且它还提供了一个很棒的时间线视图,可以查看常见 linux 命令的原始输出。

于 2013-11-14T07:28:24.520 回答
3

你可以把类似的东西

vmstat X >> mylogfile

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

于 2009-12-08T16:46:15.517 回答
1

为了定期有效地记录内存使用情况,我在这里结合了另一个答案和一种仅保留前 K 个内存使用进程的方法。

top -bd 1.5 -o +%MEM | grep "load average" -A 9 > memory_usage.log

该命令将每 1.5 秒记录一次最高的头信息和 3 个最高内存消耗的进程(有 6 行top的头信息偏移量)。top这比记录每个进程的信息节省了大量的磁盘空间。

于 2021-09-30T18:31:22.213 回答
0

所以我知道我玩这个游戏迟到了,但我只是想出了这个答案,因为我需要这样做,并且真的不想要额外的字段vmstatfree等等......过滤。所以这是我想出的答案:

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

或者:

top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 | tee memory.txt

topwhengrep的标准输出Kib Mem是:

KiB Mem : 16047368 total,  8708172 free,  6015720 used,  1323476 buff/cache

通过 cut 运行它,我们过滤到字面上只是使用之前的数字

用户确实可以将其修改0.1为另一个数字以运行不同的捕获采样率。在我的情况下,我还想使用top,因为您可以在每次捕获时以超过 1 秒的速度运行内存统计信息,正如您在此处看到的那样,我想每 1/10 秒捕获一次统计信息。

注意: 事实证明,管道通过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
于 2019-09-23T18:28:19.827 回答