Xorg가 CPU를 200% 소비하는 이유

Xorg가 CPU를 200% 소비하는 이유

Gnome3을 사용하는 Ubuntu 18.04 시스템이 있습니다. 17.04에서 업그레이드할 때 NVIDIA 드라이버에 몇 가지 문제가 있습니다. nouvea 및 nvidia 독점 드라이버를 여러 번 정리하고 설치한 후 마침내 독점 드라이버를 성공적으로 설치한 다음 내장 Intel 그래픽 카드를 사용하도록 전환했습니다.

이제 나는 두 개의 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에서 모두 0을 읽는 것 같습니다.

$ 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에 대한 호출과 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

CPU를 200% 소모하는 Xorg 프로그램을 제어하는 ​​gdm-x-session입니다.

이 문제를 해결하는 방법에 대한 제안이 있으십니까? 두 개의 Xorg 인스턴스가 있어야 합니까? Xorg 인스턴스는 어떻게 생성됩니까? 어떤 구성 파일이 이를 제어합니까?

해당 Xorg를 종료하면 Xorg가 하나만 남게 되며 이는 정상적인 양의 CPU를 1~10% 소모하며 컴퓨터를 계속 사용할 수 있습니다.

관련 정보