썸네일 생성 중 특별한 성능 동작을 디버깅하려고 합니다.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/
.(저는
touch
SVG의 타임스탬프를 업데이트하고 매번 썸네일이 다시 실행되도록 했습니다.)동일한 디렉터리에 하나 이상의 다른 이미지가 있습니다.
다른 이미지의 파일명이 합쳐져 있습니다앞으로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-thumbnailer
eog
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/fontconfig
bwrap 매개변수를 추가하면 문제가 해결되었으며 시간은 약 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