Linux 下 C++获得内存使用量
Linux下获取内存使用量
在 Linux 中,可用内存(Available)的计算方式并不是空闲内存(Free)加上缓冲/缓存(Buffers/Cached)的总和。这是一个常见的误解。实际上,"可用"内存是指可以不需要更多的IO即可立即使用的内存量。
这是因为,当需要更多内存时,Linux会尝试释放缓存,但缓冲区的内存不一定都能被释放。因此,"可用"内存的计算考虑了这个因素。
在内核3.14以后,包括Ubuntu 16.04及其后续版本的Linux系统中,"free"命令的输出中新增了一个"available"的列。这个列的值是内核估算的可用于启动新应用程序的内存量,而不必交换(swap)。
具体计算公式如下:
MemAvailable = MemFree + Buffers + Cached - (Shmem + Kernel_stack + PageTables + Slab)
这个公式中的每项都可以在"/proc/meminfo"中找到。其中,
MemFree:未使用的内存
Buffers:用于块设备的缓冲区
Cached:被各种驱动程序用来映射设备内存和其他各种目的的内存
Shmem:共享内存
Kernel_stack:内核栈的大小
PageTables:管理虚拟内存到物理内存的映射的页面表的大小
Slab:内核数据结构缓存
这个公式的具体含义是:系统实际可用的内存,等于空闲的内存,加上用于各种缓存的内存,减去用于共享内存、内核栈、页面表和Slab的内存。
代码实现
#include <sys/sysinfo.h>
#include <fstream>
struct sysinfo memInfo;
ret_monitorSystem_ = sysinfo (&memInfo);
if (ret_monitorSystem_ == -1)
{
ROS_ERROR("cann't get system info!");
return;
}
// 获取内存使用率
double MemTotal = memInfo.totalram / 1024;
double MemFree = memInfo.freeram / 1024;
// 读取 /proc/meminfo 文件获取其他内存信息
std::ifstream meminfo_file("/proc/meminfo");
unsigned long long Buffers, Cached, Shmem, KernelStack, PageTables, Slab;
std::string dummy;
if(meminfo_file.is_open())
{
while(meminfo_file >> dummy)
{
if(dummy == "Buffers:")
meminfo_file >> Buffers;
else if(dummy == "Cached:")// 获取内存使用率
double MemTotal = memInfo.totalram;
double MemFree = memInfo.freeram;
meminfo_file >> Cached;
else if(dummy == "Shmem:")
meminfo_file >> Shmem;
else if(dummy == "KernelStack:")
meminfo_file >> KernelStack;
else if(dummy == "PageTables:")
meminfo_file >> PageTables;
else if(dummy == "Slab:")
meminfo_file >> Slab;
}
meminfo_file.close();
}
else
{
ROS_ERROR("Cannot open /proc/meminfo");
return;
}
double MemAvailable = MemFree + Buffers + Cached - Shmem - KernelStack - PageTables - Slab;
double MemUsed = MemTotal - MemAvailable;
MemUsageRate_ = MemUsed / MemTotal;