KDE 解决 GUI 界面卡顿的问题
工作机是一台 Dell 机器,主要配置是 i5 8400,GPU 是核显 Mesa UHD Graphics 630,安装的是 Manjaro Linux,桌面环境是 KDE。因为是工作机,平时下班都是直接锁屏并关闭显示器就回家了;除非放长假或系统大更新,我一般是不会关机或者重启的。除了对我个人而言内存不太足,总体来说 Manjaro Linux 的体验非常不错。
长久以来有个问题一直困扰着我:正常来说 GUI 是以 60 帧进行刷新;但在经过一到两周不关机的情况下,图形界面会变得非常卡顿。在出现这个问题时,拖动窗口时会感到画面跳跃严重;同时 Xorg 在无操作时 CPU 使用率也可以达到单核心的 80%。这个问题只在一些特定配置的电脑上出现。在另一台也是使用 Intel 核显的 Manjaro Linux 机器上就从未出现过。
因为主要表现是 Xorg(也就是 X server)的高 CPU 占用率,我一度以为是 Xorg 本身的问题,但一直找不到其他用户的类似报告。在某次搜索 SO 社区的时候,偶然看见有人提到,在特定情况下,应用程序(X client)侧的 bug 可能会导致 X server 侧的异常内存占用。我因此受到启发,觉得并不是 Xorg 本身的问题,而是某个带界面的应用程序导致的。
机缘巧合之下,在 KDE 的 bug tracker 上找其他东西时,看到了非常符合这个问题的报告:Kwin laggy after pausing and un-pausing compositing
,其中提到暂停后恢复合成(compositing)时,会导致 kwin(KDE 的窗口管理器)卡顿。使用 kwin_x11 --replace
命令重新启动一个 kwin 进程可以绕过这个问题。
但这个命令使用起来不够方便,如果在终端中运行,需要占用一个窗口。加 &
使其运行在后台是可以的。但如果关闭了终端,所有窗口都会失去装饰(窗口标题栏丢失,边缘拖拽区不生效),并且菜单层次、菜单项事件响应、输入框聚焦等都会陷入混乱。这应该是因为终端退出后 kwin 的父进程被提升到其他 pid(变为非 GUI 相关进程的子进程)导致的。此外,这个命令在其他 TTY 中运行是无效的,必须在图形界面运行的 TTY1 中使用。
最后我发现 kwin 实际上是托管给 systemd 的一个用户服务。当遇到卡顿问题时,只要运行 systemctl --user restart plasma-kwin_x11
重启服务即可恢复正常。