Linux内核swap空间访问处理位置定位及swap-in延迟注入需求
问题描述
需求:为Python进程的swap-in操作注入延迟(在swap空间中的页加载至主内存前添加延迟,用于模拟特定场景)。已尝试在内核中以下位置添加printk语句,但未精准捕获swap-in/swap-out操作:
do_swap_page()(mm/memory.c):并非始终生效mem_cgroup_swapin_charge_page()(mm/memcontrol.c):仅在新分配swap空间时生效swapin_readahead()/swap_vma_readahead()(mm/swap_state.c):未生效
环境:Linux 6.0.9内核,已通过free -m和/proc/meminfo确认目标Python进程确实在使用swap空间,但无法定位正确的内核处理逻辑。
解决方案
1. 精准捕获swap-in操作:修改swap_readpage()函数
mm/swap_state.c中的swap_readpage()是所有swap页从磁盘加载到内存的核心执行入口,覆盖了普通缺页触发的swap-in和预读触发的swap-in场景,是注入延迟的关键位置。
修改示例
在函数开头添加进程过滤和延迟逻辑:
#include <linux/delay.h> #include <linux/sched.h> int swap_readpage(struct page *page, bool is_readahead) { // 仅对Python进程注入延迟,可根据进程名调整 if (strcmp(current->comm, "python") == 0) { // 注入100ms延迟,可自定义时长 msleep(100); // 可选:添加日志验证触发 printk(KERN_INFO "[SWAP-DELAY] Python swap-in triggered for page %p\n", page); } // 保留原有函数逻辑 struct swap_info_struct *sis; swp_entry_t entry = page_swap_entry(page); // ... 以下为原有代码 }
2. 捕获swap-out操作(若需)
如果需要对swap-out操作也注入延迟,修改同文件的swap_writepage()函数,逻辑类似:
int swap_writepage(struct page *page, struct writeback_control *wbc) { if (strcmp(current->comm, "python") == 0) { msleep(50); // 自定义swap-out延迟时长 printk(KERN_INFO "[SWAP-DELAY] Python swap-out triggered for page %p\n", page); } // 保留原有函数逻辑 swp_entry_t entry = page_swap_entry(page); // ... 以下为原有代码 }
3. 验证方法
- 重新编译内核并重启系统
- 运行内存密集型Python程序触发swap
- 通过
dmesg查看自定义日志,确认延迟逻辑被触发 - 观测Python进程的响应时间变化,验证延迟已生效
原尝试函数失效原因说明
do_swap_page():仅处理缺页异常触发的swap-in,预读场景的swap-in不会进入该函数mem_cgroup_swapin_charge_page():仅负责cgroup内存计费流程,不涉及swap页的实际磁盘读取操作swapin_readahead():仅发起预读请求,实际的页加载IO操作由swap_readpage执行
内容的提问来源于stack exchange,提问作者Amirhossein Sefati
相关产品推荐
相关产品推荐

