需要帮助分析启动缓慢(华硕 ROG X99,ACPI)

需要帮助分析启动缓慢(华硕 ROG X99,ACPI)

我有一台相当高端的计算机(8 核 i7-6900K、三星 SM961 1TB NVMe、32GB RAM),但启动速度非常慢。

$ systemd-analyze
Startup finished in 21.766s (firmware) + 5.769s (loader) + 16.878s (kernel) + 3.532s (userspace) = 47.947s

我暂时忽略固件和加载器。用户空间部分花费不到四秒,这还不错,但内核耗时 17 秒

我在这里有启动信息:

我有另一台配置类似的机器,配备了另一个主板/芯片组,其启动速度要快得多,所以我怀疑问题出在芯片组/硬件上,但我无法弄清楚是什么问题。

更新 1:我已经升级到 Ubuntu 17.10,但启动时间几乎相同。用户空间缩短至 2 秒(令人印象深刻!),但内核时间超过 15 秒。

我在 dmesg 日志中注意到,一些 ACPI 消息周围有几个时间“跳跃”:

[    0.166049] acpi PNP0A03:03: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI]
[    2.208064] acpi PNP0A03:03: _OSC: platform does not support [PCIeHotplug]
[    4.256069] acpi PNP0A03:03: _OSC: OS now controls [PME AER PCIeCapability]
[    4.256070] acpi PNP0A03:03: FADT indicates ASPM is unsupported, using BIOS configuration

...和:

[    4.262024] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI]
[    6.304065] acpi PNP0A08:00: _OSC: platform does not support [PCIeHotplug]
[    8.352073] acpi PNP0A08:00: _OSC: OS now controls [PME AER PCIeCapability]
[    8.352074] acpi PNP0A08:00: FADT indicates ASPM is unsupported, using BIOS configuration

ACPI 配置是否与内核启动时间缓慢有关?

更新2:添加acpi=off到启动参数后,内核时间从 15 秒减少到 7 秒(其中约 4 秒似乎与在我的 nvme 驱动器上安装 EXT4-fs 有关),因此 ACPI 绝对是一个时间窃贼(约 8 秒)。

但是我并不想完全关闭 ACPI。还有其他与 ACPI 相关的配置可以尝试吗?

答案1

X299 上也有同样的问题,6 年后我们才能找到答案 :)https://xkcd.com/979/

启动缓慢是由于 DSDT 固件中故意设置了一些延迟造成的。每次 _OSC 调用都会延迟 1-2 秒。

            方法 (_OSC,4,NotSerialized) // _OSC:操作系统功能
            {
                创建DWordField(Arg3,0x00,CDW1)
                如果((Arg0 == ToUUID(“33db4d5b-1ff7-401c-9657-7441c03dd766”)/* PCI 主机桥设备 */))
                {
                    创建DWordField(Arg3,0x04,CDW2)
                    如果 ((Arg2 > 0x02))
                    {
                        创建DWordField(Arg3,0x08,CDW3)
                    }

                    SUPP = CDW2 /* \_SB_.PC00._OSC.CDW2 */
                    CTRL = CDW3/*\_SB_.PC00._OSC.CDW3*/
                    如果 ((AHPE || ((SUPP & 0x16) != 0x16)))
                    {
                        CTRL &= 0x1E
                        睡眠(0x03E8)
                    }

                    如果 ((TBSE != 0x00))
                    {
                        CTRL &= 0x1E
                        睡眠(0x03E8)
                    }

解决方案是减少延迟:

  • 提取 DSDT:
    • sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.aml
  • 反编译并分析文件以适应后续命令:
    • iasl dsdt.aml
  • Sleep (0x03E8)将(1s)替换[\x5B\x22\x0B\xE8\x03]Sleep (0x0064)(100ms) [\x5B\x22\x0B\x64\x00]
    • perl -pe 's#\x5B\x22\x0B\xE8\x03#\x5B\x22\x0B\x64\x00#g' dsdt.aml > dsdt2.aml
  • 增加 DSDT 修订版本以优先于内置文件。替换DefinitionBlock ("", "DSDT", 2, "ALASKA", "A M I ", 0x01072009)DefinitionBlock ("", "DSDT", 2, "ALASKA", "A M I ", 0x01072010)
    • perl -pe 's#\x09\x20\x07\x01#\x10\x20\x07\x01#g' dsdt2.aml > dsdt3.aml
  • 安装文件:
    • sudo cp dsdt3.aml /boot/dsdt.aml
  • /etc/grub.d/01_acpi从安装https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1045690
    • chmod +x /etc/grub.d/01_acpi
  • 更新 grub:
    • sudo update-grub

相关内容