느린 썸네일 프로세스 디버깅

느린 썸네일 프로세스 디버깅

썸네일 생성 중 특별한 성능 동작을 디버깅하려고 합니다.eog, 구체적으로gdk-pixbuf. 재생산할 최소 파일은 다음과 같습니다.

https://github.com/nbeaver/gdk-pixbuf-bug

프로세스 트리는 다음과 같습니다.

systemd,1 splash
  `-plasmashell,4366
      `-konsole,6783
          `-bash,6793
              `-make,6949 reproduce
                  `-eog,6973 /usr/share/doc/docutils-doc/docs/user/images
                      `-bwrap,10071 --ro-bind /usr /usr --ro-bind /bin /bin --ro-bind /lib64 /lib64 --ro-bind /lib /lib --ro-bind /sbin /sbin --proc /proc --dev /dev --chdir / --setenv GIO_USE_VFS local --unshare-all --die-with-parent --bind /tmp/gnome-desktop-thumbnailer-2HUN5Z /tmp --ro-bind /usr/share/doc/docutils-doc/docs/user/images/s5-files.svg /tmp/gnome-desktop-file-to-thumbnail.svg --seccomp 11 /usr/bin/gdk-pixbuf-thumbnailer -s 128 file:///tmp/gnome-desktop-file-to-thumbnail.svg /tmp/gnome-desktop-thumbnailer.png
                          `-bwrap,10074 --ro-bind /usr /usr --ro-bind /bin /bin --ro-bind /lib64 /lib64 --ro-bind /lib /lib --ro-bind /sbin /sbin --proc /proc --dev /dev --chdir / --setenv GIO_USE_VFS local --unshare-all --die-with-parent --bind /tmp/gnome-desktop-thumbnailer-2HUN5Z /tmp --ro-bind /usr/share/doc/docutils-doc/docs/user/images/s5-files.svg /tmp/gnome-desktop-file-to-thumbnail.svg --seccomp 11 /usr/bin/gdk-pixbuf-thumbnailer -s 128 file:///tmp/gnome-desktop-file-to-thumbnail.svg /tmp/gnome-desktop-thumbnailer.png
                              `-gdk-pixbuf-thum,10075 -s 128 file:///tmp/gnome-desktop-file-to-thumbnail.svg /tmp/gnome-desktop-thumbnailer.png

~에서strace통나무/usr/bin/gdk-pixbuf-thumbnailer, 글꼴 파일을 보는 데 약 30초가 걸린 것 같습니다 .

22:44:05 munmap(0x7fd491988000, 20930832) = 0 <0.000558>
22:44:05 openat(AT_FDCWD, "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc", O_RDONLY) = 5 <0.000060>
22:44:05 fcntl(5, F_SETFD, FD_CLOEXEC)  = 0 <0.000014>
22:44:05 fstat(5, {st_mode=S_IFREG|0644, st_size=20930832, ...}) = 0 <0.000013>
22:44:05 mmap(NULL, 20930832, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7fd491988000 <0.000021>
22:44:05 close(5)                       = 0 <0.000011>
22:44:06 munmap(0x7fd491988000, 20930832) = 0 <0.000525>
22:44:06 openat(AT_FDCWD, "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc", O_RDONLY) = 5 <0.000076>
22:44:06 fcntl(5, F_SETFD, FD_CLOEXEC)  = 0 <0.000013>
22:44:06 fstat(5, {st_mode=S_IFREG|0644, st_size=20930832, ...}) = 0 <0.000012>
22:44:06 mmap(NULL, 20930832, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7fd491988000 <0.000023>
22:44:06 close(5)                       = 0 <0.000013>
<snip>
22:44:31 stat("/usr/share/fonts/opentype/stix-word/STIXMath-Regular.otf", {st_mode=S_IFREG|0644, st_size=476872, ...}) = 0 <0.000024>
22:44:31 openat(AT_FDCWD, "/usr/share/fonts/opentype/stix-word/STIXMath-Regular.otf", O_RDONLY) = 5 <0.000026>
22:44:31 fcntl(5, F_SETFD, FD_CLOEXEC)  = 0 <0.000014>
22:44:31 fstat(5, {st_mode=S_IFREG|0644, st_size=476872, ...}) = 0 <0.000013>
22:44:31 mmap(NULL, 476872, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7fd49c26a000 <0.000023>
22:44:31 close(5)                       = 0 <0.000015>

이 동작을 유발하는 특정 SVG가 있습니다. 그러나 SVG에서 실행하는 eog 것만으로는 gdk-pixbuf-thumbnailer충분하지 않습니다. 이 동작은 다음과 같은 상황에서만 발생합니다.

  • eog디렉터리에서 실행합니다.

  • 디렉터리에 아직 축소판이 없는 특정 SVG가 있습니다 ~/.cache/thumbnails/.

    (저는 touchSVG의 타임스탬프를 업데이트하고 매번 썸네일이 다시 실행되도록 했습니다.)

  • 동일한 디렉터리에 하나 이상의 다른 이미지가 있습니다.

  • 다른 이미지의 파일명이 합쳐져 있습니다앞으로SVG 파일 이름.

    (파일명이 정렬되어 있는 경우뒤쪽에SVG 파일 이름을 입력하면 1초 이내에 썸네일이 생성됩니다. 그렇지 않으면 약 30초가 소요됩니다. )

다른 퍼즐도 있습니다. 내부에strace통나무, 벽시계 시간이 시스템 호출에 걸린 시간과 일치하지 않는 것 같습니다. 나는 한때 eog깃발 아래로 달려갔습니다.strace-f

-f

fork(2), vfork(2) 및 clone(2) 시스템 호출의 결과로 현재 추적되는 프로세스에 의해 생성된 하위 프로세스를 추적합니다.

나는 또한 이 -ff플래그를 시도했습니다:

-ff

-o filename옵션이 적용되는 경우 각 프로세스 추적은 각 프로세스의 숫자 프로세스 ID에 기록됩니다 filename.pid.pid

그러나 두 경우 모두 gdk-pixbuf-thumbnailer하위 프로세스의 로그 파일에는 표시되지 않습니다.

gdb또한 실행하는 데 문제가 있어서 gdk-pixbuf-thumbnailer ("대상과 디버거가 서로 다른 PID 네임스페이스에 있음"과 관련하여) 어디에서 멈췄는지 알 수 없습니다.

$ sudo gdb -p 20789
[sudo] password for nathaniel:
<snip>
Error while mapping shared library sections:
Could not open `target:/lib/x86_64-linux-gnu/libbsd.so.0' as an executable file: No such file or directory

warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.

warning: Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable.  Connect to gdbserver inside the container.
(gdb) quit
Detaching from program: target:/newroot/usr/bin/gdk-pixbuf-thumbnailer, process 20789

컨테이너와 관련이 있는 것 같아요 bwrap.

버전 정보:

$ apt-cache policy libgdk-pixbuf2.0-bin eog
libgdk-pixbuf2.0-bin:
  Installed: 2.36.11-2
  Candidate: 2.36.11-2
  Version table:
 *** 2.36.11-2 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status
eog:
  Installed: 3.28.1-1
  Candidate: 3.28.1-1
  Version table:
 *** 3.28.1-1 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status

내 질문은 다음과 같습니다

  • 이 오류가 다른 컴퓨터나 다른 버전에서 재현될 수 있습니까?

    (우분투 18.04를 사용하고 있는데 다른 배포판에서도 이런 일이 발생하는지 알고 싶습니다.)

  • 왜 하위 프로세스로 선택하지 않습니까 strace -f?/usr/bin/gdk-pixbuf-thumbnailereog

    eog하위 프로세스를 생성하기 위해 특이한 방법을 사용하고 있습니까 ?

  • 이것을 사용하여 프로세스 gdb에 연결 하고 어떤 기능에서 시간을 소비하는지 확인하려면 어떻게 해야 합니까 ?/usr/bin/gdk-pixbuf-thumbnailer

  • 이 동작의 원인은 무엇입니까?

답변1

웹 검색 키워드의 올바른 조합을 찾은 후 이것이 2018년 12월 15일에 발생한 오류가 반복된 것이라고 90% 확신합니다.

글꼴 문제로 인해 썸네일 생성 속도가 느림

그래서 SVG 파일을 자동으로 리로드할 때 eog 속도가 느려지는 현상을 조사하고 있는데, 문제는 썸네일 생성에 10초 정도 걸리는 것 같습니다. (매우 작은 SVG의 경우 참고) 보다 구체적으로 말하면 gdk-pixbuf-thumbnailer 글꼴 구성을 찾을 수 없고 글꼴을 보는 데 많은 시간을 소비한다고 불평합니다. --ro-bind /var/cache/fontconfig /var/cache/fontconfigbwrap 매개변수를 추가하면 문제가 해결되었으며 시간은 약 0.2초로 단축되었습니다.

https://gitlab.gnome.org/GNOME/gnome-desktop/issues/90

여기에 언급되어 있습니다 :

...또한 엄청난 속도 저하를 경험했습니다. https://gitlab.gnome.org/GNOME/gnome-desktop/issues/90

https://bugs.launchpad.net/ubuntu/+source/gnome-desktop3/+bug/1795668

수정 사항은 gnome-desktop3.

썸네일: 글꼴 캐시 누락으로 인해 썸네일이 느려지는 문제 수정

일부 배포판에서는 글꼴 캐시가 /usr이 아닌 /var에 있으며, 썸네일을 샌드박싱할 때 /var에 대한 액세스를 허용하지 않습니다. Fontconfig 캐시 디렉토리가 /usr 외부에 있는 경우 읽기 전용으로 바인드 마운트하여 썸네일 시작 속도를 높입니다.

https://gitlab.gnome.org/GNOME/gnome-desktop/merge_requests/25/diffs

gnome-desktop3 버전 3.30 이상에서 수정된 것으로 보이므로 2019년 7월 19일 현재 Ubuntu 19.10(Eoan Ermine, 미출시) 및 19.04(Disco Dingo, 수명 종료 2020-1 달)만 있습니다.

https://launchpad.net/ubuntu/+source/gnome-desktop3

https://launchpad.net/ubuntu/+source/gnome-desktop3/+publishinghistory

내 컴퓨터의 버전 정보:

$ apt-cache policy libgnome-desktop-3-17
libgnome-desktop-3-17:
  Installed: 3.28.2-0ubuntu1.5
  Candidate: 3.28.2-0ubuntu1.5
  Version table:
 *** 3.28.2-0ubuntu1.5 500
        500 http://us.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        100 /var/lib/dpkg/status
     3.28.2-0ubuntu1.3 500
        500 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages
     3.28.1-1ubuntu1 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages

관련 정보