diff options
Diffstat (limited to 'erts/doc/src/erts_alloc.xml')
-rw-r--r-- | erts/doc/src/erts_alloc.xml | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/erts/doc/src/erts_alloc.xml b/erts/doc/src/erts_alloc.xml new file mode 100644 index 0000000000..d51e5b3ea4 --- /dev/null +++ b/erts/doc/src/erts_alloc.xml @@ -0,0 +1,554 @@ +<?xml version="1.0" encoding="latin1" ?> +<!DOCTYPE cref SYSTEM "cref.dtd"> + +<cref> + <header> + <copyright> + <year>2002</year><year>2009</year> + <holder>Ericsson AB. All Rights Reserved.</holder> + </copyright> + <legalnotice> + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + </legalnotice> + + <title>erts_alloc</title> + <prepared>Rickard Green</prepared> + <docno>1</docno> + <date>03-06-11</date> + <rev>1</rev> + <file>erts_alloc.xml</file> + </header> + <lib>erts_alloc</lib> + <libsummary>An Erlang Run-Time System internal memory allocator library.</libsummary> + <description> + <p><c>erts_alloc</c> is an Erlang Run-Time System internal memory + allocator library. <c>erts_alloc</c> provides the Erlang + Run-Time System with a number of memory allocators.</p> + </description> + + <section> + <title>Allocators</title> + <marker id="allocators"></marker> + <p>Currently the following allocators are present:</p> + <taglist> + <tag><c>temp_alloc</c></tag> + <item>Allocator used for temporary allocations.</item> + <tag><c>eheap_alloc</c></tag> + <item>Allocator used for Erlang heap data, such as Erlang process heaps.</item> + <tag><c>binary_alloc</c></tag> + <item>Allocator used for Erlang binary data.</item> + <tag><c>ets_alloc</c></tag> + <item>Allocator used for ETS data.</item> + <tag><c>driver_alloc</c></tag> + <item>Allocator used for driver data.</item> + <tag><c>sl_alloc</c></tag> + <item>Allocator used for memory blocks that are expected to be + short-lived.</item> + <tag><c>ll_alloc</c></tag> + <item>Allocator used for memory blocks that are expected to be + long-lived, for example Erlang code.</item> + <tag><c>fix_alloc</c></tag> + <item>A very fast allocator used for some fix-sized + data. <c>fix_alloc</c> manages a set of memory pools from + which memory blocks are handed out. <c>fix_alloc</c> + allocates memory pools from <c>ll_alloc</c>. Memory pools + that have been allocated are never deallocated.</item> + <tag><c>std_alloc</c></tag> + <item>Allocator used for most memory blocks not allocated via any of + the other allocators described above.</item> + <tag><c>sys_alloc</c></tag> + <item>This is normally the default <c>malloc</c> implementation + used on the specific OS.</item> + <tag><c>mseg_alloc</c></tag> + <item>A memory segment allocator. <c>mseg_alloc</c> is used by other + allocators for allocating memory segments and is currently only + available on systems that have the <c>mmap</c> system + call. Memory segments that are deallocated are kept for a + while in a segment cache before they are destroyed. When + segments are allocated, cached segments are used if possible + instead of creating new segments. This in order to reduce + the number of system calls made.</item> + </taglist> + <p><c>sys_alloc</c> and <c>fix_alloc</c> are always enabled and + cannot be disabled. <c>mseg_alloc</c> is always enabled if it is + available and an allocator that uses it is enabled. All other + allocators can be <seealso marker="#M_e">enabled or disabled</seealso>. + By default all allocators are enabled. + When an allocator is disabled, <c>sys_alloc</c> + is used instead of the disabled allocator.</p> + <p>The main idea with the <c>erts_alloc</c> library is to separate + memory blocks that are used differently into different memory + areas, and by this achieving less memory fragmentation. By + putting less effort in finding a good fit for memory blocks that + are frequently allocated than for those less frequently + allocated, a performance gain can be achieved.</p> + </section> + + <section> + <marker id="alloc_util"></marker> + <title>The alloc_util framework</title> + <p>Internally a framework called <c>alloc_util</c> is used for + implementing allocators. <c>sys_alloc</c>, <c>fix_alloc</c>, and + <c>mseg_alloc</c> do not use this framework; hence, the + following does <em>not</em> apply to them.</p> + <p>An allocator manages multiple areas, called carriers, in which + memory blocks are placed. A carrier is either placed in a + separate memory segment (allocated via <c>mseg_alloc</c>) or in + the heap segment (allocated via <c>sys_alloc</c>). Multiblock + carriers are used for storage of several blocks. Singleblock + carriers are used for storage of one block. Blocks that are + larger than the value of the singleblock carrier threshold + (<seealso marker="#M_sbct">sbct</seealso>) parameter are placed + in singleblock carriers. Blocks smaller than the value of the + <c>sbct</c> parameter are placed in multiblock + carriers. Normally an allocator creates a "main multiblock + carrier". Main multiblock carriers are never deallocated. The + size of the main multiblock carrier is determined by the value + of the <seealso marker="#M_mmbcs">mmbcs</seealso> parameter.</p> + <p> <marker id="mseg_mbc_sizes"></marker> + + Sizes of multiblock carriers allocated via <c>mseg_alloc</c> are + decided based on the values of the largest multiblock carrier + size (<seealso marker="#M_lmbcs">lmbcs</seealso>), the smallest + multiblock carrier size (<seealso marker="#M_smbcs">smbcs</seealso>), + and the multiblock carrier growth stages + (<seealso marker="#M_smbcs">mbcgs</seealso>) parameters. If + <c>nc</c> is the current number of multiblock carriers (the main + multiblock carrier excluded) managed by an allocator, the size + of the next <c>mseg_alloc</c> multiblock carrier allocated by + this allocator will roughly be + <c><![CDATA[smbcs+nc*(lmbcs-smbcs)/mbcgs]]></c> when + <c><![CDATA[nc <= mbcgs]]></c>, + and <c>lmbcs</c> when <c><![CDATA[nc > mbcgs]]></c>. If the value of the + <c>sbct</c> parameter should be larger than the value of the + <c>lmbcs</c> parameter, the allocator may have to create + multiblock carriers that are larger than the value of the + <c>lmbcs</c> parameter, though. Singleblock carriers allocated + via <c>mseg_alloc</c> are sized to whole pages.</p> + <p>Sizes of carriers allocated via <c>sys_alloc</c> are + decided based on the value of the <c>sys_alloc</c> carrier size + (<seealso marker="#Muycs">ycs</seealso>) parameter. The size of + a carrier is the least number of multiples of the value of the + <c>ycs</c> parameter that satisfies the request.</p> + <p>Coalescing of free blocks are always performed immediately. + Boundary tags (headers and footers) in free blocks are used + which makes the time complexity for coalescing constant.</p> + <p> <marker id="strategy"></marker> + + The memory allocation strategy used for multiblock carriers by an + allocator is configurable via the <seealso marker="#M_as">as</seealso> + parameter. Currently the following strategies are available:</p> + <taglist> + <tag>Best fit</tag> + <item> + <p>Strategy: Find the smallest block that satisfies the + requested block size.</p> + <p>Implementation: A balanced binary search tree is + used. The time complexity is proportional to log N, where + N is the number of sizes of free blocks.</p> + </item> + <tag>Address order best fit</tag> + <item> + <p>Strategy: Find the smallest block that satisfies the + requested block size. If multiple blocks are found, choose + the one with the lowest address.</p> + <p>Implementation: A balanced binary search tree is + used. The time complexity is proportional to log N, where + N is the number of free blocks.</p> + </item> + <tag>Good fit</tag> + <item> + <p>Strategy: Try to find the best fit, but settle for the best fit + found during a limited search.</p> + <p>Implementation: The implementation uses segregated free + lists with a maximum block search depth (in each list) in + order to find a good fit fast. When the maximum block + search depth is small (by default 3) this implementation + has a time complexity that is constant. The maximum block + search depth is configurable via the + <seealso marker="#M_mbsd">mbsd</seealso> parameter.</p> + </item> + <tag>A fit</tag> + <item> + <p>Strategy: Do not search for a fit, inspect only one free + block to see if it satisfies the request. This strategy is + only intended to be used for temporary allocations.</p> + <p>Implementation: Inspect the first block in a free-list. + If it satisfies the request, it is used; otherwise, a new + carrier is created. The implementation has a time + complexity that is constant.</p> + <p>As of erts version 5.6.1 the emulator will refuse to + use this strategy on other allocators than <c>temp_alloc</c>. + This since it will only cause problems for other allocators.</p> + </item> + </taglist> + </section> + + <section> + <marker id="flags"></marker> + <title>System Flags Effecting erts_alloc</title> + <warning> + <p>Only use these flags if you are absolutely sure what you are + doing. Unsuitable settings may cause serious performance + degradation and even a system crash at any time during + operation.</p> + </warning> + <p>Memory allocator system flags have the following syntax: + <c><![CDATA[+M<S><P> <V>]]></c> + where <c><![CDATA[<S>]]></c> is a letter identifying a subsystem, + <c><![CDATA[<P>]]></c> is a parameter, and <c><![CDATA[<V>]]></c> is the + value to use. The flags can be passed to the Erlang emulator + (<seealso marker="erl">erl</seealso>) as command line + arguments.</p> + <p>System flags effecting specific allocators have an upper-case + letter as <c><![CDATA[<S>]]></c>. The following letters are used for + the currently present allocators:</p> + <list type="bulleted"> + <item><c>B: binary_alloc</c></item> + <item><c>D: std_alloc</c></item> + <item><c>E: ets_alloc</c></item> + <item><c>F: fix_alloc</c></item> + <item><c>H: eheap_alloc</c></item> + <item><c>L: ll_alloc</c></item> + <item><c>M: mseg_alloc</c></item> + <item><c>R: driver_alloc</c></item> + <item><c>S: sl_alloc</c></item> + <item><c>T: temp_alloc</c></item> + <item><c>Y: sys_alloc</c></item> + </list> + <p>The following flags are available for configuration of + <c>mseg_alloc</c>:</p> + <taglist> + <tag><c><![CDATA[+MMamcbf <size>]]></c></tag> + <item> <marker id="MMamcbf"></marker> + + Absolute max cache bad fit (in kilobytes). A segment in the + memory segment cache is not reused if its size exceeds the + requested size with more than the value of this + parameter. Default value is 4096. </item> + <tag><c><![CDATA[+MMrmcbf <ratio>]]></c></tag> + <item> <marker id="MMrmcbf"></marker> + + Relative max cache bad fit (in percent). A segment in the + memory segment cache is not reused if its size exceeds the + requested size with more than relative max cache bad fit + percent of the requested size. Default value is 20.</item> + <tag><c><![CDATA[+MMmcs <amount>]]></c></tag> + <item> <marker id="MMmcs"></marker> + + Max cached segments. The maximum number of memory segments + stored in the memory segment cache. Valid range is + 0-30. Default value is 5.</item> + <tag><c><![CDATA[+MMcci <time>]]></c></tag> + <item> <marker id="MMcci"></marker> + + Cache check interval (in milliseconds). The memory segment + cache is checked for segments to destroy at an interval + determined by this parameter. Default value is 1000.</item> + </taglist> + <p>The following flags are available for configuration of + <c>fix_alloc</c>:</p> + <taglist> + <tag><c>+MFe true</c></tag> + <item> <marker id="MFe"></marker> + + Enable <c>fix_alloc</c>. Note: <c>fix_alloc</c> cannot be disabled.</item> + </taglist> + <p>The following flags are available for configuration of + <c>sys_alloc</c>:</p> + <taglist> + <tag><c>+MYe true</c></tag> + <item> <marker id="MYe"></marker> + + Enable <c>sys_alloc</c>. Note: <c>sys_alloc</c> cannot be disabled.</item> + <tag><c>+MYm libc</c></tag> + <item> <marker id="MYm"></marker> +<c>malloc</c> library to use. Currently only + <c>libc</c> is available. <c>libc</c> enables the standard + <c>libc</c> malloc implementation. By default <c>libc</c> is used.</item> + <tag><c><![CDATA[+MYtt <size>]]></c></tag> + <item> <marker id="MYtt"></marker> + + Trim threshold size (in kilobytes). This is the maximum amount + of free memory at the top of the heap (allocated by + <c>sbrk</c>) that will be kept by <c>malloc</c> (not + released to the operating system). When the amount of free + memory at the top of the heap exceeds the trim threshold, + <c>malloc</c> will release it (by calling + <c>sbrk</c>). Trim threshold is given in kilobytes. Default + trim threshold is 128. <em>Note:</em> This flag will + only have any effect when the emulator has been linked with + the GNU C library, and uses its <c>malloc</c> implementation.</item> + <tag><c><![CDATA[+MYtp <size>]]></c></tag> + <item> <marker id="MYtp"></marker> + + Top pad size (in kilobytes). This is the amount of extra + memory that will be allocated by <c>malloc</c> when + <c>sbrk</c> is called to get more memory from the operating + system. Default top pad size is 0. <em>Note:</em> This flag + will only have any effect when the emulator has been linked + with the GNU C library, and uses its <c>malloc</c> + implementation.</item> + </taglist> + <p>The following flags are available for configuration of allocators + based on <c>alloc_util</c>. If <c>u</c> is used as subsystem + identifier (i.e., <c><![CDATA[<S> = u]]></c>) all allocators based on + <c>alloc_util</c> will be effected. If <c>B</c>, <c>D</c>, <c>E</c>, + <c>H</c>, <c>L</c>, <c>R</c>, <c>S</c>, or <c>T</c> is used as + subsystem identifier, only the specific allocator identified will be + effected:</p> + <taglist> + <tag><c><![CDATA[+M<S>as bf|aobf|gf|af]]></c></tag> + <item> <marker id="M_as"></marker> + + Allocation strategy. Valid strategies are <c>bf</c> (best fit), + <c>aobf</c> (address order best fit), <c>gf</c> (good fit), + and <c>af</c> (a fit). See + <seealso marker="#strategy">the description of allocation strategies</seealso> in "the <c>alloc_util</c> framework" section.</item> + <tag><c><![CDATA[+M<S>asbcst <size>]]></c></tag> + <item> <marker id="M_asbcst"></marker> + + Absolute singleblock carrier shrink threshold (in + kilobytes). When a block located in an + <c>mseg_alloc</c> singleblock carrier is shrunk, the carrier + will be left unchanged if the amount of unused memory is less + than this threshold; otherwise, the carrier will be shrunk. + See also <seealso marker="#M_rsbcst">rsbcst</seealso>.</item> + <tag><c><![CDATA[+M<S>e true|false]]></c></tag> + <item> <marker id="M_e"></marker> + + Enable allocator <c><![CDATA[<S>]]></c>.</item> + <tag><c><![CDATA[+M<S>lmbcs <size>]]></c></tag> + <item> <marker id="M_lmbcs"></marker> + + Largest (<c>mseg_alloc</c>) multiblock carrier size (in + kilobytes). See <seealso marker="#mseg_mbc_sizes">the description + on how sizes for mseg_alloc multiblock carriers are decided</seealso> + in "the <c>alloc_util</c> framework" section.</item> + <tag><c><![CDATA[+M<S>mbcgs <ratio>]]></c></tag> + <item> <marker id="M_mbcgs"></marker> + + (<c>mseg_alloc</c>) multiblock carrier growth stages. See + <seealso marker="#mseg_mbc_sizes">the description on how sizes for + mseg_alloc multiblock carriers are decided</seealso> + in "the <c>alloc_util</c> framework" section.</item> + <tag><c><![CDATA[+M<S>mbsd <depth>]]></c></tag> + <item> <marker id="M_mbsd"></marker> + + Max block search depth. This flag has effect only if the + good fit strategy has been selected for allocator + <c><![CDATA[<S>]]></c>. When the good fit strategy is used, free + blocks are placed in segregated free-lists. Each free list + contains blocks of sizes in a specific range. The max block + search depth sets a limit on the maximum number of blocks to + inspect in a free list during a search for suitable block + satisfying the request.</item> + <tag><c><![CDATA[+M<S>mmbcs <size>]]></c></tag> + <item> <marker id="M_mmbcs"></marker> + + Main multiblock carrier size. Sets the size of the main + multiblock carrier for allocator <c><![CDATA[<S>]]></c>. The main + multiblock carrier is allocated via <c><![CDATA[sys_alloc]]></c> and is + never deallocated.</item> + <tag><c><![CDATA[+M<S>mmmbc <amount>]]></c></tag> + <item> <marker id="M_mmmbc"></marker> + + Max <c>mseg_alloc</c> multiblock carriers. Maximum number of + multiblock carriers allocated via <c>mseg_alloc</c> by + allocator <c><![CDATA[<S>]]></c>. When this limit has been reached, + new multiblock carriers will be allocated via + <c>sys_alloc</c>.</item> + <tag><c><![CDATA[+M<S>mmsbc <amount>]]></c></tag> + <item> <marker id="M_mmsbc"></marker> + + Max <c>mseg_alloc</c> singleblock carriers. Maximum number of + singleblock carriers allocated via <c>mseg_alloc</c> by + allocator <c><![CDATA[<S>]]></c>. When this limit has been reached, + new singleblock carriers will be allocated via + <c>sys_alloc</c>.</item> + <tag><c><![CDATA[+M<S>ramv <bool>]]></c></tag> + <item> <marker id="M_ramv"></marker> + + Realloc always moves. When enabled, reallocate operations will + more or less be translated into an allocate, copy, free sequence. + This often reduce memory fragmentation, but costs performance. + </item> + <tag><c><![CDATA[+M<S>rmbcmt <ratio>]]></c></tag> + <item> <marker id="M_rmbcmt"></marker> + + Relative multiblock carrier move threshold (in percent). When + a block located in a multiblock carrier is shrunk, + the block will be moved if the ratio of the size of the returned + memory compared to the previous size is more than this threshold; + otherwise, the block will be shrunk at current location.</item> + <tag><c><![CDATA[+M<S>rsbcmt <ratio>]]></c></tag> + <item> <marker id="M_rsbcmt"></marker> + + Relative singleblock carrier move threshold (in percent). When + a block located in a singleblock carrier is shrunk to + a size smaller than the value of the + <seealso marker="#M_sbct">sbct</seealso> parameter, + the block will be left unchanged in the singleblock carrier if + the ratio of unused memory is less than this threshold; + otherwise, it will be moved into a multiblock carrier. </item> + <tag><c><![CDATA[+M<S>rsbcst <ratio>]]></c></tag> + <item> <marker id="M_rsbcst"></marker> + + Relative singleblock carrier shrink threshold (in + percent). When a block located in an <c>mseg_alloc</c> + singleblock carrier is shrunk, the carrier will be left + unchanged if the ratio of unused memory is less than this + threshold; otherwise, the carrier will be shrunk. + See also <seealso marker="#M_asbcst">asbcst</seealso>.</item> + <tag><c><![CDATA[+M<S>sbct <size>]]></c></tag> + <item> <marker id="M_sbct"></marker> + + Singleblock carrier threshold. Blocks larger than this + threshold will be placed in singleblock carriers. Blocks + smaller than this threshold will be placed in multiblock + carriers.</item> + <tag><c><![CDATA[+M<S>smbcs <size>]]></c></tag> + <item> <marker id="M_smbcs"></marker> + + Smallest (<c>mseg_alloc</c>) multiblock carrier size (in + kilobytes). See <seealso marker="#mseg_mbc_sizes">the description + on how sizes for mseg_alloc multiblock carriers are decided</seealso> + in "the <c>alloc_util</c> framework" section.</item> + <tag><c><![CDATA[+M<S>t true|false|<amount>]]></c></tag> + <item> <marker id="M_t"></marker> + + Multiple, thread specific instances of the allocator. + This option will only have any effect on the runtime system + with SMP support. Default behaviour on the runtime system with + SMP support (<c>N</c> equals the number of scheduler threads): + <taglist> + <tag><c>temp_alloc</c></tag> + <item><c>N + 1</c> instances.</item> + <tag><c>ll_alloc</c></tag> + <item><c>1</c> instance.</item> + <tag>Other allocators</tag> + <item><c>N</c> instances when <c>N</c> is less than or equal to + <c>16</c>. <c>16</c> instances when <c>N</c> is greater than + <c>16</c>.</item> + </taglist> + <c>temp_alloc</c> will always use <c>N + 1</c> instances when + this option has been enabled regardless of the amount passed. + Other allocators will use the same amount of instances as the + amount passed as long as it isn't greater than <c>N</c>. + </item> + </taglist> + <p>Currently the following flags are available for configuration of + <c>alloc_util</c>, i.e. all allocators based on <c>alloc_util</c> + will be effected:</p> + <taglist> + <tag><c><![CDATA[+Muycs <size>]]></c></tag> + <item> <marker id="Muycs"></marker> +<c>sys_alloc</c> carrier size. Carriers allocated via + <c>sys_alloc</c> will be allocated in sizes which are + multiples of the <c>sys_alloc</c> carrier size. This is not + true for main multiblock carriers and carriers allocated + during a memory shortage, though.</item> + <tag><c><![CDATA[+Mummc <amount>]]></c></tag> + <item> <marker id="Mummc"></marker> + + Max <c>mseg_alloc</c> carriers. Maximum number of carriers + placed in separate memory segments. When this limit has been + reached, new carriers will be placed in memory retrieved from + <c>sys_alloc</c>.</item> + </taglist> + <p>Instrumentation flags:</p> + <taglist> + <tag><c>+Mim true|false</c></tag> + <item> <marker id="Mim"></marker> + + A map over current allocations is kept by the emulator. The + allocation map can be retrieved via the <c>instrument</c> + module. <c>+Mim true</c> implies <c>+Mis true</c>. + <c>+Mim true</c> is the same as + <seealso marker="erl#instr">-instr</seealso>.</item> + <tag><c>+Mis true|false</c></tag> + <item> <marker id="Mis"></marker> + + Status over allocated memory is kept by the emulator. The + allocation status can be retrieved via the <c>instrument</c> + module.</item> + <tag><c>+Mit X</c></tag> + <item> <marker id="Mit"></marker> + + Reserved for future use. Do <em>not</em> use this flag.</item> + </taglist> + <note> + <p>When instrumentation of the emulator is enabled, the emulator + uses more memory and runs slower.</p> + </note> + <p>Other flags:</p> + <taglist> + <tag><c>+Mea min|max|r9c|r10b|r11b|config</c></tag> + <item> <marker id="Mea"></marker> + <taglist> + <tag><c>min</c></tag> + <item> + Disables all allocators that can be disabled. + </item> + + <tag><c>max</c></tag> + <item> + Enables all allocators (currently default). + </item> + + <tag><c>r9c|r10b|r11b</c></tag> + <item> + Configures all allocators as they were configured in respective + OTP release. These will eventually be removed. + </item> + + <tag><c>config</c></tag> + <item> + Disables features that cannot be enabled while creating an + allocator configuration with + <seealso marker="runtime_tools:erts_alloc_config">erts_alloc_config(3)</seealso>. + Note, this option should only be used while running + <c>erts_alloc_config</c>, <em>not</em> when using the created + configuration. + </item> + </taglist> + </item> + </taglist> + <p>Only some default values have been presented + here. + <seealso marker="erts:erlang#system_info_allocator">erlang:system_info(allocator)</seealso>, + and + <seealso marker="erts:erlang#system_info_allocator_tuple">erlang:system_info({allocator, Alloc})</seealso> + can be used in order to obtain currently used settings and current + status of the allocators.</p> + <note> + <p>Most of these flags are highly implementation dependent, and they + may be changed or removed without prior notice.</p> + <p><c>erts_alloc</c> is not obliged to strictly use the settings that + have been passed to it (it may even ignore them).</p> + </note> + <p><seealso marker="runtime_tools:erts_alloc_config">erts_alloc_config(3)</seealso> + is a tool that can be used to aid creation of an + <c>erts_alloc</c> configuration that is suitable for a limited + number of runtime scenarios.</p> + </section> + + <section> + <title>SEE ALSO</title> + <p><seealso marker="runtime_tools:erts_alloc_config">erts_alloc_config(3)</seealso>, + <seealso marker="erl">erl(1)</seealso>, + <seealso marker="tools:instrument">instrument(3)</seealso>, + <seealso marker="erts:erlang">erlang(3)</seealso></p> + </section> +</cref> + |