On Thu, Jul 12, 2018 at 3:57 AM, Emilio Cobos Álvarez <emi...@crisal.io> wrote:
> Thanks for doing this! > > Just curious, is there a bug on file to measure excess capacity on > nsTArrays and hash tables? > > WebKit has a bunch of bugs like: > > https://bugs.webkit.org/show_bug.cgi?id=186709 > > Which seem relevant. > njn looked at that kind of issue at some point (he changed how arrays grow, for instance, to reduce overhead), but it has probably been around 5 years, so there may be room for improvement for things added in the meanwhile. However, our focus here is really on reducing per-process memory overhead, rather than generic memory improvements, because we've had a lot of focus on the latter as part of MemShrink, but not the former, so there's likely easier improvements to be had. Andrew > -- Emilio > > On 07/10/2018 08:19 PM, Kris Maglione wrote: > >> Welcome to the first edition of the Fission MemShrink newsletter.[1] >> >> In this edition, I'll sum up what the project is, and why it matters to >> you. In subsequent editions, I'll give updates on progress that we've made, >> and areas that we'll need to focus on next.[2] >> >> >> The Fission MemShrink project is one of the most easily overlooked >> aspects of Project Fission (also known as Site Isolation), but is >> absolutely critical to its success. And will require a company- and >> community-wide effort effort to meet its goals. >> >> The problem is thus: In order for site isolation to work, we need to be >> able to run *at least* 100 content processes in an average Firefox session. >> Each of those processes has its own base memory overhead—memory we use just >> for creating the process, regardless of what's running in it. In the >> post-Fission world, that overhead needs to be less than 10MB per process in >> order to keep the extra overhead from Fission below 1GB. Right now, on our >> best-cast platform, Windows 10, is somewhere between 17 and 21MB. Linux and >> OS-X hover between 25 and 35MB. In other words, between 2 and 3.5GB for an >> ordinary session. >> >> That means that, in the best case, we need to reduce the memory we use in >> content processes by *at least* 7MB. The problem, of course, is that there >> are only so many places we can cut memory without losing functionality, and >> even fewer places where we can make big wins. But, there are lots of places >> we can make small and medium-sized wins. >> >> So, to put the task into perspective, of all of the places we can cut a >> certain amount of overhead, here are the number of each that we need to fix >> in order to reach 1MB: >> >> 250KB: 4 >> 100KB: 10 >> 75KB: 13 >> 50KB: 20 >> 20KB: 50 >> 10KB: 100 >> 5KB: 200 >> >> Now remember: we need to do *all* of these in order to reach our goal. >> It's not a matter of one 250KB improvement or 50 5KB improvements. It's 4 >> 250KB *and* 200 5KB improvements. There just aren't enough places we can >> cut 250KB. If we fall short in any of those areas, Project Fission will >> fail, and Firefox will be the only major browser without site isolation. >> >> But it won't fail, because all of you are awesome, and this is a totally >> achievable goal if we all throw our effort behind it. >> >> Essentially what this means, though, is that if we identify an area of >> overhead that's 50KB[3] or larger that can be eliminated, it *has* to be >> eliminated. There just aren't that many large chunks to remove. They all >> need to go. And if an area of code has a dozen 5KB chunks that can be >> eliminated, maybe they don't all have to go, but at least half of them do. >> The more the better. >> >> >> To help us triage these issues, we have a tracking bug ( >> https://bugzil.la/memshrink-content), and a per-bug whiteboard tag >> ([overhead:...]) which gives an estimate of how much per-process overhead >> we believe fixing that bug would eliminate. Please feel free to add >> blockers to the tracking bug if you think they're relevant, and to add or >> update [overhead] tags if you have reasonable estimates. >> >> >> With all of that said, here's a brief update of the progress we've made >> so far: >> >> In the past month, unique memory per process[4] has dropped 3-4MB[5], and >> JS memory usage in particular has dropped 1.1-1.9MB. >> >> Particular credit goes to: >> >> * Eric Rahm added an AWSY test suite to track base content process memory >> (https://bugzil.la/1442361). Results: >> >> Resident unique: https://treeherder.mozilla.org >> /perf.html#/graphs?series=mozilla-central,1684862,1,4&series >> =mozilla-central,1684846,1,4&series=mozilla-central, >> 1685133,1,4&series=mozilla-central,1685127,1,4 >> Explicit allocations: https://treeherder.mozilla.org >> /perf.html#/graphs?series=mozilla-inbound,1706218,1,4&series >> =mozilla-inbound,1706220,1,4&series=mozilla-inbound,1706216,1,4 >> JS: https://treeherder.mozilla.org/perf.html#/graphs?series=mozi >> lla-central,1684866,1,4&series=mozilla-central,1685137,1,4& >> series=mozilla-central,1685131,1,4 >> >> * Andrew McCreight created a tool for tracking JS memory usage, and >> figuring >> out which scripts and objects are responsible for how much of it >> (https://bugzil.la/1463569). >> >> * Andrew and Nika Layzell also completely rewrote the way we handle XPIDL >> type >> info so that it's statically compiled into the executable and shared >> between >> all processes (https://bugzil.la/1438688, https://bugzil.la/1444745). >> >> * Felipe Gomes split a bunch of code out of frame scripts so that it >> could be >> lazily loaded only when needed (https://bugzil.la/1467278, ...) and >> added a >> whitelist of JSMs that are allowed to be loaded at content process >> startup >> (https://bugzil.la/1471066) >> >> * I did a bit of this too, and also prevented us from loading some other >> JSMs >> before we need them (https://bugzil.la/1470333, >> https://bugzil.la/1469719, >> ...) >> >> * Nick Nethercote made dynamic nsAtoms allocate their string storage >> inline >> rather than use a refcounted StringBuffer (https://bugzil.la/1447951) >> >> * Emilio Álvarez reduced the amount of memory the Gecko Profiler uses in >> content processes. >> >> * Nathan Froyd fixed our static nsAtom code so it didn't generate static >> initializers (https://bugzil.la/1455178) and reduced the stack size >> of our >> image decoder threads (https://bugzil.la/1443932). >> >> * Doug Thayer reduced the number of hang monitor threads we start in each >> process (https://bugzil.la/1448040) >> >> * Boris Zbarsky removed a bunch of useless QueryInterface implementations >> (https://bugzil.la/1452862), made our static isInstance methods use >> less >> memory (https://bugzil.la/1452786), and generally deleted a bunch of >> useless, legacy nsI* interfaces that required us to add extra vtable >> pointers to a lot of DOM object instances. >> >> And your humble author contributed the following: >> >> * Changed our localization string bundles to use shared memory for bundles >> which are loaded into content processes (https://bugzil.la/1470365). >> This bug also adds some helpers which should make it easer to use >> shared >> memory for more things in the future. >> >> * Made some changes to the script preloader to avoid keeping an >> unnecessary >> encoded copy of scripts in the content process ( >> https://bugzil.la/1470793), >> to drop cached single-use scripts (https://bugzil.la/1471091), and to >> improve >> the set of scripts we load in content processes ( >> https://bugzil.la/1471089). >> >> * Made some smaller optimizations to avoid making copies of strings in >> preference callbacks (https://bugzil.la/1472523), and to remove the >> XPC >> compilation scope (https://bugzil.la/1442737) >> >> Apologies to anyone I missed. >> >> >> [1]: Please feel free to read the '.' as a '!' if you're so inclined. I >> generally shy away from exclamation marks. >> [2]: If this seems like a massive rip-off of Ehsan's Quantum Flow >> newsletter >> format, that's because it is. Thanks, Ehsan :) >> [3]: 50KB per process, which is to say 5MB across 100 content processes. >> [4]: The total memory mapped by each content process which is not shared >> by >> other processes. Approximately equal to USS. >> [5]: It's hard to be precise, since the numbers can be noisy, and are >> often >> bi-modal. >> _______________________________________________ >> dev-platform mailing list >> dev-platform@lists.mozilla.org >> https://lists.mozilla.org/listinfo/dev-platform >> > _______________________________________________ > dev-platform mailing list > dev-platform@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-platform > _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform