Loading... # MacPro6,1 Linux ACPI EC 风暴故障复盘 # 一、事件概述 ## 1. 事件背景 一台 MacPro6,1(Mac Pro Late 2013)安装 Ubuntu 24.04.4 LTS 和 Linux 6.17.0-14 内核后,系统出现异常高负载。 ## 2. 影响范围 ### A. 影响时长 约 3.5 小时,从系统启动到问题定位并修复 ### B. 影响功能 - 系统响应明显迟缓 - Load Average 持续在 20 以上 - CPU 实际使用率仅 8%,但负载居高不下 ### C. 严重程度 P2 级故障(系统性能严重下降,但仍可操作) ## 3. 关键指标 | 指标 | 故障时 | 修复后 | |------|--------|--------| | Load Average | 21.95 | 0.78 | | ACPI 中断数 | 132,230+ | 1 | | kworker 进程数 | 30+ | 3 | | CPU 实际使用率 | 8% | 正常 | # 二、事件时间线 ## 1. 故障发生(16:58) ### A. 现象描述 系统启动后,内核日志开始出现 ACPI 工作队列 CPU 占用警告 ### B. 监控告警 ``` workqueue: acpi_os_execute_deferred hogged CPU for >10000us 4 times ``` ## 2. 问题发展(17:00-20:00) ### A. 症状表现 - Load Average 持续上升,从 2 攀升至 20+ - ACPI 中断数指数级增长:4 → 8,191 → 65,539 - CPU 空闲率 92%,但大量进程处于可运行状态 ### B. 初步调查 - 内存充足(55GB 可用) - I/O Wait 极低(0-0.13%) - 磁盘空间充足(11% 使用率) ## 3. 问题诊断(20:30) ### A. 发现途径 用户报告系统高负载,要求诊断 ### B. 诊断过程 - 检查系统整体状态:Load 19.63,接近 24 核心数 - 分析进程列表:发现大量 kworker/kacpi_notify 线程 - 检查内核日志:确认 ACPI EC 工作队列风暴 - 确认硬件型号:MacPro6,1(已知 Linux 兼容性问题) ## 4. 根因分析(20:35) ### A. 直接原因 ACPI 嵌入式控制器(EC)触发事件风暴,每个 EC 事件处理耗时超过 10ms,导致工作队列积压 ### B. 根本原因 MacPro6,1 的 ACPI EC 实现在 Linux 下存在兼容性问题,EC 事件触发后处理缓慢,形成恶性循环 ## 5. 解决方案实施(20:40) ### A. 临时缓解 设置 EC 事件清除参数(效果有限) ### B. 永久修复 在 GRUB 配置中添加内核参数:acpi_ec_no_waq=1 ec_poll=0 ### C. 实施步骤 1. 备份 GRUB 配置文件 2. 添加 ACPI EC 参数到内核启动参数 3. 运行 update-grub 更新引导配置 4. 重启系统使参数生效 ## 6. 验证结果(20:44) ### A. 立即效果 - Load Average 从 21.95 降至 0.91 - ACPI 中断不再增长 - kworker 进程数恢复正常 ### B. 持续监控 重启后 5 分钟内 ACPI 中断数稳定在 1,无风暴迹象 ```mermaid sequenceDiagram participant S as 系统 participant K as 内核 participant A as ACPI EC participant U as 用户 S->>K: 16:58 启动 K->>A: ACPI 初始化 A-->>K: 开始触发事件 K->>K: workqueue 警告 (4次) Note over S,K: 17:00-18:00 Load 2→10 Note over S,K: 18:00-19:00 Load 10→15 Note over S,K: 19:00-20:00 Load 15→20+ U->>S: 20:30 报告高负载 S->>K: 诊断检查 K->>A: 发现 EC 风暴 U->>S: 20:40 修复实施 S->>K: 添加内核参数 K->>A: acpi_ec_no_waq=1 ec_poll=0 S->>S: 20:44 重启 K->>A: EC 正常工作 A-->>K: 无事件风暴 Note over S,K: Load 降至 0.78 ```  # 三、问题分析 ## 1. 直接原因 ACPI EC(Embedded Controller)在处理事件时耗时过长(>10ms),导致工作队列积压 ## 2. 根本原因(5 Whys 分析) ### A. 为什么出现这个问题? MacPro6,1 的 EC 固件实现与 Linux ACPI 驱动存在兼容性问题,EC 事件处理效率低下 ### B. 为什么 Load Average 这么高但 CPU 使用率低? 大量进程处于 TASK_RUNNING 状态等待 CPU 调度,但由于 kworker 长期占用 CPU 时间片(处理 EC 事件),其他进程无法及时执行 ### C. 为什么是 MacPro6,1 特有问题? Apple 的 EC 实现遵循 ACPI 规范但与标准 Linux 驱动存在细微差异,导致 EC 事件处理路径异常 ### D. 为什么使用 6.17 开发版内核? 开发版内核可能包含未完全测试的 ACPI 相关改动,加剧了兼容性问题 ### E. 如何从根本上解决? 通过内核参数禁用 EC 等待队列机制和轮询模式,绕过有问题的 EC 事件处理路径 ## 3. 技术原理分析 ### A. ACPI EC 工作机制 ```mermaid graph TD A[EC 硬件触发事件] --> B[GPE 中断] B --> C[acpi_os_execute_deferred] C --> D{kworker 处理} D -->|正常| E[处理完成] D -->|超时>10ms| F[工作队列积压] F --> G[更多 kworker 被创建] G --> H[CPU 时间片竞争] H --> F ```  ### B. 内核参数作用 - acpi_ec_no_waq=1:禁用 EC 等待队列,防止事件积压 - ec_poll=0:禁用 EC 轮询模式,改用纯中断驱动 # 四、解决方案 ## 1. 临时方案 ### A. 实施措施 ```bash echo 1 | sudo tee /sys/module/acpi/parameters/ec_event_clearing ``` ### B. 效果评估 效果有限,Load 仍在上升,需重启彻底清理积压 ## 2. 永久方案 ### A. 改进措施 修改 GRUB 配置,添加内核启动参数 ### B. 实施步骤 ```bash # 1. 备份配置 sudo cp /etc/default/grub /etc/default/grub.backup # 2. 编辑 GRUB_CMDLINE_LINUX_DEFAULT,添加: # acpi_ec_no_waq=1 ec_poll=0 # 3. 更新 GRUB sudo update-grub # 4. 重启系统 sudo reboot ``` ### C. 验证方法 ```bash # 检查内核参数是否生效 cat /proc/cmdline | grep -o "acpi_ec_no_waq=1\|ec_poll=0" # 监控 ACPI 中断增长 watch -n 5 'cat /proc/interrupts | grep acpi' # 检查 kworker 数量 ps aux | grep -c "kworker.*acpi" ``` ## 3. 预防措施 ### A. 硬件层面 - Mac 用户运行 Linux 前查询硬件兼容性 - 优先选择经过充分测试的内核版本 ### B. 软件层面 - 生产环境使用 LTS 内核而非开发版 - 建立 ACPI 相关问题的快速诊断流程 ### C. 监控告警 - 设置 Load Average 告警阈值 - 监控 ACPI 中断增长率 # 五、经验总结 ## 1. 做得好的地方 - 系统化诊断思路:从整体到局部,从现象到本质 - 识别硬件兼容性问题:快速定位 MacPro6,1 已知问题 - 完整的修复验证:重启后持续监控确认效果 ## 2. 需要改进的地方 - 初期未能立即识别 ACPI EC 问题特征 - 可以更早检查内核日志中的 workqueue 警告 ## 3. 知识沉淀 ### A. 问题特征识别 - Load 高但 CPU 使用率低 → 可能是内核层面问题 - 大量 kworker 进程 → 检查内核工作队列 - Mac 硬件 + Linux → 优先排查 ACPI 兼容性 ### B. 诊断工具链 ```bash # 基础状态检查 uptime free -h df -h top -bn1 # 中断分析 cat /proc/interrupts # 进程分析 ps aux --sort=-pcpu | head -15 # 内核日志 sudo journalctl -b -k | grep -i "acpi\|workqueue" ``` ### C. 内核参数参考 | 参数 | 作用 | 适用场景 | |------|------|----------| | acpi_ec_no_waq=1 | 禁用 EC 等待队列 | EC 事件风暴 | | ec_poll=0 | 禁用 EC 轮询 | EC 性能问题 | | acpi_osi=! | 禁用 ACPI OSI | BIOS 兼容问题 | *** ## 参考资料 1. [Linux ACPI EC Driver Documentation](https://www.kernel.org/doc/html/latest/firmware-guide/acpi/ecd.html) 2. [Mac Pro Linux Compatibility](https://github.com/Dunedan/mbp-2016-linux) 3. [ACPI Kernel Parameters](https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html) 最后修改:2026 年 04 月 06 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏