收起左侧

QNAP TS-453mini ACPI 中断风暴问题分析与解决方案报告

0
回复
26
查看
[ 复制链接 ]

4

主题

20

回帖

0

牛值

江湖小虾

QNAP TS-453mini ACPI 中断风暴问题分析与解决方案报告

设备型号:QNAP TS-453mini(Intel Celeron J3455, Apollo Lake)
系统环境:飞牛 FNOS(基于 Debian 的 NAS 系统)
内存配置:16GB(升级后用于运行 Docker、虚拟机等服务)
问题现象:系统空闲时 CPU 占用异常高(irq/9-acpi 进程持续占用 90%+ CPU)


一、发现问题

🔍 初始症状

  • 系统在无负载情况下,CPU 使用率长期高于 90%
  • top 命令显示高占用进程为:
    PID USER  PR NI %CPU COMMAND
    ... root  20  0 92.3 irq/9-acpi
    
  • 系统响应变慢,温度升高,功耗增加

📊 初步诊断

通过检查 ACPI 中断计数器,发现异常高频事件:

cat /sys/firmware/acpi/interrupts/sci
# 输出示例:10168315     STS enabled      unmasked

cat /sys/firmware/acpi/interrupts/gpe39
# 输出示例:10168315     STS enabled      unmasked

说明gpe39 在 1 小时内被触发超过 1000 万次(≈2770 次/秒),远超正常水平(应为 0 或偶发)。


二、分析问题

🧩 根本原因

该问题是典型的 ACPI 中断风暴(ACPI Interrupt Storm),具体成因如下:

层级 原因
硬件平台 Intel Apollo Lake(J3455)芯片组的 USB 3.0 xHCI 控制器或 SATA PHY 存在电源管理缺陷
固件缺陷 QNAP 官方 BIOS 未正确处理 GPE39 事件,在 DSDT 表中未屏蔽无效中断源
系统差异 QNAP 官方 QTS 系统通过内核参数隐藏此问题,但通用 Linux(如 FNOS)暴露了底层 bug
触发条件 系统空闲时,硬件错误地反复触发 GPE39 → 内核每秒处理数千次 IRQ 9 → CPU 被耗尽

关键结论

  • 问题 非软件 bug,而是 硬件 + 固件缺陷
  • 屏蔽 GPE39 是社区标准做法,对 NAS 功能无影响

三、解决问题

🎯 解决目标

  1. 立即停止中断风暴,恢复 CPU 正常占用
  2. 永久生效,避免重启后复发
  3. 精准屏蔽,仅禁用问题中断源(gpe39),保留其他 ACPI 功能

✅ 最终解决方案:使用 /etc/rc.local 自启脚本

为什么不用 systemd 服务?
在 FNOS 等嵌入式系统中,/sys/firmware/acpi/interrupts/ 目录初始化较晚,systemd 服务常因文件未就绪而失败。
rc.local 在所有本地文件系统挂载后执行,100% 可访问该文件。


🔧 完整操作命令(一键复制执行)

# 1. 清理可能存在的旧服务(安全无害)
sudo systemctl disable --now disable-gpe39.service 2>/dev/null
sudo rm -f /etc/systemd/system/disable-gpe39.service
sudo systemctl daemon-reload

# 2. 创建智能 rc.local 脚本(带状态检测,避免重复写入错误)
sudo tee /etc/rc.local <<'EOF'
#!/bin/bash
# Wait for gpe39 to appear and disable it safely
for i in {1..60}; do
    if [ -f /sys/firmware/acpi/interrupts/gpe39 ]; then
        # Check current status to avoid "Invalid argument" error
        current_status=$(grep -o 'disabled\|enabled' /sys/firmware/acpi/interrupts/gpe39 | head -n1)
        if [ "$current_status" != "disabled" ]; then
            echo "disable" > /sys/firmware/acpi/interrupts/gpe39
            logger "[FIX] Disabled gpe39 to stop ACPI interrupt storm"
        else
            logger "[INFO] gpe39 already disabled"
        fi
        exit 0
    fi
    sleep 1
done
logger "[ERROR] gpe39 not found after 60 seconds!"
exit 1
EOF

# 3. 赋予执行权限
sudo chmod +x /etc/rc.local

# 4. 启用 rc-local 服务(兼容 FNOS)
sudo systemctl enable rc-local --now 2>/dev/null || {
    sudo tee /etc/systemd/system/rc-local.service <<'EOL'
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileI**ecutable=/etc/rc.local
After=local-fs.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOL
    sudo systemctl daemon-reload
    sudo systemctl enable --now rc-local
}

# 5. 立即应用修复(无需重启)
sudo /etc/rc.local

# 6. 验证结果
echo "=== gpe39 状态 ==="
cat /sys/firmware/acpi/interrupts/gpe39
echo -e "\n=== CPU 占用(关注 idle%)==="
top -bn1 | head -10

✅ 预期输出验证

1. gpe39 状态(应包含 disabled):

10168315     STS disabled     unmasked

2. CPU 空闲率(idle 应 > 90%):

%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

3. 无 irq/9-acpi 进程:

ps aux | grep "irq/9"
# 应无输出,或 CPU% = 0.0

四、附加优化建议(可选)

🌬️ 如果 coolercontrold 持续高占用(TS-453mini 无风扇!)

# 禁用不必要的风扇控制服务
sudo systemctl stop coolercontrold
sudo systemctl disable coolercontrold

📝 向 QNAP / 飞牛反馈(推动官方修复)

提供以下信息给厂商:

sudo dmidecode -t baseboard          # 主板型号
sudo dmidecode -s bios-version       # BIOS 版本
dmesg | grep -i "acpi.*gpe39"        # 内核错误日志
cat /proc/interrupts | grep " 9:"    # IRQ 9 计数

五、总结

项目 说明
问题类型 硬件固件级 ACPI 中断风暴(GPE39)
影响范围 所有基于 Apollo Lake 的 QNAP 设备(TS-453b/mini/Be)运行通用 Linux 时
解决方案 通过 rc.local精准屏蔽 gpe39
安全性 ✅ 对 NAS 功能无任何影响(电源/硬盘/USB 均正常)
持久性 ✅ 永久生效,重启不丢失
社区验证 ✅ Proxmox/UnRAID/Debian 用户广泛采用

附:关键原理图解

[硬件缺陷] → 错误触发 GPE39 → [内核] → 处理 IRQ 9 (irq/9-acpi) → [CPU] → 100% 占用  
                      ↓  
           [屏蔽 gpe39] → 中断通道切断 → CPU 恢复空闲
收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则