Linux内存计算和测量:什么加什么等于什么?

Linux内存计算和测量:什么加什么等于什么?

我读过一些关于Linux内存管理的文章,了解(也许不精通)空闲内存、可用内存、交换区等概念。但是当我用以下命令检查时:

cat /proc/meminfo; free -w; vmstat -s

我只是无法精确计算数字来证明我的理解。

例如,“cat /proc/meminfo”显示:

MemTotal:        8169968 kB
MemFree:          984124 kB
MemAvailable:    4231224 kB
Buffers:          171420 kB
Cached:          3272688 kB
SwapCached:        65604 kB
Active:          3415076 kB
Inactive:        3388312 kB
Active(anon):    2636088 kB
Inactive(anon):   789932 kB
Active(file):     778988 kB
Inactive(file):  2598380 kB
Unevictable:          64 kB
...

“free -w”显示:

              total        used        free      shared     buffers       cache   available
Mem:        8169968     3566616      983864       66952      171420     3448068     4230964
Swap:       3903484      500620     3402864

“vmstat -s”显示

  8169968 K total memory
  3566616 K used memory
  3415476 K active memory
  3388312 K inactive memory
   983864 K free memory
   171420 K buffer memory
  3448068 K swap cache
  3903484 K total swap
   500620 K used swap
  3402864 K free swap
  9335996 non-nice user cpu ticks
...

这是我的问题:

1. 为什么不是“已用+可用=总计”?

有些文章说“空闲”内存不被任何东西使用,而“可用”内存可能被某些缓冲区使用,但可以随时分配给程序。按照我的理解,这意味着:

总计=可用+已用

但当我计算时:

4231224 ("MemAvailable" in /proc/meminfo) + 3566616 ("used memory" in vmstat) = 7797840

与“总计”(8169968 K) 的差距:小于 372128 K(或 363 M)

4230964 ("available" in free) + 3566616 ("used" in free) = 7797580

与“总计”(8169968 K) 的差距:小于 372388 K(或 363 M)

那么为什么差距这么大呢?

2、为什么不是“空闲+缓冲区+缓存=可用”?

根据一些文章,Linux可能会使用一些内存用于缓冲区和缓存,因此这部分内存不是“空闲”的(没有被任何东西使用,因此可以立即分配给程序)但仍然是“可用的”(尽管被用于缓冲区或高速缓存,但可以随时释放并分配给程序)。但当我计算时:

/proc/内存信息:

984124 (MemFree) + 171420 (Buffers) + 3272688 (Cached) = 4428232

与“MemAvailable”(4231224) 的差距:197008 K(或 192 M)以上

自由的:

983864 (free) + 171420 (buffers) + 3448068 (cache) = 4603352

与“可用”(4230964) 的差距:372388 K(或 363 M)更多

为什么差距这么大?

此外,数字“372388 K”同时出现在本题和上一题中。也就是说,在“free”命令中:

total = available + used + 372388
total = free + buffers + cache - 372388

那么它是什么(“372388 K”内存)?

3. 为什么不是“活跃+不活跃+空闲=总计”?

有些文章说“活动”是最近访问过的内存,而“非活动”则不是。据我的理解:

活动(应用程序)+非活动(应用程序)=应用程序使用的内存活动(缓冲区)+非活动(缓冲区)=缓冲区使用的内存...

因此,“活动 + 非活动 = 已使用的总内存”和“已使用的总内存 + 空闲 = 总内存”。但当我计算时:

/proc/内存信息:

3415076 (Active) + 3388312 (Inactive) + 984124 (MemFree) = 7787512

与总计 (8169968 K) 的差距:小于 382456 K(或 373 M)

虚拟机统计:

3415476 (active) + 3388312 (inactive) + 983864 (free) = 7787652

与总数 (8169968 K) 的差距:小于 382316 K(或 373 M)

我的理解正确吗?还有其他类似的方程吗?

我问这个问题的原因不是为了编写一个计算内存的应用程序,而是为了验证我的理解并找出我错过的内容。

例如,如果我被告知我的工资是每月 1000 美元,但我的银行账户上只有 800 美元。有文章说原因是税收。我算了12%的税,还差80块钱,于是我又问了一遍,才知道了社保的概念。

这些Linux内存统计的输出是这样的情况:除了可以精确计算“空闲交换+已用交换=总交换”之外,我无法从输出中得到任何方程。这让我对自己对Linux内存管理的理解不自信。我想我错过了一些东西,尤其是当差距高达 373 MB 时。

答案1

  1. 为什么不是“已用+可用=总计”?

因为可用内存是已用内存和可用内存的子集:它是在不强制系统交换的情况下可以使用的内存量,IE可用内存加上当前用于缓存的内存,可以立即驱逐。看如何跨发行版获取可移植的可用内存量?有关计算的详细信息。

  1. 为什么不是“空闲+缓冲区+缓存=可用”?

因为一些用于缓冲区和缓存的内存不可用:它不能立即被驱逐,或者使用它会将系统推到水位线之上。

  1. 为什么不是“活跃+不活跃+空闲=总计”?

因为活动和非活动值反映了相应的 LRU,并且某些页面不会在那里被跟踪 — 例如页表 ( PageTables) — 或者是不可清除的 ( Unevictable)。

还有其他类似的方程吗?

free的输出中,“已使用”被计算为“总 - 空闲 - 缓存 - 缓冲区”,除非结果为负数(这可能发生例如在 LXC 中)在这种情况下它是“完全免费”的。因此,在所有情况下,“总计”要么是“已用+空闲+缓存+缓冲区”,要么是“已用+空闲”。

相关内容