Linux memcg_wb_domain脏页写回domain与cgroup关联

发布时间:2026/9/30 3:57:06

Linux memcg_wb_domain脏页写回domain与cgroup关联 Linux memcg_wb_domain脏页写回domain与cgroup关联memcg_wb_domain是memory cgroup与writeback(回写)子系统之间的关键桥梁。在cgroup v2环境下每个memory cgroup拥有独立的脏页写回domain这使得内核可以基于cgroup粒度控制脏页比例、回写阈值和回写速率从而实现每cgroup级别的内存写回隔离。wb_domain结构扩展内核在wb_domain中嵌入memcg特定的字段使得每个memory cgroup都能拥有独立的回写domain而非全局共享一个domain。cstruct wb_domain {spinlock_t lock;/** 脏页限制和阈值dirty_limit是cgroup允许的脏页上限* dirty_thresh和bg_thresh分别是同步回写和后台回写阈值*/unsigned long dirty_limit;unsigned long dirty_thresh;unsigned long bg_thresh;/** 回写带宽估算用于计算回写速率* 基于周期性的脏页产生量和回写完成量*/struct dirty_throttle_control dtc;struct bdi_writeback_congested *congested;/** memcg特有字段指向所属memory cgroup的指针*/struct mem_cgroup *memcg;struct cgroup_subsys_state *css;};memcg_wb_domain的创建与初始化当memory cgroup被创建时内核调用memcg_wb_domain_init为其分配并初始化独立的写回domain。cint memcg_wb_domain_init(struct mem_cgroup *memcg, gfp_t gfp){struct wb_domain *dom;dom kzalloc(sizeof(*dom), gfp);if (!dom)return -ENOMEM;spin_lock_init(dom-lock);dom-memcg memcg;dom-css memcg-css;/** 初始化dirty阈值计算所需的时间戳和速率估算*/dom-dtc.thresh 0;dom-dtc.dirty 0;dom-dtc.time 0;dom-dtc.rate 0;dom-dtc.bw_time 0;dom-dtc.bw 0;/** 注册到全局domain链表用于per-domain的* 回写线程调度和阈值计算*/spin_lock(wb_domain_list_lock);list_add(dom-list, wb_domains);spin_unlock(wb_domain_list_lock);memcg-wb_domain dom;return 0;}脏页阈值计算中的cgroup关联当全局脏页阈值计算发生时memcg_wb_domain参与计算每个cgroup的独立脏页限制。核心函数memcg_wb_domain_dirty_limits根据cgroup memory限制和脏页比例计算阈值。cvoid memcg_wb_domain_dirty_limits(struct mem_cgroup *memcg,unsigned long *dirty_thresh,unsigned long *bg_thresh){struct wb_domain *dom memcg-wb_domain;unsigned long memcg_limit;unsigned long dirty_ratio;unsigned long bg_ratio;if (!dom)return;/** 获取cgroup的内存上限。* 如果memory.max为max(无限制)则回退到系统全局阈值*/memcg_limit memcg_page_state(memcg, MEMCG_LIMIT);if (memcg_limit PAGE_COUNTER_MAX) {*dirty_thresh global_dirty_limit;*bg_thresh global_background_dirty_limit;return;}/** 根据vm.dirty_ratio和vm.dirty_background_ratio计算阈值* dirty_thresh min(memcg_limit * dirty_ratio / 100, global_dirty_limit)* 同时确保阈值不超过cgroup限制本身*/dirty_ratio vm_dirty_ratio;bg_ratio vm_dirty_background_ratio;*dirty_thresh memcg_limit * dirty_ratio / 100;*bg_thresh memcg_limit * bg_ratio / 100;/** 硬件限制阈值不能低于PAGE_SIZE的倍数* 也不能超过系统总的可回收页*/*dirty_thresh min(*dirty_thresh, global_dirty_limit);*bg_thresh min(*bg_thresh, global_background_dirty_limit);dom-dirty_thresh *dirty_thresh;dom-bg_thresh *bg_thresh;}page dirtier追踪与写回domain绑定每个脏页(通过set_page_dirty标记)需要被关联到其所属memcg的写回domain。内核通过page-mem_cgroup和page-mapping-host的inode信息确定页面归属。cvoid memcg_wb_domain_register_page(struct page *page){struct mem_cgroup *memcg;struct wb_domain *dom;struct inode *inode;if (!page-mapping || !page-mapping-host)return;inode page-mapping-host;if (!inode-i_sb-s_bdi)return;/** 获取产生脏页的memcg通过page_cgroup关联查找*/memcg page_mem_cgroup(page);if (!memcg || !memcg-wb_domain)return;dom memcg-wb_domain;/** 将inode的回写关联到cgroup特定的bdi_writeback* 确保回写线程在刷脏页时考虑cgroup的domain信息*/if (inode-i_wb ! memcg-wb_domain-bdi-wb) {inode_attach_wb(inode, dom-bdi-wb);}}memcg_wb_domain在回写流程中的调度作用当内核触发回写操作时(wb_workfn或周期性回写)writeback代码根据页面所属cgroup的domain信息检查是否达到该cgroup的脏页阈值。cbool memcg_wb_domain_should_writeback(struct mem_cgroup *memcg){struct wb_domain *dom memcg-wb_domain;unsigned long dirty;if (!dom)return false;/** 统计该cgroup的当前脏页数量*/dirty memcg_page_state(memcg, MEMCG_DIRTY);/** 如果脏页数超过后台阈值触发回写* 如果超过同步阈值则需要阻塞dirtier*/if (dirty dom-bg_thresh)return true;return false;}通过memcg_wb_domain机制每个memory cgroup拥有了独立的脏页管理能力。这意味着一个cgroup内的大量脏页产生不会影响其他cgroup的写回行为从而在容器化环境中实现了真正的I/O资源隔离。当cgroup被销毁时memcg_wb_domain_destroy负责回收domain并确保所有挂起的回写操作在cgroup移除前完成。
延伸阅读

更多相关文章

2026/9/29 20:15:22

3个关键升级让魔兽争霸3在现代电脑上焕发新生

3个关键升级让魔兽争霸3在现代电脑上焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔兽争霸3的卡顿、黑边、地图限制而烦恼&am…

2026/9/30 5:03:01

Linux may_open open_flag验证与O_TRUNC截断处理

Linux may_open是VFS层打开文件路径上的权限和标志验证关卡,位于fs/namei.c。它在do_dentry_open之前执行,负责对用户传入的open_flags做语义合规性检查,以及O_TRUNC截断条件的判定。任何不满足内核策略的flag组合都会在此被拒绝。 // fs/n…

2026/9/30 3:43:09

AI浪潮下,谁来守护品牌的真实面孔?

2026年,生成式AI已占据63%的信息检索流量入口。当用户不再翻页搜索引擎、而是直接向AI提问"哪个牌子的耳机好"时,品牌竞争的主战场已经悄然转移——从网页排名,转移到了AI对话框里。这场迁移催生了一个全新赛道:GEO&…

2026/9/30 12:13:03

GO [ 泛型 ]

泛型 前面我们已经学习了 Go 的变量、常量、数据类型、输入输出、条件控制、切片、字符串、映射表、指针、结构体、函数、方法、接口、类型、错误、文件和反射。接下来学习 Go 语言中一个很重要、也最容易被“写复杂”的能力:泛型(Generics)…

2026/9/30 12:13:03

STM32上电启动全流程解析:从复位向量到RTOS第一个任务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 12:13:03

国产车规MCU首次量产主动悬架:从工程视角拆解核心技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 12:13:03

DeepSeek-VL2在证券结算对账中的多模态核验实战

简介:本资源是一份面向金融科技从业者、量化系统开发工程师及AI模型落地工程师的深度技术方案文档,聚焦证券交易结算对账这一高精度、强合规场景,系统性提出基于DeepSeek-VL2多模态大模型的自动化核验与差异归因框架。全文610页、61章&#x…

2026/9/30 12:08:02

整车性能目标书(QR)完全指南:模板、分解与版本管理

我在主机厂调试了十来年整车性能,接手新项目的第一件事永远是同一件:翻开上一代车型的性能目标书,和动力总成、底盘、NVH、总布置几个team的人一起过一遍。很多新同事不理解,项目启动阶段最要紧的是节点计划,是零件定点…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/30 10:28:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑