我正在使用 Ubuntu 20.04(Linux 5.8.0-48-generic #54~20.04.1-Ubuntu
),今天我发现它gnome-shell
占用了大量的内存
USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
2365 gdm 20 0 14.7g 11.0g 10.8g S 0.0 35.1 143:54.82 gnome-shell
76510 youran 20 0 8937064 3.2g 3.0g S 0.0 10.2 123:57.14 gnome-shell
该服务器有 32GB 的 RAM,但即使没有工作负载也使用了 21GB。
total used free shared buff/cache available
Mem: 31Gi 21Gi 2.5Gi 1.8Gi 6.7Gi 7.1Gi
请注意,该服务器已运行 123 天,
$ uptime
13:08:18 up 123 days, 22:54, 4 users, load average: 0.79, 1.19, 1.00
所以我认为存在一些内存泄漏。我知道重新重启可以解决这个问题。但是,我想知道为什么,因为 Linux 用户不应该总是重启他们的电脑。我的 gnome 版本是
$ gnome-shell --version
GNOME Shell 3.36.7
相关问题:
- 在Gnome-shell 占用大量内存
,接受的答案建议禁用 gnome 扩展,但我没有任何启用的扩展。
$ gnome-extensions list desktop-icons@csoriano [email protected] [email protected] $ gnome-extensions list --enabled $
答案1
内存泄漏是 gnome-shell 的一个已知问题(bug)。
三种解决方法...
使用 Wayland 而不是 X11/xorg。(在您的登录屏幕上更改)。
在 X11/xorg 中,使用ALT+ F2,然后按“r”,然后按重新启动 gnome-shell ENTER。
更新到较新版本的 Ubuntu。
答案2
为了自动化提到的解决方法@heynnema我创建了一个每晚运行的 cron 任务。以普通用户身份
运行crontab -e
并添加以下行:
20 4 * * * DISPLAY=:1 XDG_RUNTIME_DIR=/run/user/1000 dbus-send --type=method_call --print-reply --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'global.reexec_self()'
同样的事情,但是使用 gnome-terminal 的确认窗口以防我熬夜并且不想被打扰:
20 4 * * * DISPLAY=:1 XDG_RUNTIME_DIR=/run/user/1000 gnome-terminal --window -- /bin/bash -c "read -t 10 -p 'gnome-shell will be reloaded in ten seconds, HIT ENTER TO ABORT!' || dbus-send --type=method_call --print-reply --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'global.reexec_self()'"
检查您当前的 DISPLAY 环境变量是什么,并根据需要更改 cron 作业(echo $DISPLAY
)。
如果您的 UID 不是 1000,请使用您的 UID 修改 XDG_RUNTIME_DIR(使用命令id
获取您的 UID)。
这样,我几乎就不会注意到内存泄漏(使用 16GB RAM)。