如何衡量应用程序或进程的实际内存使用状况?

这个问题在这里详细介绍。 linux

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

了解Linux上的内存使用的博客文章中, ps不是用于此目的的准确工具。 github

为何ps是“错误的” 工具

根据您的见解, ps不会报告进程的实际内存使用状况。 它的真正做用是显示若是每一个进程是惟一运行的进程每一个进程将占用多少实际内存。 固然,一台典型的Linux计算机在任何给定时间都运行着几十个进程,这意味着ps报告的VSZ和RSS编号几乎确定是错误的性能


#1楼

若是您有时间运行,Valgrind会很棒。 valgrind --tool=massif是正确的解决方案。 spa

可是,我开始运行更大的示例,而且使用valgrind再也不可行。 有没有办法肯定程序的最大内存使用量(模数页面大小和共享页面)? 线程

在实际的UNIX系统上, /usr/bin/time -v能够工做。 在Linux上,可是,这行不通的。 code


#2楼

在最新版本的linux中,使用smaps子系统。 例如,对于PID为1234的进程: 进程

cat /proc/1234/smaps

它会准确告诉您当时它正在使用多少内存。 更重要的是,它将内存划分为私有内存和共享内存,所以您能够知道程序实例正在使用多少内存,而无需包括程序多个实例之间共享的内存。 内存


#3楼

若是您想要比使用Valgrind进行性能分析更快的速度而且您的内核更旧而且不能使用smaps,则带有选项以显示进程驻留集的ps -o rss,command (使用ps -o rss,command )能够为您提供快速且使用的非交换内存的实际数量的合理_aproximation_


#4楼

我正在使用htop ; 这是一个很是好的控制台程序,相似于Windows Task Manager。


#5楼

使用ps或相似工具,您将只得到该进程分配的内存页面数量。 该数字是正确的,可是:

  • 不反映应用程序实际使用的内存量,仅反映为其保留的内存量

  • 若是页面被共享(例如由多个线程共享或经过使用动态连接的库)可能会产生误导

若是您确实想知道应用程序实际使用的内存量,则须要在分析器中运行它。 例如, valgrind能够为您提供有关已用内存量的信息,更重要的是,您能够了解程序中可能的内存泄漏。 valgrind的堆分析器工具称为“ massif”:

Massif是堆分析器。 它经过对程序堆进行按期快照来执行详细的堆分析。 它生成一个图表,显示随时间推移的堆使用状况,包括有关程序的哪些部分负责最多内存分配的信息。 该图由文本或HTML文件补充,该文本或HTML文件包含更多信息,用于肯定分配最大内存的位置。 Massif运行的程序比正常运行慢约20倍。

valgrind文档中所述,您须要经过valgrind运行程序:

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

Massif写入内存使用状况快照的转储(例如massif.out.12345 )。 这些提供了(1)内存使用的时间表,(2)每一个快照,记录了程序存储器中的分配位置。 massif-visualizer是分析这些文件的一种出色的图形工具。 可是我发现ms_print这个由valgrind附带的简单的基于文本的工具已经ms_print了。

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

相关文章
相关标签/搜索