aboutsummaryrefslogtreecommitdiffstats
path: root/system/doc/efficiency_guide/advanced.xml
diff options
context:
space:
mode:
Diffstat (limited to 'system/doc/efficiency_guide/advanced.xml')
-rw-r--r--system/doc/efficiency_guide/advanced.xml204
1 files changed, 204 insertions, 0 deletions
diff --git a/system/doc/efficiency_guide/advanced.xml b/system/doc/efficiency_guide/advanced.xml
new file mode 100644
index 0000000000..0ec3afbd59
--- /dev/null
+++ b/system/doc/efficiency_guide/advanced.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2001</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>Advanced</title>
+ <prepared>Kenneth Lundin</prepared>
+ <docno></docno>
+ <date>2001-08-21</date>
+ <rev></rev>
+ <file>advanced.xml</file>
+ </header>
+
+ <section>
+ <title>Memory</title>
+ <p>A good start when programming efficiently is to have knowledge about
+ how much memory different data types and operations require. It is
+ implementation-dependent how much memory the Erlang data types and
+ other items consume, but here are some figures for
+ erts-5.2 system (OTP release R9B). (There have been no significant
+ changes in R13.)</p>
+
+ <p>The unit of measurement is memory words. There exists both a 32-bit
+ and a 64-bit implementation, and a word is therefore, 4 bytes or
+ 8 bytes, respectively.</p>
+ <table>
+ <row>
+ <cell align="center" valign="middle">Data type</cell>
+ <cell align="center" valign="middle">Memory size</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Integer (-16#7FFFFFF &lt; i &lt;16#7FFFFFF)</cell>
+ <cell align="left" valign="middle">1 word</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Integer (big numbers)</cell>
+ <cell align="left" valign="middle">3..N words</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Atom</cell>
+ <cell align="left" valign="middle">1 word. Note: an atom refers into
+ an atom table which also consumes memory.
+ The atom text is stored once for each unique atom in this table.
+ The atom table is <em>not</em> garbage-collected.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Float</cell>
+ <cell align="left" valign="middle">On 32-bit architectures: 4 words <br></br>
+On 64-bit architectures: 3 words</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Binary</cell>
+ <cell align="left" valign="middle">3..6 + data (can be shared)</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">List</cell>
+ <cell align="left" valign="middle">1 word per element + the size of each element</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">String (is the same as a list of integers)</cell>
+ <cell align="left" valign="middle">2 words per character</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Tuple</cell>
+ <cell align="left" valign="middle">2 words + the size of each element</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Pid</cell>
+ <cell align="left" valign="middle">1 word for a process identifier from the current local node, and 5 words for a process identifier from another node. Note: a process identifier refers into a process table and a node table which also consumes memory.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Port</cell>
+ <cell align="left" valign="middle">1 word for a port identifier from the current local node, and 5 words for a port identifier from another node. Note: a port identifier refers into a port table and a node table which also consumes memory.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Reference</cell>
+ <cell align="left" valign="middle">On 32-bit architectures: 5 words for a reference from the current local node, and 7 words for a reference from another node. <br></br>
+On 64-bit architectures: 4 words for a reference from the current local node, and 6 words for a reference from another node. Note: a reference refers into a node table which also consumes memory.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Fun</cell>
+ <cell align="left" valign="middle">9..13 words + size of environment. Note: a fun refers into a fun table which also consumes memory.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Ets table</cell>
+ <cell align="left" valign="middle">Initially 768 words + the size of each element (6 words + size of Erlang data). The table will grow when necessary.</cell>
+ </row>
+ <row>
+ <cell align="left" valign="middle">Erlang process</cell>
+ <cell align="left" valign="middle">327 words when spawned including a heap of 233 words.</cell>
+ </row>
+ <tcaption>Memory size of different data types</tcaption>
+ </table>
+ </section>
+
+ <section>
+ <title>System limits</title>
+ <p>The Erlang language specification puts no limits on number of processes,
+ length of atoms etc., but for performance and memory saving reasons,
+ there will always be limits in a practical implementation of the Erlang
+ language and execution environment.</p>
+ <taglist>
+ <tag><em>Processes</em></tag>
+ <item>
+ <p>The maximum number of simultaneously alive Erlang processes is
+ by default 32768. This limit can be raised up to at most 268435456
+ processes at startup (see documentation of the system flag
+ <seealso marker="erts:erl#max_processes">+P</seealso> in the
+ <seealso marker="erts:erl">erl(1)</seealso> documentation).
+ The maximum limit of 268435456 processes will at least on a 32-bit
+ architecture be impossible to reach due to memory shortage.</p>
+ </item>
+ <tag><em>Distributed nodes</em></tag>
+ <item>
+ <taglist>
+ <tag>Known nodes</tag>
+ <item>
+ <p>A remote node Y has to be known to node X if there exist
+ any pids, ports, references, or funs (Erlang data types) from Y
+ on X, or if X and Y are connected. The maximum number of remote
+ nodes simultaneously/ever known to a node is limited by the
+ <seealso marker="#atoms">maximum number of atoms</seealso>
+ available for node names. All data concerning remote nodes,
+ except for the node name atom, are garbage-collected.</p>
+ </item>
+ <tag>Connected nodes</tag>
+ <item>The maximum number of simultaneously connected nodes is limited by
+ either the maximum number of simultaneously known remote nodes,
+ <seealso marker="#ports">the maximum number of (Erlang) ports</seealso>
+ available, or
+ <seealso marker="#files_sockets">the maximum number of sockets</seealso>
+ available.</item>
+ </taglist>
+ </item>
+ <tag><em>Characters in an atom</em></tag>
+ <item>255</item>
+ <tag><em>Atoms </em></tag>
+ <item> <marker id="atoms"></marker>
+The maximum number of atoms is 1048576. </item>
+ <tag><em>Ets-tables</em></tag>
+ <item>The default is 1400, can be changed with the environment variable <c>ERL_MAX_ETS_TABLES</c>.</item>
+ <tag><em>Elements in a tuple</em></tag>
+ <item>The maximum number of elements in a tuple is 67108863 (26 bit unsigned integer). Other factors
+ such as the available memory can of course make it hard to create a tuple of that size. </item>
+ <tag><em>Size of binary</em></tag>
+ <item>In the 32-bit implementation of Erlang, 536870911 bytes is the
+ largest binary that can be constructed or matched using the bit syntax.
+ (In the 64-bit implementation, the maximum size is 2305843009213693951 bytes.)
+ If the limit is exceeded, bit syntax construction will fail with a
+ <c>system_limit</c> exception, while any attempt to match a binary that is
+ too large will fail.
+ This limit is enforced starting with the R11B-4 release; in earlier releases,
+ operations on too large binaries would in general either fail or give incorrect
+ results.
+ In future releases of Erlang/OTP, other operations that create binaries (such as
+ <c>list_to_binary/1</c>) will probably also enforce the same limit.</item>
+ <tag><em>Total amount of data allocated by an Erlang node</em></tag>
+ <item>The Erlang runtime system can use the complete 32 (or 64) bit address space,
+ but the operating system often limits a single process to use less than that.</item>
+ <tag><em>length of a node name</em></tag>
+ <item>An Erlang node name has the form host@shortname or host@longname. The node name is
+ used as an atom within the system so the maximum size of 255 holds for the node name too.</item>
+ <tag><em>Open ports</em></tag>
+ <item>
+ <marker id="ports"></marker>
+ <p>The maximum number of simultaneously open Erlang ports is
+ by default 1024. This limit can be raised up to at most 268435456
+ at startup (see environment variable
+ <seealso marker="erts:erlang#ERL_MAX_PORTS">ERL_MAX_PORTS</seealso>
+ in <seealso marker="erts:erlang">erlang(3)</seealso>)
+ The maximum limit of 268435456 open ports will at least on a 32-bit
+ architecture be impossible to reach due to memory shortage.</p>
+ </item>
+ <tag><em>Open files, and sockets</em></tag>
+ <item> <marker id="files_sockets"></marker>
+
+ The maximum number of simultaneously open files and sockets
+ depend on
+ <seealso marker="#ports">the maximum number of Erlang ports</seealso>
+ available, and operating system specific settings and limits.</item>
+ <tag><em>Number of arguments to a function or fun</em></tag>
+ <item>256</item>
+ </taglist>
+ </section>
+</chapter>
+