我正在运行 Linux Mint,版本 19 Tara。
我的电池寿命现在非常糟糕,而且我的风扇一直开着,因为我的计算机在这个 kworker 线程上的 CPU 使用率始终为 70%。这真的开始让我烦恼了。我一开机就运行top
,在我打开一个程序(终端除外)之前,这个进程就已经占用了 70% 的 CPU。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5 root 20 0 0 0 0 I 66.1 0.0 1:27.86 kworker/0:0-kac
当我运行时,它会将 kworker 线程识别为在被调用和htop
之间来回切换。kacpi_notify
kacipid
我尝试编辑 grub,acpi=off
但随后我的系统启动到黑屏,并带有闪烁的下划线,仅此而已。不会启动。
我升级了内核,所以现在运行的是 5.3.0-51-generic。到目前为止,我的研究让我认为我可能需要更新我的 BIOS,但我的计算机制造商只提供 .exe 形式的 BIOS 更新。我已经下载了exe,但我不知道从这里去哪里。
有人能帮帮我吗?
答案1
其他人提供的信息基本上是正确的,但解决方案却不正确。棘手的一点是找到恶意中断,因为它会根据您拥有的硬件而变化,并且在您更新固件/BIOS/等时也可能会发生变化。假设您正在运行 Linux,您可以通过运行以下命令找到它:
grep -Ev "^[ ]*0" /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1
上面的代码片段将查看所有中断,按数字对它们进行排序,并显示计数最高的中断。在我的系统上,输出如下所示:
/sys/firmware/acpi/interrupts/gpe69: 7802639 STS enabled unmasked
您可以通过调整传递给命令的值来增加显示的中断数量head
,但考虑到所涉及的 CPU 使用率,除了一些非常罕见的情况之外,它几乎总是第一行(排序后)。假设您已经识别出有问题的中断,您可以像这样禁用它:
echo disable > /sys/firmware/acpi/interrupts/gpe69
如果您想自动化此过程,您可以简单地创建一个包含以下内容的脚本:
echo disable > $(grep -Ev '^[ ]*0' /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 | awk -F: '{print $1}')
上述版本将要求您以 root 身份运行它。为了避免这种情况,您可以使用:
sudo sh -c "echo disable > $(grep -Ev '^[ ]*0' /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 | awk -F: '{print $1}')"
请注意,如果最高值的中断已被禁用,您将收到错误消息。如果您多次运行上面的代码片段,则可能会发生这种情况。如果发生这种情况,您将看到如下所示的错误:
sh: line 1: echo: write error: Invalid argument
很容易调整grep
表达式来过滤掉已经禁用的中断。不要这样做。如果这样做,那么运行上面的命令可能会禁用一些重要的功能。
最后,在禁用任何中断之前确认这是您的问题可能是明智的。您可以使用下面的一张衬垫来确认问题。它每秒都会打印计数器值。如果这是您的问题,您会看到价值迅速上升:
while true ; do grep -Ev '^[ ]*0' /sys/firmware/acpi/interrupts/gpe?? | sort --field-separator=: --key=2 --numeric --reverse | head -1 ; sleep 1 ; done
在我的系统上,这看起来像这样:
/sys/firmware/acpi/interrupts/gpe69: 7921836 STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe69: 7925137 STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe69: 7928459 EN STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe69: 7931766 STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe69: 7935122 STS enabled unmasked
答案2
我也一直在研究这个问题。我尝试过更改 BIOS 设置和各种调整。我终于找到了这个链接(https://forum.manjaro.org/t/kworker-kacpid-cpu-100/131532)并且它工作了一段时间。由于我一直在 Ubuntu、Mint 和 Win10 之间切换,一旦出现问题,即使我切换/启动到所有操作系统,它也会变得一致。一旦我在 Ubuntu 20 中应用了上述修复程序,它就会在我启动的每个操作系统上消失。
今天,当我用 Mint 19.3 启动时,问题又出现了。我认为由于问题来自于ACPI区域的中断处理,我如何触发ACPI事件以希望“重置”问题?我决定尝试将机器置于“挂起”模式,等待它完成,然后点击鼠标/键盘将其唤醒,看看它是否会更正或重新初始化 ACPI 处理。答对了!当它醒来时,CPU 使用率会立即回落到 5% 以下的范围。
这不仅仅是 Linux 的问题,当它发生时,当我启动到 Windoz 时也会发生。这似乎也不是制造商特定的问题。这可能是一个基本的 PC 架构/设计问题。我怀疑可能是 ACPI 初始化例程导致了 CPU 峰值。在设置 ISR 处理 ACPI 中断时可能存在时序问题,因此当中断发生时,不会处理或重置 INT,从而导致 INT 不断发生。希望这些信息可以为开发人员提供一些新的想法来解决问题。
我还没有对其进行足够长时间的测试,无法说它始终有效,但值得尝试。
最好的问候, 吉姆 C
我的设置:HP Z220、i5-3470、16G DDR3、nVidia Quadro K1200。 Adata 960G SSD + WD 160G ATA HD、连接到 USB 端口的 APC UPS、nVidia Quadro K-1200、IBM Model M 键盘 (1989) 和 PS/2 输入上的 HP 光电鼠标。不是最伟大的,不是为了游戏,而是一个老的可靠的。 ;-)
答案3
要快速找到哪些中断产生噪音:
awk '$4=="unmasked"&&$1>1000{print FILENAME,$0}' /sys/firmware/acpi/interrupts/*
输出可能看起来像这样:
/sys/firmware/acpi/interrupts/gpe0F 616214841 STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe2C 616214418 STS enabled unmasked
/sys/firmware/acpi/interrupts/gpe39 616179116 STS enabled unmasked
要快速屏蔽它们,以便您可以回收一些 CPU 以获得更好的修复:
for F in $(awk '$4=="unmasked"&&$1>1000{print FILENAME}' /sys/firmware/acpi/interrupts/*)
do sudo tee $F <<<mask; done
唷!看看那些平均负载直线下降!现在谈谈真正的问题。首先也是最简单的就是确保您的发行版提供的微代码正在安装。例如,在 Arch 中,这可能是 intel-ucode 或 amd-ucode 软件包,具体取决于您的处理器。 Ubuntu/Debian 软件包名称为 intel-microcode 和 amd64-microcode。如果您使用 CentOS/RHEL 系列,请查找 microcode_ctl 和 linux-firmware。如果您不知道自己拥有哪个处理器品牌,grep vendor_id /proc/cpuinfo
请查明。如果您的发行版有具体说明加载微码,也请务必遵循这些内容。如果没有加载正确的微代码,您可能会出现几个未正确处理的嘈杂 ACPI 中断。重新启动以使引导加载程序配置更改生效。
如果您仍然遇到一两个中断,并且计数器不断攀升,则可能存在一些不受支持或有故障的硬件。查找特定于您拥有的任何不寻常硬件的驱动程序。掩蔽启动时在解决这些硬件问题之前,这可能是您最好的选择。
答案4
谢谢吉姆,很高兴了解这个错误和解决方案,就我而言:
root@HP-6300:/# echo "disable" > /sys/firmware/acpi/interrupts/gpe08
另一款老化但可靠的 HP i5 主力机器。我一直在淘汰 Firefox..!