スローサムネイルプロセスのデバッグ

スローサムネイルプロセスのデバッグ

サムネイルの作成中に特別なパフォーマンス動作をデバッグしようとしています。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のタイムスタンプを更新し、毎回サムネイルが再び実行されるようにしました。)

  • 同じディレクトリに1つ以上の異なるイメージがあります。

  • 他の画像のファイル名が合わされています今後SVGファイル名。

    (ファイル名が揃っている場合後ろにSVGファイル名を入力すると、1秒以内にサムネイルが生成されます。それ以外の場合は約30秒かかります。 )

他のパズルもあります。内部にstrace丸太、壁時計の時間がシステムコールにかかった時間と一致しないようです。私はeogかつて旗の下を走った。strace-f

-f

fork(2)、vfork(2)、および clone(2) システムコールの結果として現在追跡されているプロセスによって生成されたサブプロセスを追跡します。

私もこの-ffフラグを試しました:

-ff

この-o filenameオプションが適用されると、各プロセストレースは各プロセスの数値プロセスIDに書き込まれますfilename.pidpid

ただし、どちらの場合も、 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-thumbnailereog

    eog子プロセスを作成するために珍しい方法を使用していますか?

  • これを使用してプロセスgdbに接続し、どの機能が時間を費やしているかを確認するにはどうすればよいですか?/usr/bin/gdk-pixbuf-thumbnailer

  • この動作の原因は何ですか?

ベストアンサー1

Web検索キーワードの正しい組み合わせを見つけた後、これは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

おすすめ記事