我有一个使用 Gnome3 的 Ubuntu 18.04 系统。从 17.04 升级时,我的 NVIDIA 驱动程序遇到了一些问题。经过几次清理和安装 nouvea 和 nvidia 专有驱动程序后,我终于成功安装了专有驱动程序,然后切换到使用内置英特尔显卡。
我现在注意到我正在运行两个 Xorg 程序,一个由 gdm 拥有,另一个由我的用户帐户 dannas 拥有。
$ ps aux | grep Xorg
gdm 1105 187 0.2 263204 35868 tty1 Rl+ 07:26 8:49 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/128/gdm/Xauthority -background none -noreset -keeptty -verbose 3
dannas 1476 1.6 1.1 899048 182292 tty2 Sl+ 07:26 0:04 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
gdm拥有的那个消耗大量的cpu。
$ pidstat -p 1105 1 | head
Linux 4.15.0-23-generic (dannas--dell-xp-15) 06/20/2018 _x86_64_ (8 CPU)
07:29:02 AM UID PID %usr %system %guest %wait %CPU CPU Command
07:29:03 AM 128 1105 94.00 100.00 0.00 0.00 100.00 7 Xorg
07:29:04 AM 128 1105 99.00 100.00 0.00 0.00 100.00 7 Xorg
07:29:05 AM 128 1105 86.00 100.00 0.00 1.00 100.00 7 Xorg
07:29:06 AM 128 1105 99.00 100.00 0.00 0.00 100.00 7 Xorg
07:29:07 AM 128 1105 86.00 100.00 0.00 0.00 100.00 7 Xorg
07:29:08 AM 128 1105 100.00 99.00 0.00 0.00 100.00 1 Xorg
07:29:09 AM 128 1105 93.00 100.00 0.00 0.00 100.00 1 Xorg
它似乎从 fd 16 读取全零。
$ sudo strace -ttt -p 1105 2>&1 | head
strace: Process 1105 attached
1529472961.641488 read(16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 40) = 36
1529472961.641525 epoll_wait(4, [{EPOLLIN, {u32=445731056, u64=94777489051888}}], 256, -1) = 1
1529472961.641547 read(16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 40) = 40
1529472961.641568 epoll_wait(4, [{EPOLLIN, {u32=445731056, u64=94777489051888}}], 256, -1) = 1
1529472961.641588 read(16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 40) = 29
1529472961.641609 epoll_wait(4, [{EPOLLIN, {u32=445731056, u64=94777489051888}}], 256, -1) = 1
1529472961.641627 read(16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 40) = 28
1529472961.641647 epoll_wait(4, [{EPOLLIN, {u32=445731056, u64=94777489051888}}], 256, -1) = 1
1529472961.641666 read(16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 40) = 27
当我附加 gdb 时,除了调用 epoll_wait 和 read 以及诸如 BlockHandler 和 WaitForSomething 和 WaitForSomething 之类的通用名称之外,我在回溯中没有看到任何内容。
文件描述符 16 是一个管道...
$ sudo ls -l /proc/1105/fd | grep 16
lr-x------ 1 gdm gdm 64 Jun 20 07:27 16 -> pipe:[29836]
它连接到同一个 Xorg 程序(?)。
$ (sudo find /proc -type l | sudo xargs ls -l | fgrep 'pipe:[29836]') 2>/dev/null
lr-x------ 1 gdm gdm 64 Jun 20 07:27 /proc/1105/fd/16 -> pipe:[29836]
l-wx------ 1 gdm gdm 64 Jun 20 07:27 /proc/1105/fd/17 -> pipe:[29836]
在journalctl输出的末尾我看到
Jun 20 07:48:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (WW) modeset(0): flip queue failed: Permission denied
Jun 20 07:48:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (WW) modeset(0): Page flip failed: Permission denied
Jun 20 07:48:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (EE) modeset(0): present flip failed
Jun 20 07:49:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (WW) modeset(0): flip queue failed: Permission denied
Jun 20 07:49:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (WW) modeset(0): Page flip failed: Permission denied
Jun 20 07:49:00 dannas--dell-xp-15 /usr/lib/gdm3/gdm-x-session[1103]: (EE) modeset(0): present flip failed
这是控制消耗 200% cpu 的 Xorg 程序的 gdm-x-session。
关于如何进行故障排除有什么建议吗?预计应该有两个 Xorg 实例吗? Xorg 实例是如何创建的?哪个配置文件控制它们?
如果我杀死那个 Xorg,那么只剩下一个 Xorg,它消耗正常数量的 cpu 1-10%,我可以继续使用我的计算机。