# skb_live_patch **Repository Path**: qiming-007/skb_live_patch ## Basic Information - **Project Name**: skb_live_patch - **Description**: 本内核模块 (`skb_numa_ftrace.ko`) 是一个基于 `ftrace` 的动态补丁模块,旨在拦截网络子系统中的内存分配过程,强制将特定路径下的 SKB(Socket Buffer)相关内存分配到指定的 NUMA 节点上。此机制有助于优化 NUMA 架构下的网络性能,特别是在多节点系统中确保网络数据包处理的局部性。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-12 - **Last Updated**: 2025-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SKB NUMA 强制分配内核模块补丁 ## 概述 本内核模块 (`skb_numa_ftrace.ko`) 是一个基于 `ftrace` 的动态补丁模块,旨在拦截网络子系统中的内存分配过程,强制将特定路径下的 SKB(Socket Buffer)相关内存分配到指定的 NUMA 节点上。此机制有助于优化 NUMA 架构下的网络性能,特别是在多节点系统中确保网络数据包处理的局部性。 此外,该模块还会强制启用 `NETIF_F_NOCACHE_COPY` 标志,用于避免不必要的缓存拷贝操作,提高数据传输效率。 ## 功能特性 - **强制 NUMA 分配**:通过拦截 `__alloc_pages_nodemask` 函数调用,将来自 `skb_page_frag_refill` 和 `sk_page_frag_refill` 路径的内存分配强制分配到预设的目标 NUMA 节点。 - **NOCACHE_COPY 强制启用**:在网络套接字页面刷新前自动设置 `NETIF_F_NOCACHE_COPY` 标志,提升网络 I/O 性能。 - **运行时可配置目标节点**:支持通过模块参数在加载时设定目标网卡 NUMA 节点 ID。 - **轻量级追踪实现**:采用 `ftrace` 实现高效的函数拦截,最小化对系统性能的影响。 - **调试统计信息(DEBUG 模式)**:在启用调试模式下提供 `/sys/kernel/skb_numa_force/stats` 接口查看修改计数器。 ## 工作原理 ### 拦截点说明 1. **`sk_page_frag_refill` Hook** - 在进入 `sk_page_frag_refill` 函数时,强制设置对应 socket 的 `sk->sk_route_caps` 标志位 `NETIF_F_NOCACHE_COPY`。 - 这会指示底层网络设备驱动不要执行缓存友好的复制操作,适用于高带宽场景。 2. **`alloc_pages_current` Hook** - 监控 `alloc_pages_current` 调用来源是否来自 `skb_page_frag_refill`。 - 如果命中,则标记当前 CPU 上下文,表示即将发生的页面分配应被定向到特定 NUMA 节点。 3. **`__alloc_pages_nodemask` Hook** - 最核心的拦截点,识别来自 SKB 相关路径的内存分配请求。 - 修改寄存器值,把原本可能根据策略决定的 NUMA 节点改为固定的目标节点。 - 此操作只影响符合条件的分配行为,不会干扰其他正常的内存分配逻辑。 ### 技术细节 - 所有 Hook 均使用 `ftrace` 机制注册并激活。 - 使用了 per-CPU 变量来跟踪调用链状态,保证并发安全性。 - 提供模块参数 `target_node` 为网卡所在的 NUMA 节点,默认为 1。 - 若定义 `DEBUG` 宏,则额外暴露统计接口以监控修改次数,可能对性能有所影响。 ## 编译与安装 ### 编译环境依赖 在开始编译之前,需要确保系统已安装以下组件: - 内核开发包 (kernel-devel 或 linux-headers) - GNU Make 工具 - GCC 编译器 - Bash shell 和基本的 Unix 工具集 ``` sudo yum install kernel-devel make gcc ``` ### 编译步骤 确保已准备好内核开发环境和构建工具: ``` make # 编译 DEBUG 版本 make debug ``` ### 加载模块 通过命令获取网卡所在numa node: ``` cat /sys/class/net//device/numa_node ``` 加载模块 ``` insmod skb_numa_ftrace.ko target_node={网卡所在numa node} ``` 如果没有target_node参数,默认target_node为1。 检查模块是否使能 ``` lsmod | grep skb_numa_ftrace ``` ### 卸载模块 ``` rmmod skb_numa_ftrace ``` 调试与监控(仅限 DEBUG 版本) 当模块在启用 DEBUG 宏的情况下编译后,可以通过如下方式获取统计数据: ``` cat /sys/kernel/skb_numa_force/stats ``` 输出示例: ``` Modify_Count: 123456 ``` 代表有多少次内存分配被成功引导至指定 NUMA 节点。 # 注意事项 1. 本模块应在测试环境中充分验证后再部署生产环境。 2. 不恰当的 target_node 设置可能会导致性能下降而非提升。 3. 确保所使用的内核版本支持 ftrace 和所需的所有函数符号导出。 4. 当前仅支持单网卡(单口或双口bond),对于多网卡环境,暂不支持。 5. 当前在alinux 5.10.x使能了网卡的双网口NOCACHE_COPY(高性能场景能减少一次内存读,对性能影响较大)后,bond双网口后的新网卡的NOCACHE_COPY并不会使能,而且无法手动使能。如果这个问题被fix,则第一个hook是可以去掉的。 6. 模块加载后,即使限制了应用程序的内存分配在某个 numa 节点(比如numactl -m),但skb还是会被强制分配在网卡所在 numa 节点。 # 许可证 本项目遵循 GPL v2 开源许可协议发布。