memory zone spanned/present/managed区别
这两天研究memory zone的水位问题涉及到两个参数分别是/proc/sys/vm/extra_free_kbytes以及min_free_kbytes(在kernel-4.4)。
而通过代码发现min_free_kbytes这个值由normal zone下的managed pages决定。
先说总的关系:
spanned:表示当前zone所包含的所有的pages
present:表示当前zone在去掉第一阶段kernel reserve的内存之后剩下的pages。
managed:表示当前zone去掉初始化完成以后所有的kernel reserve的内存剩下的pages。
其中min_free_kbytes由normal zone去掉第一阶段初始化完成后的kernel reserve的内存后所剩余的pages来计算得出min_free_kbytes
-
int __meminit init_per_zone_wmark_min(void)
-
{
-
unsigned long lowmem_kbytes;
-
int new_min_free_kbytes;
-
-
lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);-------------(1)
-
new_min_free_kbytes = int_sqrt(lowmem_kbytes * 16);-------------(2)
-
-
if (new_min_free_kbytes > user_min_free_kbytes) {
-
min_free_kbytes = new_min_free_kbytes;-------------------(3)
-
if (min_free_kbytes < 128)
-
min_free_kbytes = 128;
-
if (min_free_kbytes > 65536)
-
min_free_kbytes = 65536;
-
} else {
-
pr_warn("min_free_kbytes is not updated to %d because user defined value %d is preferred\n",
-
new_min_free_kbytes, user_min_free_kbytes);
-
}
-
setup_per_zone_wmarks();
-
refresh_zone_stat_thresholds();
-
setup_per_zone_lowmem_reserve();
-
setup_per_zone_inactive_ratio();
-
return 0;
-
}
-
module_init(init_per_zone_wmark_min)
ps:kernel reserve部分内存的初始化在kernel启动过程中可能会而分为两个阶段。
(1)这里的值为所有zone的managed pages之和乘4将单位换算成KB,但是此时的memory reserve还没完成,所以得到的managed pages和最后系统完全起来之后打出的值不一致,此时的managed pages为总的spanned pages减去reserved pages。
(2)然后乘16在开方,最后这个值就是min_free_kbytes的值。
(3)得出min_free_kbytes的值。
from: https://blog.csdn.net/zsj100213/article/details/80696451
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析