hotplug运行流程

本文探讨了 Linux 系统中 Hotplug 事件处理机制的关键组件,包括 uevent 的触发方式,以及系统如何通过 netlink 进行消息传递。文章还提到了用于设备注册的关键函数 device_add,并解释了其在设备添加过程中的作用。

1;事件发生 uevent

2;/proc/sys/kernel/hotplug

3;/sbin/hotplug

4;/etc/hotplug.d/default/default.hotplug


netlink

可能用到的函数:

device_add(struct device *dev)

kobject_uevent(&dev->kobj, KOBJ_ADD)

<think>我们正在讨论内存热插拔(Memory Hotplug)技术。根据引用内容,内存热插拔允许在系统运行时动态添加或移除物理内存,而无需重启系统。以下将详细介绍其原理、配置和使用方法。 --- ### 一、内存热插拔简介 **定义**:内存热插拔指在操作系统运行期间动态增加或减少物理内存容量的能力,分为: - **热添加(Hot-add)**:运行时插入内存模块 - **热移除(Hot-remove)**:运行时移除内存模块 **核心价值**: 1. **高可用性**:服务器无需停机即可扩展内存 2. **资源优化**:按需分配内存资源(尤其虚拟化环境) 3. **故障恢复**:隔离故障内存模块[^2] --- ### 二、内核配置要求 根据引用[1],启用内存热插拔需编译以下内核选项: ```plaintext # 基础支持 CONFIG_SPARSEMEM=y # 稀疏内存模型(必选) CONFIG_MEMORY_HOTPLUG=y # 内存热添加支持 # 热移除支持 CONFIG_MEMORY_HOTREMOVE=y # 内存热移除 CONFIG_MIGRATION=y # 页面迁移(用于内存移除时数据转移) # ACPI相关(x86架构常见) CONFIG_ACPI_HOTPLUG_MEMORY=y # ACPI内存热插拔 CONFIG_ACPI_CONTAINER=y # ACPI容器驱动(支持NUMA节点热插拔) ``` > **验证配置**: > ```bash > grep -E 'CONFIG_SPARSEMEM|CONFIG_MEMORY_HOTPLUG|CONFIG_MEMORY_HOTREMOVE|CONFIG_MIGRATION|CONFIG_ACPI_HOTPLUG_MEMORY|CONFIG_ACPI_CONTAINER' /boot/config-$(uname -r) > ``` --- ### 三、操作流程 #### 1. 热添加内存 **步骤**: 1. 物理插入内存模块(支持热插拔的硬件) 2. ACPI固件发送通知给操作系统[^5] 3. 内核扫描新增内存并创建`/sys/devices/system/memory/memoryX`目录 4. **手动上线内存**: ```bash # 查看新增内存块(状态为offline) ls /sys/devices/system/memory/ | grep memory # 上线指定内存块(如memory42) echo online > /sys/devices/system/memory/memory42/state ``` > 执行后系统可用内存增加[^3] #### 2. 热移除内存 **前提条件**: - 目标内存必须处于`offline`状态 - 内存内容已迁移至其他区域(需`CONFIG_MIGRATION=y`) **步骤**: ```bash # 1. 下线内存块 echo offline > /sys/devices/system/memory/memory42/state # 2. 物理移除内存模块 ``` > **注意**:若内存页被使用,需先迁移数据: > ```bash > # 强制迁移(可能失败) > echo offline_movable > /sys/devices/system/memory/memory42/state > ``` --- ### 四、虚拟化环境应用(QEMU/KVM) 引用[4]指出QEMU通过`maxmem`参数支持内存热插: ```bash # 启动虚拟机:初始内存1GB,最大支持2GB qemu-system-x86_64 -m 1024,maxmem=2048 ... ``` **热添加操作**: 1. QEMU Monitor中添加内存设备: ```plaintext (qemu) object_add memory-backend-ram,id=mem1,size=1G (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 ``` 2. 客户机内上线新增内存(同物理机步骤) --- ### 五、技术限制与注意事项 | **场景** | **约束条件** | |------------------------|-----------------------------------------------------------------------------| | **物理机热添加** | 依赖硬件和固件支持(ACPI PNP0C80)[^5] | | **物理机热移除** | 需确保内存区域完全空闲(否则迁移失败) | | **虚拟化热插拔** | 需客户机内核支持(CONFIG_MEMORY_HOTPLUG) | | **NUMA架构** | 热插拔可能改变NUMA拓扑,需同步调整任务调度 | | **性能影响** | 热移除触发内存迁移,可能短暂增加系统负载 | > **最佳实践**: > - 生产环境操作前在测试机验证 > - 使用`numactl`绑定进程到指定NUMA节点 > - 监控`/proc/meminfo`和`/sys/devices/system/memory/`状态 --- ### 六、故障排查 **常见问题**: 1. **无法上线内存**: - 检查`dmesg | grep memory`输出 - 确认ACPI事件是否触发(`acpid`服务状态) 2. **热移除失败**: - 使用`cat /sys/devices/system/memory/memory42/removable`确认是否可移除 - 通过`cat /proc/pageinfo`检查内存页使用情况 §§相关问题§§ 1. 如何监控内存热插拔事件? 2. Linux内存热插拔与CPU热插拔有何协同关系? 3. 在容器环境中如何使用内存热插拔? 4. 热插拔内存如何影响透明大页(THP)配置? </think> ### Linux 内存热插拔(Memory Hotplug)详解 内存热插拔(Memory Hotplug)允许在系统**不停机**的情况下动态添加或移除物理内存,是服务器、虚拟化等高可用场景的核心技术。以下从原理到实践全面解析: --- ### 一、核心概念与原理 1. **热添加(Hot-add)** - 运行时插入新内存模块 - 内核自动识别并注册到内存管理子系统 - 通过 ACPI(高级配置与电源接口)接收固件通知(`PNP0C80`设备)[^5] ```bash dmesg | grep -i acpi # 查看ACPI事件 ``` 2. **热移除(Hot-remove)** - 需**先迁移数据**到其他内存区域 - 依赖内核页迁移机制(Page Migration)[^1] - 物理移除前需确保内存块完全离线 3. **内存单元划分** - 以 **SPARSEMEM 稀疏内存模型**管理内存块 - 每个热插拔单元对应 `/sys/devices/system/memory/memoryX` 目录 ```bash ls /sys/devices/system/memory/ # 查看所有内存块 ``` --- ### 二、启用条件(内核配置) 根据引用[1],必须编译以下选项: | **配置项** | **作用** | **检查命令** | |----------------------------|------------------------------|---------------------------------------| | `CONFIG_SPARSEMEM=y` | 稀疏内存模型(必需基础) | `grep CONFIG_SPARSEMEM /boot/config-$(uname -r)` | | `CONFIG_MEMORY_HOTPLUG=y` | 启用内存热添加 | | | `CONFIG_MEMORY_HOTREMOVE=y`| 启用内存热移除 | | | `CONFIG_MIGRATION=y` | 页迁移支持(热移除必需) | | | `CONFIG_ACPI_HOTPLUG_MEMORY=y` | ACPI内存热插拔支持 | | | `CONFIG_ACPI_CONTAINER=y` | NUMA节点热插拔支持(可选) | | > 💡 **验证命令**: > ```bash > # 检查当前内核配置 > zcat /proc/config.gz | grep -E 'SPARSEMEM|HOTPLUG|MIGRATION' > ``` --- ### 三、操作实战指南 #### 1. **热添加内存** **步骤**: 1. 物理插入内存模块(支持热插拔的服务器) 2. 内核自动检测新内存,创建 `/sys/devices/system/memory/memoryX` 3. **手动上线内存**: ```bash echo online > /sys/devices/system/memory/memoryXXX/state # ``` ```bash # 示例:上线 memory5 echo online > /sys/devices/system/memory/memory5/state ``` 4. 验证: ```bash free -h # 查看总内存增加 ``` #### 2. **热移除内存** **前提**:目标内存必须为 **offline 状态**且**数据已迁移** **步骤**: ```bash # 1. 下线内存块 echo offline > /sys/devices/system/memory/memory5/state # 2. 物理移除内存模块 ``` > ⚠️ **注意**: > - 若内存页被使用,需先触发迁移: > ```bash > echo offline_movable > /sys/devices/system/memory/memory5/state > ``` > - 检查是否可移除: > ```bash > cat /sys/devices/system/memory/memory5/removable # 返回1表示可移除 > ``` --- ### 四、虚拟化中的应用(QEMU/KVM) 引用[4]说明QEMU通过 `maxmem` 参数支持内存热插拔: ```bash # 启动虚拟机:初始1GB,最大支持2GB qemu-system-x86_64 -m 1024,maxmem=2048 ... ``` **热添加操作**: 1. QEMU Monitor 添加内存设备: ```plaintext (qemu) object_add memory-backend-ram,id=mem1,size=1G (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 ``` 2. 客户机内上线新内存(同物理机操作) --- ### 五、关键技术细节 1. **ACPI交互流程** ```mermaid graph LR A[插入内存] --> B[固件发送ACPI通知] B --> C[内核ACPI处理器] C --> D[调用hotplug udev脚本] D --> E[注册新内存区域] ``` 2. **内存状态机** | **状态** | 描述 | 转换命令 | |--------------|--------------------------|---------------------------| | `offline` | 内存不可用 | `echo offline > state` | | `online` | 内存可用 | `echo online > state` | | `online_movable` | 可迁移页(热移除用) | `echo online_movable > state` | 3. **物理地址限制** - 热添加内存的物理地址需在 `ZONE_NORMAL` 或 `ZONE_MOVABLE` 区域 - 可通过 `/sys/devices/system/memory/probe` 手动触发扫描: ```bash echo 0x60000000 > /sys/devices/system/memory/probe # 扫描指定地址 ``` --- ### 六、故障排查 1. **内存无法上线** - 检查内核配置是否缺失 `CONFIG_MEMORY_HOTPLUG` - 查看内核日志:`dmesg | grep memory` - 确认物理地址未冲突 2. **热移除失败** - 确保无进程占用目标内存: ```bash # 查找占用memory5的进程 grep memory5 /proc/*/numa_maps ``` - 检查 `CONFIG_MIGRATION=y` 是否启用 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值