Albert J. Wong | 2108fde | 2017-06-08 17:55:50 | [diff] [blame] | 1 | # Key Concepts in Chrome Memory |
| 2 | |
Albert J. Wong | d6381a8 | 2017-06-14 22:49:12 | [diff] [blame^] | 3 | ## What's so hard about memory? Isn't it just malloc and free? |
| 4 | |
| 5 | Not really. There are lots of differences and subtleties that change per |
| 6 | operating system and even per operating system configuration. |
| 7 | |
| 8 | Fortunately, these differences mostly disappear when a program is running |
| 9 | with sufficient resources. |
| 10 | |
| 11 | Unfortunately, the distinctions end up being very relevant when |
| 12 | working near out of memory conditions or analyzing overall performance |
| 13 | when there is any amount of memory pressure; this makes crafting and |
| 14 | interpreting memory statistics hard. |
| 15 | |
| 16 | Fortunately, the point of this doc is to give succinct background that |
| 17 | will help you ramp up on the subtleties to work in this space. Yes, this |
| 18 | is complicated stuff...but don't despair. You work on a multi-process |
| 19 | browser implementing the web platform with high security guarantees. |
| 20 | Compared to the rest the system, memory is not THAT complicated. |
| 21 | |
| 22 | ## An you give specific examples of how it's harder than malloc/free? |
| 23 | |
| 24 | Here are some example questions that require a more complex |
| 25 | view of memory than malloc/free. |
| 26 | |
| 27 | * When Chrome allocates memory, when does it take up swap space? |
| 28 | * When memory is `free()`d, when is it made usable by other applications? |
| 29 | * Is it always safe to touch the memory returned by malloc()? |
| 30 | * How many heaps does Chrome have? |
| 31 | * How are memory resources used by the GPU and drivers accounted for? |
| 32 | * Is that the same on systems where GPU memory isn't shared with main memory? |
| 33 | * How are shared libraries accounted for? How big of a penalty is there for |
| 34 | each process that shares the memory? |
| 35 | * What types of memory does Task Manager/Activity Monitor/top report? |
| 36 | * What about the UMA stats? |
| 37 | |
| 38 | In many of the above, the answer actually changes per operating system variant. |
| 39 | There is at least one major schism between Windows-based machines and more |
| 40 | unixy systems. For example, it is impossible to return all resources (physical |
| 41 | ram as well as swap space) to the OS in a way brings them back on demand which |
| 42 | drastically changes the way one can handle free lists. |
| 43 | |
| 44 | However, even in macOS, Android, CrOS, and "standard desktop linux" each |
| 45 | also have enough divergences (compressed memory, pagefile vs swap partition |
| 46 | vs no swap, overcommit settings, memory perssure signals etc) that even |
| 47 | answering "how much memory is Chromium using" is hard to do in a uniform |
| 48 | manner. |
| 49 | |
| 50 | The goal of this document is to give a common set of vocabulary |
| 51 | and concepts such that Chromium developers can more discuss questions like |
| 52 | the ones above without misunderstanding each other. |
| 53 | |
| 54 | |
| 55 | ## Key gotchas |
| 56 | |
| 57 | ### Windows allocation uses resources immediately; other OSes use it on first touch. |
| 58 | |
| 59 | Arguably the biggest difference for Windows and other OSes is memory granted to |
| 60 | a process is always "committed" on allocation. Pragmatically this means that in |
| 61 | Windows, `malloc(10*1024*1024*1024)` will immediately prevent other applications |
| 62 | from being able to successfully allocate memory thereby causing them to crash |
| 63 | or not be able to open. In Unix variants, usage usually only consumes system |
| 64 | resources [TODO(awong): Link to overcommit] when pages are touched. |
| 65 | |
| 66 | Not being aware of this difference can cause architecture choices that have a |
| 67 | larger than expected resource impact on Windows and incorrect interpretation for metrics on Windows |
| 68 | |
| 69 | See the following section on "discardable" memory for more info. |
| 70 | |
| 71 | |
| 72 | ### Because of the commit guarantee difference, "discarding" memory has completely different meanings across platforms. |
| 73 | |
| 74 | In Unix systems, there is an `madvise()` function via which pages that have |
| 75 | been committed via usage can be returned to the non-resource consuming state. |
| 76 | Such a page will then be recommitted on demand making it a tempting optimization |
| 77 | for data structures with freelists. However, there is no such API on Windows. |
| 78 | The `VirtualAlloc(MEM_RESET)`, `DiscardVirtualMemory()`, and |
| 79 | `OfferVirtualMemory()` look temptingly similar and on first glance they even |
| 80 | look like they work because they will immediately reduce the amount of physical |
| 81 | ram (aka Working Set) a processes uses. However, they do NOT release swap |
| 82 | meaning they will not help prevent OOM scenarios. |
| 83 | |
| 84 | Designing a freelist structure that conflates this behavior (see this |
| 85 | [PartitionAlloc bug](https://bugs.chromium.org/p/chromium/issues/detail?id=726077)) |
| 86 | will result in a system that only truly reduces resource usage on Unix-like |
| 87 | systems. |
| 88 | |
| 89 | |
| 90 | ## Terms and definitions |
| 91 | |
| 92 | TODO(awong): To through Erik's Consistent Memory Metrics doc and pull out bits |
| 93 | that reconcile with this. |
| 94 | |
| 95 | ### Commited Memory |
| 96 | ### Discardable memory |
| 97 | ### Proportional Set Size |
| 98 | ### Image memory |
| 99 | ### Shared Memory. |
| 100 | |
Albert J. Wong | 2108fde | 2017-06-08 17:55:50 | [diff] [blame] | 101 | TODO(awong): Write overview of our platform diversity, windows vs \*nix memory models (eg, |
| 102 | "committed" memory), what "discardable" memory is, GPU memory, zram, overcommit, |
| 103 | the various Chrome heaps (pageheap, partitionalloc, oilpan, v8, malloc...per |
| 104 | platform), etc. |