我正在尝试在缩略图生成过程中调试一种特殊的性能行为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 文件名之后排序,它会在不到一秒的时间内生成缩略图。否则大约需要 30 秒。)
还有一些其他的谜题。在strace
日志中,挂钟时间似乎与系统调用所花费的时间不匹配。我已经在旗帜eog
下奔跑:strace
-f
-f
由于 fork(2)、vfork(2) 和 clone(2) 系统调用由当前跟踪的进程创建,因此跟踪子进程。
我也尝试过这个-ff
标志:
-ff
如果该
-o filename
选项有效,则每个进程跟踪都将写入每个进程 的数字进程 IDfilename.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
我的问题是:
这个错误可以在其他机器和其他版本上重现吗?
(我碰巧使用的是 Ubuntu 18.04,但我想知道这是否发生在其他发行版上。)
为什么不 作为子进程
strace -f
拾取?/usr/bin/gdk-pixbuf-thumbnailer
eog
是否
eog
使用不寻常的方法来创建子进程?如何使用
gdb
附加到/usr/bin/gdk-pixbuf-thumbnailer
流程并查看它花费时间的功能?什么可能导致这种行为?
在找到正确的网络搜索关键字组合后,我 90% 确定这是 2018 年 12 月 15 日此错误的重复:
https://gitlab.gnome.org/GNOME/gnome-desktop/issues/90
这里提到:
https://bugs.launchpad.net/ubuntu/+source/gnome-desktop3/+bug/1795668
修复是
gnome-desktop3
.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
我的机器的版本信息: