我读过一些关于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
- 为什么不是“已用+可用=总计”?
因为可用内存是已用内存和可用内存的子集:它是在不强制系统交换的情况下可以使用的内存量,IE可用内存加上当前用于缓存的内存,可以立即驱逐。看如何跨发行版获取可移植的可用内存量?有关计算的详细信息。
- 为什么不是“空闲+缓冲区+缓存=可用”?
因为一些用于缓冲区和缓存的内存不可用:它不能立即被驱逐,或者使用它会将系统推到水位线之上。
- 为什么不是“活跃+不活跃+空闲=总计”?
因为活动和非活动值反映了相应的 LRU,并且某些页面不会在那里被跟踪 — 例如页表 ( PageTables
) — 或者是不可清除的 ( Unevictable
)。
还有其他类似的方程吗?
在free
的输出中,“已使用”被计算为“总 - 空闲 - 缓存 - 缓冲区”,除非结果为负数(这可能发生例如在 LXC 中)在这种情况下它是“完全免费”的。因此,在所有情况下,“总计”要么是“已用+空闲+缓存+缓冲区”,要么是“已用+空闲”。