Closed
Bug 1373408
Opened 7 years ago
Closed 6 years ago
make nsIUpdateTimerManager support idle dispatch
Categories
(Toolkit :: General, enhancement, P3)
Toolkit
General
Tracking
()
Tracking | Status | |
---|---|---|
firefox63 | --- | fixed |
People
(Reporter: ehsan.akhgari, Assigned: mconley)
References
Details
(Keywords: perf, Whiteboard: [fxperf:p1])
Attachments
(1 file)
https://searchfox.org/mozilla-central/rev/20d16dadd336e0c6b97e3e19dc4ff907744b5734/toolkit/mozapps/extensions/addonManager.js#135
It needs to be ported to use idle dispatch instead.
See this profile, for example: <https://perf-html.io/public/69f88e5a6c6ef339dfaa0442932e075f690f1bea/calltree/?implementation=js&range=1.4816_2.4332~1.7767_2.1714&thread=0>
Reporter | ||
Updated•7 years ago
|
Whiteboard: [qf]
Comment 1•7 years ago
|
||
Copied from the bug where I noticed this:
> Also interesting is the amount of time on MainThread all the cert checks take. Thank you, NSS.
> thoughts? [snip] And should we file a bug on NSS and update manager/etc to see if we can move some of this stuff off mainthread? (or is there one?)
Comment 2•7 years ago
|
||
Now that we have bug 1353206, is it possible to fix this? (I hear you were discussing options with Ehsan, hence the needinfo :)
Flags: needinfo?(rhelmer)
Whiteboard: [qf] → [qf:p1]
Comment 3•7 years ago
|
||
(In reply to Andrew Overholt [:overholt] from comment #2)
> Now that we have bug 1353206, is it possible to fix this? (I hear you were
> discussing options with Ehsan, hence the needinfo :)
I think so... the addons (which incl. blocklist, gmp, addons) and also the app update timer use nsIUpdateTimerManager, so it probably makes the most sense to have this use requestIdleCallback somehow.
I have ideas for moving update timers out of the main process but the above is the most expedient.
Flags: needinfo?(rhelmer)
Updated•7 years ago
|
Assignee: nobody → rhelmer
Status: NEW → ASSIGNED
Comment 4•7 years ago
|
||
(In reply to Randell Jesup [:jesup] from comment #1)
> Copied from the bug where I noticed this:
> > Also interesting is the amount of time on MainThread all the cert checks take. Thank you, NSS.
> > thoughts? [snip] And should we file a bug on NSS and update manager/etc to see if we can move some of this stuff off mainthread? (or is there one?)
I don't think there is a bug for this (yet!). For add-on updates, the addons manager code does its own signature verification from JS in XPIInstall.jsm for XPI (JAR) files and directories using nsIX509CertDB.
From a quick look at the app update code I *think* the signature verification of the content itself (the MAR) is done by the standalone updater binary and not from JS, so I wouldn't expect that issue there.
Was this with a clean profile or is it one you have add-ons installed in?
What I suspect you're seeing isn't specific to updates, but the signature verification of existing add-ons that happens shortly after startup (which happens this way to avoid impacting startup time...)
Flags: needinfo?(rjesup)
Comment 5•7 years ago
|
||
> Was this with a clean profile or is it one you have add-ons installed in?
These are clean profiles from QFlow profiling, or should be
> What I suspect you're seeing isn't specific to updates, but the signature
> verification of existing add-ons that happens shortly after startup (which
> happens this way to avoid impacting startup time...)
Very likely yes, and profiling procedure is typically "start the browser. Do X. Shut it down, Start it again, start profiling, do X" so that would trigger this.
Flags: needinfo?(rjesup)
Comment 6•7 years ago
|
||
The profile in this bug seems to be all about blocklist check... waiting until the user is idle makes sense in any case, but just looking at the code in this stack we can make some improvements here. That can happen in a separate bug though.
Adjusting the summary slightly so it's clearer what needs to change here - technically a bunch of things run off the add-ons timer, but it's not the only timer, so I think we should implement this in the underlying update timer manager.
Component: Add-ons Manager → General
Summary: Add-on manager updater runs off of a timer → make nsIUpdateTimerManager support idle dispatch
Comment 7•7 years ago
|
||
(In reply to :Ehsan Akhgari (needinfo please, extremely long backlog) from comment #0)
> See this profile, for example:
> <https://perf-html.io/public/69f88e5a6c6ef339dfaa0442932e075f690f1bea/
> calltree/?implementation=js&range=1.4816_2.4332~1.7767_2.1714&thread=0>
Hm. So leaving aside the idle dispatch question, there are a few things going on in this profile that need to be fixed:
1) The blocklist status check is obscenely expensive, and we do it every time we access the blocklistState getter, which we do *twice* in the escapeAddonURI function for each add-on. That adds up to 85ms per update check. We should only ever need to check the blocklist when an add-on is installed or the blocklist is updated, and store the status in the DB.
2) We call string.replace 12 times in that function, which adds up to another 18ms. 10 of those calls could be replaced with a single `url.replace(/%([A-Z_]+)%/g, (m0, m1) => replacements[m1] || m0)` call. And the 11th could be folded into that for the custom category substitutions.
3) The isCompatible getter likewise doesn't need to compute compatibility for every call. It only need to be computed on add-on or app update. But at least this one is only 3ms.
Comment 8•7 years ago
|
||
My email update from rhelmer. He will try to get this bug fixed within Fx57 if it's a straightforward fix. We'll reassessment later in fx75 in early Sept.
Comment 9•7 years ago
|
||
(In reply to Kris Maglione [:kmag] from comment #7)
> (In reply to :Ehsan Akhgari (needinfo please, extremely long backlog) from
> comment #0)
> > See this profile, for example:
> > <https://perf-html.io/public/69f88e5a6c6ef339dfaa0442932e075f690f1bea/
> > calltree/?implementation=js&range=1.4816_2.4332~1.7767_2.1714&thread=0>
>
> Hm. So leaving aside the idle dispatch question, there are a few things
> going on in this profile that need to be fixed:
>
> 1) The blocklist status check is obscenely expensive, and we do it every
> time we access the blocklistState getter, which we do *twice* in the
> escapeAddonURI function for each add-on. That adds up to 85ms per update
> check. We should only ever need to check the blocklist when an add-on is
> installed or the blocklist is updated, and store the status in the DB.
This should be fixed now by bug 1377538.
> 2) We call string.replace 12 times in that function, which adds up to
> another 18ms. 10 of those calls could be replaced with a single
> `url.replace(/%([A-Z_]+)%/g, (m0, m1) => replacements[m1] || m0)` call. And
> the 11th could be folded into that for the custom category substitutions.
From looking at the code this appears to still be there - I'll file a separate bug for this.
> 3) The isCompatible getter likewise doesn't need to compute compatibility
> for every call. It only need to be computed on add-on or app update. But at
> least this one is only 3ms.
This needs a separate bug as well.
Updated•7 years ago
|
Whiteboard: [qf:p1] → [qf:p2]
Updated•7 years ago
|
status-firefox57:
--- → fix-optional
Priority: -- → P3
Updated•7 years ago
|
Whiteboard: [qf:p2] → [qf:p1][qf:ip60]
Updated•7 years ago
|
Whiteboard: [qf:p1][qf:ip60] → [qf:ip60][qf:p1]
Updated•6 years ago
|
Whiteboard: [qf:ip60][qf:p1] → [qf:f64][qf:p1]
Updated•6 years ago
|
Whiteboard: [qf:f64][qf:p1] → [qf:p1:f64]
Assignee | ||
Updated•6 years ago
|
Whiteboard: [qf:p1:f64] → [qf:p1:f64][fxperf]
Comment 10•6 years ago
|
||
Tentatively marking p2 - I guess it could be p1 but it'd need an active owner. :rhelmer, are you still working on this?
Flags: needinfo?(rhelmer)
Whiteboard: [qf:p1:f64][fxperf] → [qf:p1:f64][fxperf:p2]
Comment 11•6 years ago
|
||
(In reply to :Gijs (he/him) from comment #10)
> Tentatively marking p2 - I guess it could be p1 but it'd need an active
> owner. :rhelmer, are you still working on this?
Keeps dropping off my radar, if you can't find someone let me know and I'll take it back, going to unassign for now to give someone else a chance.
Assignee: rhelmer → nobody
Status: ASSIGNED → NEW
Flags: needinfo?(rhelmer)
Assignee | ||
Updated•6 years ago
|
Assignee: nobody → mconley
Assignee | ||
Updated•6 years ago
|
Whiteboard: [qf:p1:f64][fxperf:p2] → [qf:p1:f64][fxperf:p1]
Comment hidden (mozreview-request) |
Assignee | ||
Updated•6 years ago
|
Attachment #8991704 -
Flags: review?(rhelmer)
Comment 13•6 years ago
|
||
mozreview-review |
Comment on attachment 8991704 [details]
Bug 1373408 - Make nsUpdateTimerManager notify callbacks on idle.
https://reviewboard.mozilla.org/r/256648/#review263520
Well this change seems fine :) I expected this would break tests though, do we actually have tests for nsUpdateTimerManager?
Attachment #8991704 -
Flags: review?(rhelmer) → review+
Assignee | ||
Comment 14•6 years ago
|
||
Thanks for the fast review!
We do have some tests at toolkit/components/timermanager/tests/unit/consumerNotifications.js. It wouldn't surprise me, however, if any tests that rely on nsUpdateTimerManager are waiting until the notification is called. So now they're waiting a little longer, but it's okay - it eventually fires. That's my guess anyhow - no major surprises on my try push at https://treeherder.mozilla.org/#/jobs?repo=try&revision=b9dbb09a2a6097e4678f03a5a9783814f9ff1591 except for the Windows build failures (but those are unrelated).
Comment 15•6 years ago
|
||
Pushed by mconley@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/b754717fc772
Make nsUpdateTimerManager notify callbacks on idle. r=rhelmer
Comment 16•6 years ago
|
||
bugherder |
Status: NEW → RESOLVED
Closed: 6 years ago
status-firefox63:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla63
Updated•6 years ago
|
status-firefox57:
fix-optional → ---
Updated•3 years ago
|
Performance Impact: --- → P1
Whiteboard: [qf:p1:f64][fxperf:p1] → [fxperf:p1]
You need to log in
before you can comment on or make changes to this bug.
Description
•