You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:31:03