https://bugzilla.redhat.com/show_bug.cgi?id=1784650
Bug ID: 1784650 Summary: Fontconfig is slow, causing stuttering and freezing Product: Fedora Version: 31 Status: NEW Component: fontconfig Severity: high Assignee: tagoh@redhat.com Reporter: bepvte+bugzilla@gmail.com QA Contact: extras-qa@fedoraproject.org CC: ajax@redhat.com, caillon+fedoraproject@gmail.com, fonts-bugs@lists.fedoraproject.org, gnome-sig@lists.fedoraproject.org, i18n-bugs@lists.fedoraproject.org, john.j5live@gmail.com, mclasen@redhat.com, pnemade@redhat.com, rhughes@redhat.com, rstrode@redhat.com, sandmann@redhat.com, tagoh@redhat.com Target Milestone: --- Classification: Fedora
Description of problem: Fontconfig is much much slower than on other distros, and it stutters or freezes applications that use it.
Version-Release number of selected component (if applicable):
Name : fontconfig Version : 2.13.92 Release : 3.fc31 Architecture: x86_64
How reproducible: I can reproduce this bug on a fresh Fedora 31 vm with the Xfce desktop and google-noto-sans-* fonts installed.
Steps to Reproduce: 1. dnf install google-noto-sans-* 2. run gedit on the attached example file
alternatively 1. dnf install google-noto-sans-* 2. open firefox and browse to https://www.wikidata.org/wiki/Q52 (page with lots of languages)
Actual results: It takes around 60 seconds for gedit to become responsive to scrolling and input. Mousepad is faster but still slow. It takes firefox upwards of 5 minutes to get to first paint on a page with many fonts or languages, compared to a simpler page.
Expected results: Gedit should load files with many fonts at a similar speed as other distros. The page should load quickly, like on Debian and others.
Additional info: I have tried to diagnose the source of this issue in many ways.
Running `perf trace` on what sysprof indicated was the most busy function (FcStrCmpIgnoreCaseAndDelims), shows that every name of every font family is being compared to every other name of every other font family. I do not know if this is a normal behaviour of fontconfig.
I have noticed the amount of calls to "FcStrCmpIgnoreCaseAndDelims" and program startup time both drop to a similar amount as Debian's when all of the "google-noto" configuration files in /etc/fonts/conf.d/ are deleted (These files are not present in Debian). However, this might not be the source of the problem:
In the Debian vm, with a copy of my computer's /etc/fonts/, including the google-noto files, (I took care to ensure that there would be no broken symlinks) and /usr/share/fonts, fontconfig does not stall any programs. The amount of calls to FcStrCmpIgnoreCaseAndDelims is also much lower as well.
This led me to believe that it was a difference caused by compiler flags but this does not seem to be the case. I tried to replace the optflags in the package, except for the rpmbuild required debug ones, and found no difference. I also checked to ensure that it was not caused by GCC version differences.
Debian results for mousepad:
1,845,449 calls to FcStrCmpIgnoreCaseAndDelims Time: 5 seconds
Fedora results for mousepad:
11,658,380 calls to FcStrCmpIgnoreCaseAndDelims Time: 23 seconds
https://perfht.ml/2tleJxN Here is a link to a Firefox profiler result of the wikidata page, where in the flame graph you can see that Firefox is spending most of its time in fontconfig. You can also see "FirstNonBlankPaint" is at 50 seconds in the marker table.
TLDR: Fontconfig matching is slow with all google-noto fonts installed, unless you remove the noto config files. Using the same exact font directory and config directory (including the noto config files) on Debian does not cause the same problem.
https://bugzilla.redhat.com/show_bug.cgi?id=1784650
--- Comment #1 from bepvte+bugzilla@gmail.com --- https://bugs.chromium.org/p/chromium/issues/detail?id=1025356 Related chromium bug
https://bugzilla.redhat.com/show_bug.cgi?id=1784650
Akira TAGOH tagoh@redhat.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Version|31 |rawhide Doc Type|--- |If docs needed, set a value
--- Comment #2 from Akira TAGOH tagoh@redhat.com --- Somewhat improved in upstream. but not yet making a release. hopefully we will see some improvements on this in f34.
https://bugzilla.redhat.com/show_bug.cgi?id=1784650
Akira TAGOH tagoh@redhat.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Version|34 |35
--- Comment #4 from Akira TAGOH tagoh@redhat.com --- This should be improved in the latest release in f36.
https://bugzilla.redhat.com/show_bug.cgi?id=1784650
bepvte+bugzilla@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |CLOSED Resolution|--- |NEXTRELEASE Last Closed| |2022-03-03 20:53:15
--- Comment #5 from bepvte+bugzilla@gmail.com --- Trying to reproduce this bug in F36 fails, and when I perf trace it I get only 1,478,448 calls to the function that used to be called 10 times as much.
i18n-bugs@lists.fedoraproject.org