如何衡量Linux中应用程序或进程的内存使用情况?

在博客文章《了解Linux上的内存使用情况》中,ps并不是一个准确的工具。

为什么ps是“错误的”根据您的看法,ps不会报告进程的实际内存使用情况。它真正要做的是显示如果只有一个进程在运行,每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都有几十个进程在运行,这意味着ps报告的VSZ和RSS数字几乎肯定是错误的。

(注:这里详细介绍了这个问题。)


当前回答

我建议您使用top。你可以在这个页面上找到关于它的一切。它能够为您的流程提供所有必要的KPI,还可以捕获到文件中。

其他回答

除了答案中列出的解决方案之外,您还可以使用Linux命令“top”。它提供了运行系统的动态实时视图,并给出了整个系统的CPU和内存使用情况,以及每个程序的百分比:

top

通过程序PID进行过滤:

top -p <PID>

按程序名过滤:

top | grep <PROCESS NAME>

“顶部”还提供一些字段,例如:

VIRT—虚拟映像(kb):任务使用的虚拟内存总量

RES——驻留大小(kb):任务使用的非交换物理内存;RES=代码+数据。

DATA——数据+堆栈大小(kb):除可执行代码外,专用于其他代码的物理内存量,也称为“数据驻留集”大小或DRS。

SHR—共享内存大小(kb):任务使用的共享内存量。它只是反映了可能与其他进程共享的内存。

此处参考。

如果您想要比使用Valgrind进行评测更快的东西,并且您的内核更旧,而且您不能使用smaps,那么一个带有显示进程驻留集选项的ps(使用ps-o rss,命令)可以让您快速、合理地了解所使用的非交换内存的实际数量。

这里再次投票支持Valgrind,但我想补充一点,您可以使用Alleyoop这样的工具来帮助您解释Valgrind生成的结果。

我一直使用这两种工具,并且总是有简洁、无泄漏的代码来自豪地展示它;)

如果您的代码是C或C++,您可能可以使用getrusage(),它会返回有关进程内存和时间使用情况的各种统计信息。

但并非所有平台都支持这一点,并将为内存使用选项返回0值。

相反,您可以查看在/proc/[pid]/statm中创建的虚拟文件(其中[pid]被您的进程id替换)。

此文件看起来像一个包含7个整数的文本文件。您可能对该文件中的第一个(所有内存使用)和第六个(数据内存使用)数字最感兴趣。

使用ps或类似工具,您只能获得该进程分配的内存页数量。此数字正确,但:

不反映应用程序使用的实际内存量,只反映为其保留的内存量如果页面被共享,例如由多个线程共享或使用动态链接库共享,则可能会产生误导

如果您真的想知道应用程序实际使用的内存量,则需要在探查器中运行它。例如,Valgrind可以让您了解所使用的内存量,更重要的是,了解程序中可能的内存泄漏。Valgrind的堆轮廓仪工具称为“massif”:

Massif是一个堆分析器。它通过定期拍摄程序堆的快照来执行详细的堆分析。它会生成一个图表,显示一段时间内的堆使用情况,包括程序中哪些部分负责最多内存分配的信息。该图由文本或HTML文件补充,该文件包含更多信息,用于确定分配最多内存的位置。Massif运行程序的速度比正常速度慢20倍。

如Valgrind文档中所述,您需要通过Valgrind运行程序:

valgrind --tool=massif <executable> <arguments>

Massif写入内存使用快照的转储(例如Massif.out.1245)。这些快照提供(1)内存使用的时间线,(2)每个快照的程序内存分配位置的记录。分析这些文件的一个很好的图形工具是massif可视化工具。但我发现,与Valgrind一起提供的基于文本的简单工具ms_print已经有了很大的帮助。

要查找内存泄漏,请使用valgrind的(默认)memcheck工具。