gnome-shell 消耗几 GB RAM

You*_*ran 9 gnome ram 20.04

我正在使用 Ubuntu 20.04 ( Linux 5.8.0-48-generic #54~20.04.1-Ubuntu),今天我发现它gnome-shell使用了大量的 RAM

\n
        USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND                                    \n   2365 gdm       20   0   14.7g  11.0g  10.8g S   0.0  35.1 143:54.82 gnome-shell                                \n  76510 youran    20   0 8937064   3.2g   3.0g S   0.0  10.2 123:57.14 gnome-shell\n
Run Code Online (Sandbox Code Playgroud)\n

该服务器有 32GB RAM,但即使没有工作负载也使用了 21GB。

\n
            total        used        free      shared  buff/cache   available\nMem\xef\xbc\x9a        31Gi        21Gi       2.5Gi       1.8Gi       6.7Gi       7.1Gi\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,该服务器已运行 123 天,

\n
$ uptime\n 13:08:18 up 123 days, 22:54,  4 users,  load average: 0.79, 1.19, 1.00\n
Run Code Online (Sandbox Code Playgroud)\n

所以我认为存在一些内存泄漏。我知道重新启动可以解决这个问题。但是,我想知道为什么,因为 Linux 用户不应该总是重新启动计算机。我的 gnome 版本是

\n
$ gnome-shell --version\nGNOME Shell 3.36.7\n
Run Code Online (Sandbox Code Playgroud)\n

相关问题:

\n\n

hey*_*ema 12

内存泄漏是 gnome-shell 的一个已知问题(bug)。

三种解决方法...

  1. 使用 Wayland 代替 X11/xorg。(在登录屏幕上进行更改)。

  2. 在 X11/xorg 中,使用ALT+重新启动 gnome-shell F2,然后使用“r”,然后使用ENTER

  3. 更新到较新版本的 Ubuntu。


Mor*_*s0x 6

为了自动化@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()'
Run Code Online (Sandbox Code Playgroud)

同样的事情,但有一个使用 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()'"
Run Code Online (Sandbox Code Playgroud)

检查当前的 DISPLAY 环境变量是什么,并根据需要更改 cron 作业 ( echo $DISPLAY)。
如果您的 UID 不是 1000,请将 XDG_RUNTIME_DIR 修改为您的 UID(使用id命令获取您的 UID)。

有了这个,我几乎从来没有注意到内存泄漏(16GB RAM)。