这里详细介绍了这个问题.
如何衡量Linux中应用程序或进程的内存使用情况?
从了解Linux上的内存使用情况的博客文章来看,ps这不是用于此意图的准确工具.
为什么
ps"错"根据您的观察方式,
ps不会报告进程的实际内存使用情况.它真正做的是显示每个进程在运行的唯一进程中将占用多少实内存.当然,典型的Linux机器在任何给定时间都有几十个进程运行,这意味着报告的VSZ和RSS数量ps几乎肯定是错误的.
有没有办法以独立于平台的方式确定机器有多少来自C/C++的内核?如果不存在这样的事情,那么每个平台确定它(Windows/*nix/Mac)呢?
我需要在我的程序运行时获取mem使用VIRT和RES并显示它们.
到目前为止我尝试了什么:
getrusage(http://linux.die.net/man/2/getrusage)
int who = RUSAGE_SELF;
struct rusage usage;
int ret;
ret=getrusage(who,&usage);
cout<<usage.ru_maxrss;
Run Code Online (Sandbox Code Playgroud)
但我总是0.
对于c ++程序,是否有可能跟踪程序一次使用多少内存?
例如,一个带有原型的函数:
int getEstimatedTotalMemoryUsage();
Run Code Online (Sandbox Code Playgroud)
我想如果不可能,那么就必须离开程序,进行系统调用并从那里检查结果.如果是这样,有哪些工具可用于此类目的?假设这样的事情是可能的,那就是.
编辑:我正在使用linux,任何可以为你做这个的工具?
我刚编写了以下C++函数来以编程方式确定系统安装了多少RAM.它有效,但在我看来应该有一个更简单的方法来做到这一点.有人能告诉我,如果我错过了什么吗?
getRAM()
{
FILE* stream = popen( "head -n1 /proc/meminfo", "r" );
std::ostringstream output;
int bufsize = 128;
while( !feof( stream ) && !ferror( stream ))
{
char buf[bufsize];
int bytesRead = fread( buf, 1, bufsize, stream );
output.write( buf, bytesRead );
}
std::string result = output.str();
std::string label, ram;
std::istringstream iss(result);
iss >> label;
iss >> ram;
return ram;
}
Run Code Online (Sandbox Code Playgroud)
首先,我popen("head -n1 /proc/meminfo")用来从系统中获取meminfo文件的第一行.该命令的输出看起来像
MemTotal:775280 kB
一旦我得到了输出istringstream,就很容易将它标记为获取我想要的信息.我的问题是,是否有更简单的方法来读取此命令的输出?是否有标准的C++库调用来读取系统RAM的数量?
我一直在研究这个工具,以快速记录一些系统统计信息,如内存信息和CPU负载百分比(如任务管理器中显示的那样).我似乎有内存和日志记录部分,但计算CPU百分比非常困难:(我已经找到了很多关于检查CPU信息的方法的信息,但在摘要之外几乎没有任何代码示例我发现编译,或者评论很好,所以我很难找到一种方法来实现这一点.我已经阅读了很多关于获取CPU时序的stackoverflow问题,但我还没有能够把碎片放在一起.
也许我错过了这一点,但似乎一种流行的方式来解决这个问题是通过查询CPU两次,每次检查之间至少200ms,以帮助避免出现问题......解决问题?是的!我怎么做到这一点?:(我在语法上挑战D:
我将分享我的源代码,以便您可以看到到目前为止我到底做了什么.这只是一个.cpp,我正在使用VS2013 Express for C++,而且它仅适用于多核CPU的Windows.
提前警告:我很抱歉代码中的所有注释:x此外,如果您复制此代码并运行它,它将生成一个名为log.CSV的.CSV文件
//included libraries/functionality for input/output
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
//creates a static variable to convert Bytes to Megabytes
#define MB 1048576
//main program code loop
int main()
{
//Code block intiialization for the memory referenced in the Kernell
MEMORYSTATUSEX memStat;
memStat.dwLength = sizeof (memStat);
GlobalMemoryStatusEx(&memStat);
//loads the SYSTEMTIME
SYSTEMTIME sysTime;
//Retrieves data so that we have a way to Get it to output …Run Code Online (Sandbox Code Playgroud) 虽然这可能看起来像其他问题的重复,但让我解释为什么它不是.
我希望在达到某个内存限制时,让我的应用程序的特定部分优雅地降级.我可以使用基于剩余可用物理内存的标准,但这不安全,因为操作系统可能会在达到标准之前开始分页我的应用程序使用的内存,这会认为仍有一些物理内存,并保持因为同样的原因,我不能使用进程当前使用的物理内存量,因为一旦操作系统开始交换我,我会继续分配作为操作系统页面的内存,所以数字会不再成长
出于这个原因,我根据应用程序分配的内存量选择了一个标准,即非常接近虚拟内存大小.
这个问题(如何从进程内部确定CPU和内存消耗?)提供了查询当前进程使用的虚拟内存量的好方法,我认为这就是我所需要的.
在Windows上,我正在使用GetProcessMemoryInfo()和PrivateUsage现场,这很棒.
在Linux上,我尝试了几个不起作用的东西(如下所列).虚拟内存使用对我不起作用的原因是因为在Linux上的NVidia硬件上创建OpenCL上下文时会发生这种情况.驱动程序保留虚拟内存空间的区域,该区域足以容纳所有RAM,所有交换和所有视频内存.我猜这是统一地址空间和所有内容.但这也意味着该过程报告使用大量内存.例如,在我的系统上,top将报告VIRT列中的23.3 Gb(12 Gb RAM,6 Gb交换,2 Gb视频内存,其中NVidia驱动程序保留20 Gb).
在OSX上,通过使用task_info()和virtual_size字段,我也得到一个比预期更大的数字(一个应用程序的几个Gb,在Windows上甚至不接近1 Gb),但没有Linux那么大.
所以这是一个大问题:如何获得我的应用程序分配的内存量?我知道这是一个有点模糊的问题("分配内存"意味着什么?),但我很灵活:
真正重要的是数量随着动态分配(new,malloc,any)而增长,并在内存释放时缩小(我知道这可能与实现有关).
以下是我尝试和/或想过的一些解决方案,但这对我不起作用.
从/ proc/self/status中读取
这是如何从进程内部确定cpu和内存消耗所建议的方法.但是,如上所述,这将返回虚拟内存量,这对我不起作用.
从/ proc/self/statm中读取
非常糟糕:根据http://kernelnewbies.kernelnewbies.narkive.com/iG9xCmwB/proc-pid-statm-doesnt-match-with-status,它指的是Linux内核代码,这两个值之间的唯一区别是第二个不会减去reserved_vm虚拟内存的数量.我希望HOPED reserved_vm包含OpenCL驱动程序保留的内存,但事实并非如此.
使用mallinfo()和uordblks领域
这似乎并不包括所有的分配(我猜测它们new都缺失了),因为虚拟内存空间增加了2Gb(在做了一些内存繁重的工作并仍然保留了内存之后),我只是看到了返回的数量增长约0.1Gb mallinfo().
从/ proc/self/smaps中读取[heap]节大小
这个值从大约336,760 Kb开始,最高达到1,019,496 Kb,因为虚拟内存空间增加了+ 2Gb,然后它永远不会下降,所以我不确定我真的不能依赖这个数字......
监视我的应用程序中的所有内存分配
是的,在一个理想的世界里,我可以控制每个分配内存的人.但是,这是一个遗留应用程序,使用大量不同的分配器,一些mallocs,一些news,一些特定于操作系统的例程等.有一些插件可以做任何他们想做的事情,它们可以用不同的编译器编译,因此,虽然这对于真正控制内存很有用,但这在我的上下文中不起作用.
在OpenCL上下文初始化之前和之后读取虚拟内存大小
虽然这可能是解决问题的"hacky"方法(我可能不得不回避它),但我真的希望有一种更可靠的查询内存的方法,因为OpenCL上下文可以在我无法控制的地方初始化,并且其他类似但非OpenCL的具体问题可能会蔓延,我不知道.
这就是我所拥有的一切.还有一件事我还没有尝试过,因为它只能在OSX上运行,但它是使用为什么mstats和malloc_zone_statistics在免费后没有显示恢复的内存中描述的方法?,即使用malloc_get_all_zones()和malloc_zone_statistics() …
我知道这个问题已被多次询问过.我环顾四周,但似乎无法找到答案.
我确实找到了这段代码如何在C++中获取Windows下的内存使用情况.但它不会编译,我见过的所有其他答案都是关于如何获得单个进程cpu/ram的用法.
我在我的应用程序中处理图像流.有些图像真的很大.因此,在处理图像之前,我需要一种方法来判断是否可以使用剩余的内存来处理它.但我怎么知道我可以使用多少剩余内存?
2013-12-13 11:15:05.966 Total Memory: 505 MB User Memory: 434.3 MB
2013-12-13 11:15:05.967 Virtual: 348.7 MB Resident: 6.3 MB Free: 254.1 MB Inactive: 35 MB Active: 70.7 MB Wired: 70.6 MB
2013-12-13 11:15:57.742 Virtual: 530.2 MB Resident: 95.2 MB Free: 160.6 MB Inactive: 45 MB Active: 74.1 MB Wired: 72 MB
2013-12-13 11:16:41.320 Virtual: 569.2 …Run Code Online (Sandbox Code Playgroud)