我有一台相当高端的计算机(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/1045690chmod +x /etc/grub.d/01_acpi
- 更新 grub:
sudo update-grub