有时,我会在机器上运行大量编译(和类似操作),大部分情况下无人值守。通常,这些操作需要时不时进行干预,而这种干预需要谷歌搜索。到目前为止一切顺利。
在运行编译时,我注意到 -atop
我的主浏览器进程 ( librewolf
) 将占用 80% 到 140% 的 CPU。我并不特别希望发生这种情况,因为我希望机器尽快完成一些处理。由于这些编译不会产生巨大的内存压力,我认为“暂停”浏览器可能比每次退出并重新启动浏览器更方便。所以,,killall -STOP librewolf
并且 CPU 占用已经消失。
十有八九,这个方法可以完美运行。但还有一次……发生了奇怪的事情。第一次是我的 telegram-desktop IM 客户端挂了。atop
当我激活它时,它会短暂地出现,但随后又回到空闲状态,但不绘制其窗口。当时我偶然拨打了电话killall -CONT librewolf
,Telegram 客户端窗口就弹出来了。当时,我怀疑我的日常驱动程序 LibreWolf 浏览器和基于 Electron 的 Telegram 桌面客户端之间存在某种不愉快的共谋,并把这归咎于“改天再解决这个问题”。
不过,第二个怪异之处则完全不同。在暂停 LibreWolf 一段时间后,atop
正在运行的进程root
停止更新。启动另一个实例atop
会立即挂起。因此,我查看了atop
使用htop
,它显示 CPU 为 100%,正在“运行”。根据此和strace
//proc/<pid>/syscall
等,它并未显示为在内核代码中被阻止。尽管如此,kill -9 <pid>
还是无法摆脱它。在处理这个问题并试图弄清楚我的系统发生了什么时,我偶然注意到 KDE 文件对话框也表现得异常缓慢 - 没有鼠标悬停反馈,单击内容/键入最终会在延迟后起作用。更奇怪的是,我甚至无法losetup -d
/kpartx -d
一个回送安装的磁盘映像 - 所有这些也会挂起。
当时,我还没有考虑过暂停的 LibreWolf 是罪魁祸首——首先,我并没有真正意识到它在那个特定的时间停止了,更重要的是,停止(或调试……)任意用户进程对系统其余部分有什么影响,尤其是这种root
仅此而已的操作?相反,在研究这个问题的时候,显然有一次我想用谷歌,哦,对了,必须killall -CONT librewolf
。哦,这很有趣,现在挂掉atop
和losetup
等等kpartx
都退出。
我无法根据我 90 年代中期基于 BSD 的“Unix 内核如何工作”的知识轻易地向自己解释这一点。事实上,对我来说,这违背了设计原则之一 - 任意用户进程可以做的事情不应该以root
这种方式影响其他用户的进程,更不用说了。这至少是一种本地拒绝服务。
然后,从那里开始,更有用的是:我如何解决这种情况?在更一般的情况下,我如何从“查看”挂起的进程atop
,系统地找出找到暂停librewolf
进程的方法,以便我可以对此采取一些措施?
而且,对日常使用来说更有用:我该如何做,例如暂停 LibreWolf 进程而不会引起这样的副作用?阅读建议的类似问题后,我会尝试看看使用信号是否TSTP
比 表现更好STOP
。
就上下文而言,这是在 amd64 上的当前 gentoo Linux 上,运行 6.1.12 SMP PREEMPT_DYNAMIC 桌面内核。
答案1
这虽然不是我所有问题的答案,但却是当前问题的解决方案。
在进一步挖掘之后(并且在干净重启并且从未暂停过 LibreWolf 之后),我看到了更多奇怪的事情,比如再次atop
不再更新并且kill -9
在负载下挂起,并且当系统相对空闲时,kworker 事件线程占用了整个核心 - 有时在 中可见psi_avgs_work
,其他时候没有堆栈跟踪(或只是在 中worker_thread
)。多次播放 HoloCure(在 wine-vanilla 7.0.1 中)以一种奇怪的方式锁定了我的整个系统 - 它的音乐仍在播放,但整个系统不再对任何东西做出反应,甚至不回复 ping(系统中的现有 ssh 会话也会冻结),甚至不回复 magic-sysrq 序列(!)。
出于直觉,我升级到了内核 6.2.1(从 6.1.2 开始),使用完全相同的内核配置(通过make oldconfig
,所有新选项看起来都与此类问题无关,我接受了少数新选项上看似合理的默认值)。瞧,一切都按我预期的方式运行(再次)。包括能够随意暂停 LW(使用kill -STOP
/ kill -CONT
)和其他“饥饿”进程。
因此,现在我将其归咎于内核 6.1.2 存在问题。
我会把这个留在这里,以便其他可能遇到类似问题的人找到它。
关于如何更有效(且不太直观)地追踪这些问题的具体细节,我的问题仍然存在。