如何自由计算用过的内存?

Bjö*_*ist 3 linux memory

如何自由计算已用内存,为什么它与/ proc报告有什么不同?

# cat /proc/*/status | grep VmSize | awk '{sum += $2} END {print sum}'
281260
Run Code Online (Sandbox Code Playgroud)

但免费说:

# free
             total       used       free     shared    buffers     cached
Mem:        524288     326488     197800          0          0          0
Run Code Online (Sandbox Code Playgroud)

谁是对的?是使用281260kb内存还是326488kb?

dmc*_*kee 6

标题问:"免费计算使用的内存如何?"

答:它询问操作系统,操作系统必须跟踪它才能完成它的工作.

更具体地说,它询问内存管理子系统.正如评论中的绵羊模拟器所述,Linux内核在/proc虚拟文件系统中公开了各种操作系统维护的数据,但是每个完整的服务操作系统都必须跟踪它们的数据类型,因此提供一个free可供使用的API是一件小事.

问题是:"为什么这与添加报告的所有进程的VmSize不同?"

答:这里至少有事情要发生

  1. Linux将承诺内存到程序而不实际分配它.当你这样做时char *p=new(1024*1024*1024*sizeof(char));,内核不会立即让你获得一个千兆字节.如果只是说"OK",并且数字会在你开始使用时抓住它.因此需要臭名昭着的OOM杀手.
  2. 动态库是共享的,并且可以将单页实内存映射到多个进程的虚拟地址空间中.

此外,您对proc文件系统的传递不是原子的.

结果是输出free更准确地反映了在给定时刻机器上物理内存的使用.


Tim*_*ird 5

我认为“免费”指的是标准 Linux 版本,它通常来自 procps 命令行工具套件。不同版本的免费软件(例如来自 busybox 的版本)报告的数字不同。

procps 版本的“free”通过读取/proc/meminfo 来获取有关系统内存的信息。还有一个系统调用(sysinfo)也可用于从内核获取内存编号。如果系统没有 /proc 文件系统,则可以使用此功能,但这在深度嵌入式系统之外很少见,而且据我所知, procps free 不使用该系统调用。

“已用”内存的计算方法是通过总内存减去可用内存、缓存内存、可回收的平板内存和缓冲内存。使用 /proc/meminfo 中的名称的公式为:

已用 = MemTotal - MemFree - 缓存 - SReclaimable - 缓冲区

请注意,free 不引用任何单个进程的 Vm* 值。这些是虚拟内存使用量的数字,可能与进程的物理内存使用量不匹配。空闲报告的数字是物理内存的数字。