Provided by: erlang-base_18.3-dfsg-1ubuntu3.1_amd64 bug

NAME

       erl - The Erlang Emulator

DESCRIPTION

       The  erl  program starts an Erlang runtime system. The exact details (for example, whether
       erl is a script or a program and which other programs it calls) are system-dependent.

       Windows users probably wants to use the werl program instead, which runs in its own window
       with  scrollbars and supports command-line editing. The erl program on Windows provides no
       line editing in its shell, and on Windows 95 there is no way to scroll back to text  which
       has scrolled off the screen. The erl program must be used, however, in pipelines or if you
       want to redirect standard input or output.

   Note:
       As of ERTS version 5.9 (OTP-R15B) the runtime system will by default not  bind  schedulers
       to logical processors. For more information see documentation of the +sbt system flag.

EXPORTS

       erl <arguments>

              Starts an Erlang runtime system.

              The arguments can be divided into emulator flags, flags and plain arguments:

                * Any argument starting with the character + is interpreted as an emulator flag.

                  As indicated by the name, emulator flags controls the behavior of the emulator.

                * Any  argument  starting  with the character - (hyphen) is interpreted as a flag
                  which should be  passed  to  the  Erlang  part  of  the  runtime  system,  more
                  specifically to the init system process, see init(3erl).

                  The init process itself interprets some of these flags, the init flags. It also
                  stores any remaining flags, the user flags. The  latter  can  be  retrieved  by
                  calling init:get_argument/1.

                  It  can  be noted that there are a small number of "-" flags which now actually
                  are emulator flags, see the description below.

                * Plain arguments are not interpreted in any way. They are  also  stored  by  the
                  init  process and can be retrieved by calling init:get_plain_arguments/0. Plain
                  arguments can occur before the first flag, or after a  --  flag.  Additionally,
                  the flag -extra causes everything that follows to become plain arguments.

              Example:

              % erl +W w -sname arnie +R 9 -s my_init -extra +bertie
              (arnie@host)1> init:get_argument(sname).
              {ok,[["arnie"]]}
              (arnie@host)2> init:get_plain_arguments().
              ["+bertie"]

              Here  +W  w and +R 9 are emulator flags. -s my_init is an init flag, interpreted by
              init. -sname arnie is a user flag, stored by init. It is read by  Kernel  and  will
              cause  the  Erlang  runtime system to become distributed. Finally, everything after
              -extra (that is, +bertie) is considered as plain arguments.

              % erl -myflag 1
              1> init:get_argument(myflag).
              {ok,[["1"]]}
              2> init:get_plain_arguments().
              []

              Here the user flag -myflag 1 is passed to and stored by the init process. It  is  a
              user defined flag, presumably used by some user defined application.

FLAGS

       In  the following list, init flags are marked (init flag). Unless otherwise specified, all
       other  flags  are  user  flags,  for  which  the  values  can  be  retrieved  by   calling
       init:get_argument/1.  Note  that  the  list  of user flags is not exhaustive, there may be
       additional, application specific flags which instead are documented in  the  corresponding
       application documentation.

         --(init flag):
           Everything  following  --  up  to  the  next flag (-flag or +flag) is considered plain
           arguments and can be retrieved using init:get_plain_arguments/0.

         -Application Par Val:
           Sets the application configuration parameter Par to the value Val for the  application
           Application, see app(5) and application(3erl).

         -args_file FileName:
           Command  line  arguments  are read from the file FileName. The arguments read from the
           file replace the '-args_file FileName' flag on the resulting command line.

           The file FileName should be a plain text file and may  contain  comments  and  command
           line  arguments.  A  comment begins with a # character and continues until next end of
           line character. Backslash  (\\)  is  used  as  quoting  character.  All  command  line
           arguments  accepted  by erl are allowed, also the -args_file FileName flag. Be careful
           not to cause circular dependencies  between  files  containing  the  -args_file  flag,
           though.

           The -extra flag is treated specially. Its scope ends at the end of the file. Arguments
           following an -extra flag are moved on the command line into the -extra  section,  i.e.
           the end of the command line following after an -extra flag.

         -async_shell_start:
           The  initial Erlang shell does not read user input until the system boot procedure has
           been completed (Erlang 5.4 and later). This flag disables  the  start  synchronization
           feature and lets the shell start in parallel with the rest of the system.

         -boot File:
           Specifies the name of the boot file, File.boot, which is used to start the system. See
           init(3erl). Unless File contains an absolute path, the system searches  for  File.boot
           in the current and $ROOT/bin directories.

           Defaults to $ROOT/bin/start.boot.

         -boot_var Var Dir:
           If  the  boot  script  contains a path variable Var other than $ROOT, this variable is
           expanded to Dir. Used when  applications  are  installed  in  another  directory  than
           $ROOT/lib, see systools:make_script/1,2.

         -code_path_cache:
           Enables the code path cache of the code server, see code(3erl).

         -compile Mod1 Mod2 ...:
           Compiles  the  specified  modules  and then terminates (with non-zero exit code if the
           compilation of some file did not succeed). Implies -noinput.  Not  recommended  -  use
           erlc instead.

         -config Config:
           Specifies  the name of a configuration file, Config.config, which is used to configure
           applications. See app(5) and application(3erl).

         -connect_all false:
           If this flag is present, global  will  not  maintain  a  fully  connected  network  of
           distributed  Erlang  nodes,  and  then  global  name  registration cannot be used. See
           global(3erl).

         -cookie Cookie:
           Obsolete flag without any effect and common misspelling for -setcookie. Use -setcookie
           instead.

         -detached:
           Starts  the Erlang runtime system detached from the system console. Useful for running
           daemons and backgrounds processes. Implies -noinput.

         -emu_args:
           Useful for debugging. Prints out the actual arguments sent to the emulator.

         -env Variable Value:
           Sets the host OS environment variable Variable to  the  value  Value  for  the  Erlang
           runtime system. Example:

         % erl -env DISPLAY gin:0

           In  this  example,  an  Erlang  runtime system is started with the DISPLAY environment
           variable set to gin:0.

         -eval Expr(init flag):
           Makes init evaluate the expression Expr, see init(3erl).

         -extra(init flag):
           Everything following -extra is considered plain arguments and can be  retrieved  using
           init:get_plain_arguments/0.

         -heart:
           Starts heart beat monitoring of the Erlang runtime system. See heart(3erl).

         -hidden:
           Starts the Erlang runtime system as a hidden node, if it is run as a distributed node.
           Hidden nodes always establish hidden connections to all other nodes except  for  nodes
           in  the  same  global  group.  Hidden  connections  are not published on either of the
           connected nodes, i.e. neither of the connected nodes  are  part  of  the  result  from
           nodes/0 on the other node. See also hidden global groups, global_group(3erl).

         -hosts Hosts:
           Specifies the IP addresses for the hosts on which Erlang boot servers are running, see
           erl_boot_server(3erl). This flag is mandatory if the -loader inet flag is present.

           The IP addresses must be given in the standard form (four decimal numbers separated by
           periods,  for example "150.236.20.74". Hosts names are not acceptable, but a broadcast
           address (preferably limited to the local network) is.

         -id Id:
           Specifies the identity of the Erlang runtime system. If it is  run  as  a  distributed
           node,  Id  must  be  identical  to the name supplied together with the -sname or -name
           flag.

         -init_debug:
           Makes init write some debug information while interpreting the boot script.

         -instr(emulator flag):
           Selects an instrumented Erlang runtime system (virtual machine) to run, instead of the
           ordinary  one.  When  running an instrumented runtime system, some resource usage data
           can be obtained and analysed using the module  instrument.  Functionally,  it  behaves
           exactly like an ordinary Erlang runtime system.

         -loader Loader:
           Specifies  the  method used by erl_prim_loader to load Erlang modules into the system.
           See erl_prim_loader(3erl). Two Loader methods are supported,  efile  and  inet.  efile
           means  use the local file system, this is the default. inet means use a boot server on
           another machine, and the -id, -hosts and -setcookie flags must be specified  as  well.
           If Loader is something else, the user supplied Loader port program is started.

         -make:
           Makes the Erlang runtime system invoke make:all() in the current working directory and
           then terminate. See make(3erl). Implies -noinput.

         -man Module:
           Displays the manual page for the Erlang module Module. Only supported on Unix.

         -mode interactive | embedded:
           Indicates if the system should load code dynamically (interactive),  or  if  all  code
           should  be loaded during system initialization (embedded), see code(3erl). Defaults to
           interactive.

         -name Name:
           Makes the Erlang runtime system into a distributed node. This flag invokes all network
           servers  necessary  for a node to become distributed. See net_kernel(3erl). It is also
           ensured that epmd runs on the current host before Erlang is started. See epmd(1).

           The name of the node will be Name@Host, where Host is the fully qualified host name of
           the current host. For short names, use the -sname flag instead.

         -noinput:
           Ensures  that  the  Erlang  runtime  system  never  tries  to  read any input. Implies
           -noshell.

         -noshell:
           Starts an Erlang runtime system with no shell. This flag makes it possible to have the
           Erlang runtime system as a component in a series of UNIX pipes.

         -nostick:
           Disables the sticky directory facility of the Erlang code server, see code(3erl).

         -oldshell:
           Invokes the old Erlang shell from Erlang 3.3. The old shell can still be used.

         -pa Dir1 Dir2 ...:
           Adds  the  specified  directories  to  the  beginning  of  the  code  path, similar to
           code:add_pathsa/1. See code(3erl). As an alternative to -pa,  if  several  directories
           are  to  be  prepended  to  the  code  path  and  the directories have a common parent
           directory, that parent directory  could  be  specified  in  the  ERL_LIBS  environment
           variable. See code(3erl).

         -pz Dir1 Dir2 ...:
           Adds   the   specified   directories   to  the  end  of  the  code  path,  similar  to
           code:add_pathsz/1. See code(3erl).

         -path Dir1 Dir2 ...:
           Replaces the path specified in the boot script. See script(5).

         -proto_dist Proto:
           Specify a protocol for Erlang distribution.

           inet_tcp:
             TCP over IPv4 (the default)

           inet_tls:
             distribution over TLS/SSL

           inet6_tcp:
             TCP over IPv6

           For example, to start up IPv6 distributed nodes:

         % erl -name test@ipv6node.example.com -proto_dist inet6_tcp

         -remsh Node:
           Starts Erlang with a remote shell connected to Node.

         -rsh Program:
           Specifies an alternative to rsh for starting a  slave  node  on  a  remote  host.  See
           slave(3erl).

         -run Mod [Func [Arg1, Arg2, ...]](init flag):
           Makes  init  call  the specified function. Func defaults to start. If no arguments are
           provided, the function is assumed to be of arity 0. Otherwise it is assumed to  be  of
           arity  1,  taking  the  list  [Arg1,Arg2,...] as argument. All arguments are passed as
           strings. See init(3erl).

         -s Mod [Func [Arg1, Arg2, ...]](init flag):
           Makes init call the specified function. Func defaults to start. If  no  arguments  are
           provided,  the  function is assumed to be of arity 0. Otherwise it is assumed to be of
           arity 1, taking the list [Arg1,Arg2,...] as argument.  All  arguments  are  passed  as
           atoms. See init(3erl).

         -setcookie Cookie:
           Sets the magic cookie of the node to Cookie, see erlang:set_cookie/2.

         -shutdown_time Time:
           Specifies  how  long  time  (in  milliseconds)  the  init  process is allowed to spend
           shutting down the system. If Time ms have elapsed, all processes  still  existing  are
           killed. Defaults to infinity.

         -sname Name:
           Makes  the  Erlang  runtime  system into a distributed node, similar to -name, but the
           host name portion of the node name  Name@Host  will  be  the  short  name,  not  fully
           qualified.

           This  is  sometimes  the  only  way  to run distributed Erlang if the DNS (Domain Name
           System) is not running. There can be no communication between nodes running  with  the
           -sname  flag  and  those  running with the -name flag, as node names must be unique in
           distributed Erlang systems.

         -smp [enable|auto|disable]:
           -smp enable and -smp starts the Erlang runtime system with SMP support  enabled.  This
           may  fail  if  no  runtime  system with SMP support is available. -smp auto starts the
           Erlang runtime system with SMP support enabled if it is available and  more  than  one
           logical  processor  are  detected.  -smp  disable  starts a runtime system without SMP
           support.

           NOTE: The runtime system with SMP support will  not  be  available  on  all  supported
           platforms. See also the +S flag.

         -version(emulator flag):
           Makes the emulator print out its version number. The same as erl +V.

EMULATOR FLAGS

       erl  invokes  the  code  for  the  Erlang  emulator  (virtual machine), which supports the
       following flags:

         +a size:
           Suggested stack size, in kilowords, for threads in the async-thread pool. Valid  range
           is  16-8192  kilowords.  The  default  suggested  stack  size is 16 kilowords, i.e, 64
           kilobyte on 32-bit architectures. This small default size has been  chosen  since  the
           amount  of  async-threads might be quite large. The default size is enough for drivers
           delivered with Erlang/OTP, but might not be sufficiently large for  other  dynamically
           linked  in  drivers  that  use  the  driver_async() functionality. Note that the value
           passed is only a suggestion, and it might even be ignored on some platforms.

         +A size:
           Sets the number of threads in async thread pool, valid  range  is  0-1024.  If  thread
           support is available, the default is 10.

         +B [c | d | i]:
           The c option makes Ctrl-C interrupt the current shell instead of invoking the emulator
           break handler. The d option (same as specifying +B without an extra  option)  disables
           the break handler. The i option makes the emulator ignore any break signal.

           If  the  c option is used with oldshell on Unix, Ctrl-C will restart the shell process
           rather than interrupt it.

           Note that on Windows, this flag is only applicable for werl, not erl (oldshell).  Note
           also that Ctrl-Break is used instead of Ctrl-C on Windows.

         +c true | false:
           Enable or disable time correction:

           true:
             Enable  time  correction. This is the default if time correction is supported on the
             specific platform.

           false:
             Disable time correction.

           For backwards compatibility, the boolean value can be omitted. This is interpreted  as
           +c false.

         +C no_time_warp | single_time_warp | multi_time_warp:
           Set time warp mode:

           no_time_warp:
             No Time Warp Mode (the default)

           single_time_warp:
             Single Time Warp Mode

           multi_time_warp:
             Multi Time Warp Mode

         +d:
           If  the emulator detects an internal error (or runs out of memory), it will by default
           generate both a crash dump and a core dump. The core dump will, however, not  be  very
           useful since the content of process heaps is destroyed by the crash dump generation.

           The  +d option instructs the emulator to only produce a core dump and no crash dump if
           an internal error is detected.

           Calling erlang:halt/1 with a string argument will still produce a crash dump. On  Unix
           systems, sending an emulator process a SIGUSR1 signal will also force a crash dump.

         +e Number:
           Set max number of ETS tables.

         +ec:
           Force the compressed option on all ETS tables. Only intended for test and evaluation.

         +fnl:
           The  VM  works  with file names as if they are encoded using the ISO-latin-1 encoding,
           disallowing Unicode characters with codepoints beyond 255.

           See STDLIB User's Guide for more infomation about unicode file names. Note  that  this
           value  also  applies  to command-line parameters and environment variables (see STDLIB
           User's Guide).

         +fnu[{w|i|e}]:
           The VM works with file names as if they are encoded using UTF-8 (or some other  system
           specific  Unicode  encoding).  This  is  the default on operating systems that enforce
           Unicode encoding, i.e. Windows and MacOS X.

           The +fnu switch can be followed by w, i, or e to control the way wrongly encoded  file
           names  are to be reported. w means that a warning is sent to the error_logger whenever
           a wrongly encoded file name is "skipped" in directory listings,  i  means  that  those
           wrongly encoded file names are silently ignored and e means that the API function will
           return an error whenever a wrongly encoded file (or directory) name is encountered.  w
           is  the  default.  Note  that file:read_link/1 will always return an error if the link
           points to an invalid file name.

           See STDLIB User's Guide for more infomation about unicode file names. Note  that  this
           value  also  applies  to command-line parameters and environment variables (see STDLIB
           User's Guide).

         +fna[{w|i|e}]:
           Selection between +fnl and +fnu is done based on the current locale  settings  in  the
           OS,  meaning  that if you have set your terminal for UTF-8 encoding, the filesystem is
           expected to use the same encoding for file names. This is  default  on  all  operating
           systems except MacOS X and Windows.

           The  +fna  switch  can  be followed by w, i, or e. This will have effect if the locale
           settings cause the behavior of +fnu to be selected. See the description of +fnu above.
           If the locale settings cause the behavior of +fnl to be selected, then w, i, or e will
           not have any effect.

           See STDLIB User's Guide for more infomation about unicode file names. Note  that  this
           value  also  applies  to command-line parameters and environment variables (see STDLIB
           User's Guide).

         +hms Size:
           Sets the default heap size of processes to the size Size.

         +hmbs Size:
           Sets the default binary virtual heap size of processes to the size Size.

         +hpds Size:
           Sets the initial process dictionary size of processes to the size Size.

         +K true | false:
           Enables or disables the kernel poll functionality if the emulator supports it. Default
           is  false (disabled). If the emulator does not support kernel poll, and the +K flag is
           passed to the emulator, a warning is issued at startup.

         +l:
           Enables auto load tracing, displaying info while loading code.

         +L:
           Don't load information about source file names and line numbers. This will  save  some
           memory,  but  exceptions  will  not  contain information about the file names and line
           numbers.

         +MFlag Value:
           Memory allocator specific flags, see erts_alloc(3erl) for further information.

         +n Behavior:
           Control behavior of signals to ports.

           As of OTP-R16 signals to ports are truly asynchronously delivered. Note  that  signals
           always  have  been  documented  as  asynchronous.  The  underlying implementation has,
           however, previously delivered these signals synchronously.  Correctly  written  Erlang
           programs  should  be  able  to handle this without any issues. Bugs in existing Erlang
           programs that make false assumptions about signals to ports may, however, be tricky to
           find.  This  switch has been introduced in order to at least make it easier to compare
           behaviors during a transition period. Note that this flag  is  deprecated  as  of  its
           introduction,  and  is scheduled for removal in OTP-R17. Behavior should be one of the
           following characters:

           d:
             The default. Asynchronous signals. A process that sends  a  signal  to  a  port  may
             continue execution before the signal has been delivered to the port.

           s:
             Synchronous  signals.  A  processes  that sends a signal to a port will not continue
             execution until the signal has been delivered. Should only be used for  testing  and
             debugging.

           a:
             Asynchronous  signals. As the default, but a processes that sends a signal will even
             more frequently continue execution before the signal has been delivered to the port.
             Should only be used for testing and debugging.

         +pc Range:
           Sets  the  range  of  characters  that the system will consider printable in heuristic
           detection of strings.  This  typically  affects  the  shell,  debugger  and  io:format
           functions (when ~tp is used in the format string).

           Currently two values for the Range are supported:

           latin1:
             The  default.  Only characters in the ISO-latin-1 range can be considered printable,
             which means that a character with a code  point  >  255  will  never  be  considered
             printable  and  that  lists containing such characters will be displayed as lists of
             integers rather than text strings by tools.

           unicode:
             All printable Unicode characters are  considered  when  determining  if  a  list  of
             integers  is  to  be displayed in string syntax. This may give unexpected results if
             for example your font does not cover all Unicode characters.

           Se also  io:printable_range/0.

         +P Number|legacy:
           Sets the maximum number of simultaneously existing processes  for  this  system  if  a
           Number is passed as value. Valid range for Number is [1024-134217727]

           NOTE:  The  actual maximum chosen may be much larger than the Number passed. Currently
           the runtime system often, but not always, chooses a value that is a power of  2.  This
           might,  however,  be  changed in the future. The actual value chosen can be checked by
           calling erlang:system_info(process_limit).

           The default value is 262144

           If legacy is  passed  as  value,  the  legacy  algorithm  for  allocation  of  process
           identifiers will be used. Using the legacy algorithm, identifiers will be allocated in
           a strictly increasing fashion until largest possible identifier has been reached. Note
           that   this   algorithm   suffers  from  performance  issues  and  can  under  certain
           circumstances be extremely expensive. The  legacy  algoritm  is  deprecated,  and  the
           legacy option is scheduled for removal in OTP-R18.

         +Q Number|legacy:
           Sets  the  maximum number of simultaneously existing ports for this system if a Number
           is passed as value. Valid range for Number is [1024-134217727]

           NOTE: The actual maximum chosen may be much larger  than  the  actual  Number  passed.
           Currently the runtime system often, but not always, chooses a value that is a power of
           2. This might, however, be changed in the future.  The  actual  value  chosen  can  be
           checked by calling erlang:system_info(port_limit).

           The  default  value  used is normally 65536. However, if the runtime system is able to
           determine maximum amount of file descriptors that it is allowed to open and this value
           is  larger  than  65536, the chosen value will increased to a value larger or equal to
           the maximum amount of file descriptors that can be opened.

           On Windows the default value is set to 8196 because the normal OS limitations are  set
           higher than most machines can handle.

           Previously  the  environment  variable  ERL_MAX_PORTS was used for setting the maximum
           number of simultaneously existing ports. This environment variable is deprecated,  and
           scheduled for removal in OTP-R17, but can still be used.

           If  legacy is passed as value, the legacy algorithm for allocation of port identifiers
           will be used. Using the legacy algorithm, identifiers will be allocated in a  strictly
           increasing  fashion until largest possible identifier has been reached. Note that this
           algorithm suffers from performance issues  and  can  under  certain  circumstances  be
           extremely  expensive.  The  legacy  algoritm  is  deprecated, and the legacy option is
           scheduled for removal in OTP-R18.

         +R ReleaseNumber:
           Sets the compatibility mode.

           The distribution mechanism is not backwards compatible by default. This flags sets the
           emulator  in  compatibility mode with an earlier Erlang/OTP release ReleaseNumber. The
           release number must be in  the  range  <current  release>-2..<current  release>.  This
           limits  the  emulator,  making it possible for it to communicate with Erlang nodes (as
           well as C- and Java nodes) running that earlier release.

           Note: Make sure all nodes (Erlang-, C-, and Java nodes) of a distributed Erlang system
           is  of the same Erlang/OTP release, or from two different Erlang/OTP releases X and Y,
           where all Y nodes have compatibility mode X.

         +r:
           Force ets memory block to be moved on realloc.

         +rg ReaderGroupsLimit:
           Limits the amount of reader  groups  used  by  read/write  locks  optimized  for  read
           operations in the Erlang runtime system. By default the reader groups limit equals 64.

           When  the  amount of schedulers is less than or equal to the reader groups limit, each
           scheduler has its own reader group. When the amount of schedulers is larger  than  the
           reader  groups  limit,  schedulers  share reader groups. Shared reader groups degrades
           read lock and read unlock performance while a large amount of reader  groups  degrades
           write  lock  performance,  so  the  limit  is  a tradeoff between performance for read
           operations and performance for write operations. Each reader group currently  consumes
           64  byte  in each read/write lock. Also note that a runtime system using shared reader
           groups benefits from binding schedulers to logical processors, since the reader groups
           are distributed better between schedulers.

         +S Schedulers:SchedulerOnline:
           Sets  the  number  of  scheduler threads to create and scheduler threads to set online
           when SMP support has been enabled. The maximum for both values is 1024. If the  Erlang
           runtime  system  is  able to determine the amount of logical processors configured and
           logical  processors  available,  Schedulers  will  default   to   logical   processors
           configured,  and  SchedulersOnline  will  default  to  logical  processors  available;
           otherwise, the default values will be 1. Schedulers may be omitted if :SchedulerOnline
           is  not and vice versa. The number of schedulers online can be changed at run time via
           erlang:system_flag(schedulers_online, SchedulersOnline).

           If Schedulers or SchedulersOnline is specified as a  negative  number,  the  value  is
           subtracted  from  the  default  number  of  logical  processors  configured or logical
           processors available, respectively.

           Specifying the value 0  for  Schedulers  or  SchedulersOnline  resets  the  number  of
           scheduler threads or scheduler threads online respectively to its default value.

           This  option is ignored if the emulator doesn't have SMP support enabled (see the -smp
           flag).

         +SP SchedulersPercentage:SchedulersOnlinePercentage:
           Similar to +S but uses percentages to set the number of scheduler threads  to  create,
           based  on logical processors configured, and scheduler threads to set online, based on
           logical processors available, when SMP support has been enabled. Specified values must
           be  greater than 0. For example, +SP 50:25 sets the number of scheduler threads to 50%
           of the logical processors configured and the number of scheduler threads online to 25%
           of   the   logical  processors  available.  SchedulersPercentage  may  be  omitted  if
           :SchedulersOnlinePercentage is not and vice versa. The number of schedulers online can
           be changed at run time via erlang:system_flag(schedulers_online, SchedulersOnline).

           This  option interacts with +S settings. For example, on a system with 8 logical cores
           configured and 8 logical cores available, the combination of the options  +S  4:4  +SP
           50:25  (in  either  order)  results  in 2 scheduler threads (50% of 4) and 1 scheduler
           thread online (25% of 4).

           This option is ignored if the emulator doesn't have SMP support enabled (see the  -smp
           flag).

         +SDcpu DirtyCPUSchedulers:DirtyCPUSchedulersOnline:
           Sets  the  number  of  dirty  CPU  scheduler threads to create and dirty CPU scheduler
           threads to set online when threading support has been enabled. The  maximum  for  both
           values  is  1024,  and  each  value  is  further  limited  by  the settings for normal
           schedulers: the number of dirty CPU scheduler threads created cannot exceed the number
           of  normal  scheduler  threads  created, and the number of dirty CPU scheduler threads
           online cannot exceed the number of normal scheduler threads online (see the +S and +SP
           flags for more details). By default, the number of dirty CPU scheduler threads created
           equals the number of normal scheduler threads created, and the  number  of  dirty  CPU
           scheduler  threads  online  equals  the  number  of  normal  scheduler threads online.
           DirtyCPUSchedulers may be omitted if :DirtyCPUSchedulersOnline is not and vice  versa.
           The   number  of  dirty  CPU  schedulers  online  can  be  changed  at  run  time  via
           erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline).

           This option is ignored  if  the  emulator  doesn't  have  threading  support  enabled.
           Currently,  this  option  is  experimental  and  is supported only if the emulator was
           configured and built with support for  dirty  schedulers  enabled  (it's  disabled  by
           default).

         +SDPcpu DirtyCPUSchedulersPercentage:DirtyCPUSchedulersOnlinePercentage:
           Similar  to  +SDcpu  but  uses  percentages  to  set the number of dirty CPU scheduler
           threads to create and number of  dirty  CPU  scheduler  threads  to  set  online  when
           threading  support  has  been  enabled.  Specified  values must be greater than 0. For
           example, +SDPcpu 50:25 sets the number of dirty CPU scheduler threads to  50%  of  the
           logical  processors configured and the number of dirty CPU scheduler threads online to
           25% of the logical processors available. DirtyCPUSchedulersPercentage may  be  omitted
           if  :DirtyCPUSchedulersOnlinePercentage is not and vice versa. The number of dirty CPU
           schedulers     online     can      be      changed      at      run      time      via
           erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline).

           This  option  interacts  with +SDcpu settings. For example, on a system with 8 logical
           cores configured and 8 logical cores available, the combination of the options  +SDcpu
           4:4  +SDPcpu  50:25 (in either order) results in 2 dirty CPU scheduler threads (50% of
           4) and 1 dirty CPU scheduler thread online (25% of 4).

           This option is ignored  if  the  emulator  doesn't  have  threading  support  enabled.
           Currently,  this  option  is  experimental  and  is supported only if the emulator was
           configured and built with support for  dirty  schedulers  enabled  (it's  disabled  by
           default).

         +SDio IOSchedulers:
           Sets  the  number  of dirty I/O scheduler threads to create when threading support has
           been enabled. The valid range is 0-1024. By default, the number of dirty I/O scheduler
           threads  created is 10, same as the default number of threads in the async thread pool
           .

           This option is ignored  if  the  emulator  doesn't  have  threading  support  enabled.
           Currently,  this  option  is  experimental  and  is supported only if the emulator was
           configured and built with support for  dirty  schedulers  enabled  (it's  disabled  by
           default).

         +sFlag Value:
           Scheduling specific flags.

           +sbt BindType:
             Set scheduler bind type.

             Schedulers can also be bound using the +stbt flag. The only difference between these
             two flags is how the following errors are handled:

             * Binding of schedulers is not supported on the specific platform.

             * No  available  CPU  topology.  That  is  the  runtime  system  was  not  able   to
               automatically detected the CPU topology, and no user defined CPU topology was set.

             If  any  of  these  errors  occur when +sbt has been passed, the runtime system will
             print an error message, and refuse to start. If any of these errors occur when +stbt
             has  been  passed,  the  runtime system will silently ignore the error, and start up
             using unbound schedulers.

             Currently valid BindTypes:

             u:
               unbound - Schedulers will not be bound to logical processors, i.e., the  operating
               system decides where the scheduler threads execute, and when to migrate them. This
               is the default.

             ns:
               no_spread - Schedulers with close scheduler identifiers will be bound as close  as
               possible in hardware.

             ts:
               thread_spread  -  Thread  refers to hardware threads (e.g. Intel's hyper-threads).
               Schedulers with low scheduler identifiers, will be bound  to  the  first  hardware
               thread  of  each  core,  then schedulers with higher scheduler identifiers will be
               bound to the second hardware thread of each core, etc.

             ps:
               processor_spread - Schedulers will be spread like  thread_spread,  but  also  over
               physical processor chips.

             s:
               spread - Schedulers will be spread as much as possible.

             nnts:
               no_node_thread_spread  -  Like  thread_spread,  but  if multiple NUMA (Non-Uniform
               Memory Access) nodes exists, schedulers will be spread over one  NUMA  node  at  a
               time, i.e., all logical processors of one NUMA node will be bound to schedulers in
               sequence.

             nnps:
               no_node_processor_spread - Like  processor_spread,  but  if  multiple  NUMA  nodes
               exists,  schedulers will be spread over one NUMA node at a time, i.e., all logical
               processors of one NUMA node will be bound to schedulers in sequence.

             tnnps:
               thread_no_node_processor_spread   -   A   combination   of   thread_spread,    and
               no_node_processor_spread.  Schedulers  will be spread over hardware threads across
               NUMA nodes, but schedulers will only be spread over processors internally  in  one
               NUMA node at a time.

             db:
               default_bind  -  Binds  schedulers  the  default  way.  Currently  the  default is
               thread_no_node_processor_spread (which might change in the future).

             Binding of schedulers is currently only supported on newer Linux, Solaris,  FreeBSD,
             and Windows systems.

             If  no CPU topology is available when the +sbt flag is processed and BindType is any
             other type than u, the runtime system will  fail  to  start.  CPU  topology  can  be
             defined  using  the  +sct flag. Note that the +sct flag may have to be passed before
             the +sbt flag on the command line (in case no CPU topology  has  been  automatically
             detected).

             The runtime system will by default not bind schedulers to logical processors.

             NOTE:  If  the Erlang runtime system is the only operating system process that binds
             threads to logical processors, this improves the performance of the runtime  system.
             However,  if other operating system processes (as for example another Erlang runtime
             system) also bind threads to  logical  processors,  there  might  be  a  performance
             penalty  instead. In some cases this performance penalty might be severe. If this is
             the case, you are advised to not bind the schedulers.

             How schedulers are bound matters. For example, in situations when  there  are  fewer
             running  processes  than  schedulers  online,  the  runtime  system tries to migrate
             processes to schedulers with low scheduler identifiers. The more the schedulers  are
             spread over the hardware, the more resources will be available to the runtime system
             in such situations.

             NOTE: If a scheduler fails to bind, this will often be silently ignored. This  since
             it  isn't always possible to verify valid logical processor identifiers. If an error
             is reported, it will be reported to the error_logger. If you want to verify that the
             schedulers       actually       have       bound       as       requested,      call
             erlang:system_info(scheduler_bindings).

           +sbwt none|very_short|short|medium|long|very_long:
             Set scheduler busy wait threshold. Default is medium. The threshold  determines  how
             long schedulers should busy wait when running out of work before going to sleep.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +scl true|false:
             Enable  or  disable scheduler compaction of load. By default scheduler compaction of
             load is enabled. When enabled, load balancing will strive for  a  load  distribution
             which causes as many scheduler threads as possible to be fully loaded (i.e., not run
             out of work). This is accomplished by migrating load (e.g. runnable processes)  into
             a  smaller  set  of  schedulers  when  schedulers  frequently  run out of work. When
             disabled, the frequency with which schedulers run out of work will not be taken into
             account by the load balancing logic.
             +scl  false  is  similar  to  +sub true with the difference that +sub true also will
             balance scheduler utilization between schedulers.

           +sct CpuTopology:

             * <Id> = integer(); when 0 =< <Id> =< 65535

             * <IdRange> = <Id>-<Id>

             * <IdOrIdRange> = <Id> | <IdRange>

             * <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>

             * <LogicalIds> = L<IdList>

             * <ThreadIds> = T<IdList> | t<IdList>

             * <CoreIds> = C<IdList> | c<IdList>

             * <ProcessorIds> = P<IdList> | p<IdList>

             * <NodeIds> = N<IdList> | n<IdList>

             * <IdDefs>     =      <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>      |
               <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>

             * CpuTopology = <IdDefs>:<IdDefs> | <IdDefs>

             Set  a  user  defined  CPU topology. The user defined CPU topology will override any
             automatically  detected  CPU  topology.  The  CPU  topology  is  used  when  binding
             schedulers to logical processors.

             Upper-case  letters  signify  real  identifiers  and lower-case letters signify fake
             identifiers only used for description of the topology. Identifiers  passed  as  real
             identifiers  may  be  used  by  the  runtime  system  when trying to access specific
             hardware and if they are not correct the behavior is undefined.  Faked  logical  CPU
             identifiers  are  not  accepted since there is no point in defining the CPU topology
             without real logical CPU identifiers. Thread, core, processor, and node  identifiers
             may  be  left  out.  If  left out, thread id defaults to t0, core id defaults to c0,
             processor id defaults to p0, and node id will be left undefined. Either each logical
             processor  must  belong to one and only one NUMA node, or no logical processors must
             belong to any NUMA nodes.

             Both increasing and decreasing <IdRange>s are allowed.

             NUMA node identifiers are system wide. That is, each NUMA node on the system have to
             have  a  unique  identifier.  Processor  identifiers  are  also  system  wide.  Core
             identifiers are processor wide. Thread identifiers are core wide.

             The order of the identifier types imply the hierarchy of  the  CPU  topology.  Valid
             orders   are   either   <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>,  or
             <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>. That is, thread is part  of
             a  core which is part of a processor which is part of a NUMA node, or thread is part
             of a core which is part of a NUMA node which is part of a processor. A cpu  topology
             can consist of both processor external, and processor internal NUMA nodes as long as
             each logical processor belongs to one and only one NUMA node. If  <ProcessorIds>  is
             left  out,  its  default  position will be before <NodeIds>. That is, the default is
             processor external NUMA nodes.

             If a list of identifiers is used in an <IdDefs>:

             * <LogicalIds> have to be a list of identifiers.

             * At least one other identifier type apart from <LogicalIds> also  have  to  have  a
               list of identifiers.

             * All lists of identifiers have to produce the same amount of identifiers.

             A simple example. A single quad core processor may be described this way:

           % erl +sct L0-3c0-3
           1> erlang:system_info(cpu_topology).
           [{processor,[{core,{logical,0}},
                        {core,{logical,1}},
                        {core,{logical,2}},
                        {core,{logical,3}}]}]

             A  little  more complicated example. Two quad core processors. Each processor in its
             own NUMA node. The ordering of logical processors is a little weird. This  in  order
             to give a better example of identifier lists:

           % erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1
           1> erlang:system_info(cpu_topology).
           [{node,[{processor,[{core,{logical,0}},
                               {core,{logical,1}},
                               {core,{logical,3}},
                               {core,{logical,2}}]}]},
            {node,[{processor,[{core,{logical,7}},
                               {core,{logical,4}},
                               {core,{logical,6}},
                               {core,{logical,5}}]}]}]

             As  long  as  real identifiers are correct it is okay to pass a CPU topology that is
             not a correct description of the CPU topology. When used with care this can actually
             be  very  useful.  This in order to trick the emulator to bind its schedulers as you
             want. For example, if you want to run multiple Erlang runtime systems  on  the  same
             machine,  you  want  to  reduce the amount of schedulers used and manipulate the CPU
             topology so that they bind to different logical CPUs. An example,  with  two  Erlang
             runtime systems on a quad core machine:

           % erl +sct L0-3c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname one
           % erl +sct L3-0c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname two

             In  this  example  each  runtime  system  have  two  schedulers each online, and all
             schedulers online will run on different cores. If we change to one scheduler  online
             on  one  runtime  system,  and  three schedulers online on the other, all schedulers
             online will still run on different cores.

             Note that a faked CPU topology that does not reflect how the real CPU topology looks
             like is likely to decrease the performance of the runtime system.

             For more information, see erlang:system_info(cpu_topology).

           +secio true|false:
             Enable  or  disable  eager  check I/O scheduling. The default is currently true. The
             default was changed from false to true as of erts version 7.0. The behaviour  before
             this flag was introduced corresponds to +secio false.

             The  flag effects when schedulers will check for I/O operations possible to execute,
             and when such I/O operations will execute. As the name  of  the  parameter  implies,
             schedulers  will  be  more  eager to check for I/O when true is passed. This however
             also implies that execution of outstanding I/O operation will not be prioritized  to
             the same extent as when false is passed.

             erlang:system_info(eager_check_io)  returns  the  value  of this parameter used when
             starting the VM.

           +sfwi Interval:
             Set scheduler forced wakeup interval. All run queues will be scanned  each  Interval
             milliseconds.  While there are sleeping schedulers in the system, one scheduler will
             be woken for each non-empty run queue found.  An  Interval  of  zero  disables  this
             feature, which also is the default.

             This feature has been introduced as a temporary workaround for long-executing native
             code, and native code that does not bump reductions properly in OTP. When these bugs
             have be fixed the +sfwi flag will be removed.

           +stbt BindType:
             Try  to set scheduler bind type. The same as the +sbt flag with the exception of how
             some errors are handled. For more information, see the  documentation  of  the  +sbt
             flag.

           +sub true|false:
             Enable  or  disable  scheduler  utilization  balancing of load. By default scheduler
             utilization balancing is disabled  and  instead  scheduler  compaction  of  load  is
             enabled  which  will  strive  for a load distribution which causes as many scheduler
             threads as possible to be fully loaded (i.e., not run out of work).  When  scheduler
             utilization  balancing  is  enabled the system will instead try to balance scheduler
             utilization between schedulers. That is, strive for equal scheduler  utilization  on
             all schedulers.
             +sub  true  is only supported on systems where the runtime system detects and uses a
             monotonically increasing high resolution clock. On other systems, the runtime system
             will fail to start.
             +sub  true  implies  +scl  false. The difference between +sub true and +scl false is
             that +scl false will not try to balance the scheduler utilization.

           +swct very_eager|eager|medium|lazy|very_lazy:
             Set scheduler wake cleanup threshold. Default is  medium.  This  flag  controls  how
             eager  schedulers  should  be  requesting wake up due to certain cleanup operations.
             When a lazy setting is used, more outstanding cleanup operations can be left  undone
             while  a  scheduler  is  idling. When an eager setting is used, schedulers will more
             frequently be woken, potentially increasing CPU-utilization.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +sws default|legacy:
             Set scheduler wakeup strategy. Default strategy changed in erts-5.10/OTP-R16A.  This
             strategy  was  previously known as proposal in OTP-R15. The legacy strategy was used
             as default from R13 up to and including R15.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +swt very_low|low|medium|high|very_high:
             Set scheduler wakeup threshold. Default is medium. The threshold determines when  to
             wake  up  sleeping  schedulers when more work than can be handled by currently awake
             schedulers exist. A low threshold will cause earlier wakeups, and a  high  threshold
             will  cause  later  wakeups.  Early  wakeups  will  distribute  work  over  multiple
             schedulers faster, but work will more easily bounce between schedulers.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +spp Bool:
             Set default scheduler hint for port  parallelism.  If  set  to  true,  the  VM  will
             schedule  port tasks when doing so will improve parallelism in the system. If set to
             false, the VM will try to perform port tasks immediately, improving latency  at  the
             expense of parallelism. If this flag has not been passed, the default scheduler hint
             for port parallelism is currently false.  The  default  used  can  be  inspected  in
             runtime   by   calling  erlang:system_info(port_parallelism).  The  default  can  be
             overriden on port creation by passing the parallelism option to open_port/2.

           +sss size:
             Suggested stack size, in kilowords, for scheduler threads.  Valid  range  is  4-8192
             kilowords. The default stack size is OS dependent.

         +t size:
           Set the maximum number of atoms the VM can handle. Default is 1048576.

         +T Level:
           Enables  modified  timing and sets the modified timing level. Currently valid range is
           0-9. The timing of the runtime system will  change.  A  high  level  usually  means  a
           greater  change  than  a low level. Changing the timing can be very useful for finding
           timing related bugs.

           Currently, modified timing affects the following:

           Process spawning:
             A process calling spawn, spawn_link, spawn_monitor, or spawn_opt will  be  scheduled
             out  immediately  after  completing the call. When higher modified timing levels are
             used, the caller will also sleep for a while after being scheduled out.

           Context reductions:
             The amount of reductions a process is a allowed to use before being scheduled out is
             increased or reduced.

           Input reductions:
             The amount of reductions performed before checking I/O is increased or reduced.

           NOTE:  Performance  will  suffer  when  modified  timing is enabled. This flag is only
           intended for testing and debugging. Also note that  return_to  and  return_from  trace
           messages  will  be  lost  when  tracing on the spawn BIFs. This flag may be removed or
           changed at any time without prior notice.

         +V:
           Makes the emulator print out its version number.

         +v:
           Verbose.

         +W w | i | e:
           Sets the mapping of warning messages for error_logger.  Messages  sent  to  the  error
           logger  using  one  of  the  warning  routines  can be mapped either to errors (+W e),
           warnings (+W w), or info reports (+W i). The default is warnings. The current  mapping
           can  be retrieved using error_logger:warning_map/0. See error_logger(3erl) for further
           information.

         +zFlag Value:
           Miscellaneous flags.

           +zdbbl size:
             Set the distribution buffer busy limit  (dist_buf_busy_limit)  in  kilobytes.  Valid
             range is 1-2097151. Default is 1024.

             A larger buffer limit will allow processes to buffer more outgoing messages over the
             distribution. When the buffer limit has been  reached,  sending  processes  will  be
             suspended  until  the  buffer  size has shrunk. The buffer limit is per distribution
             channel. A higher limit will give lower latency and higher throughput at the expense
             of higher memory usage.

           +zdntgc time:
             Set  the  delayed  node  table  garbage  collection  time (delayed_node_table_gc) in
             seconds. Valid values are either infinity or an integer in the range  [0-100000000].
             Default is 60.

             Node  table  entries that are not referred will linger in the table for at least the
             amount of time that this  parameter  determines.  The  lingering  prevents  repeated
             deletions and insertions in the tables from occurring.

ENVIRONMENT VARIABLES

         ERL_CRASH_DUMP:
           If  the  emulator  needs to write a crash dump, the value of this variable will be the
           file name of the crash dump file. If the variable is not set, the name  of  the  crash
           dump file will be erl_crash.dump in the current directory.

         ERL_CRASH_DUMP_NICE:
           Unix  systems:  If  the emulator needs to write a crash dump, it will use the value of
           this variable to set the nice value for the process, thus lowering its  priority.  The
           allowable  range is 1 through 39 (higher values will be replaced with 39). The highest
           value, 39, will give the process the lowest priority.

         ERL_CRASH_DUMP_SECONDS:
           Unix systems: This variable gives the number of seconds  that  the  emulator  will  be
           allowed  to spend writing a crash dump. When the given number of seconds have elapsed,
           the emulator will be terminated by a SIGALRM signal.

           If  the  environment  variable  is  not  set  or  it   is   set   to   zero   seconds,
           ERL_CRASH_DUMP_SECONDS=0,  the runtime system will not even attempt to write the crash
           dump file. It will just terminate.

           If the environment variable is set to negative valie, e.g.  ERL_CRASH_DUMP_SECONDS=-1,
           the runtime system will wait indefinitely for the crash dump file to be written.

           This environment variable is used in conjuction with heart if heart is running:

           ERL_CRASH_DUMP_SECONDS=0:
             Suppresses the writing a crash dump file entirely, thus rebooting the runtime system
             immediately. This is the same as not setting the environment variable.

           ERL_CRASH_DUMP_SECONDS=-1:
             Setting the environment variable to a negative value will cause the  termination  of
             the runtime system to wait until the crash dump file has been completly written.

           ERL_CRASH_DUMP_SECONDS=S:
             Will  wait  for  S  seconds  to  complete the crash dump file and then terminate the
             runtime system.

         ERL_AFLAGS:
           The content of this environment variable will be added to the beginning of the command
           line for erl.

           The  -extra  flag  is  treated specially. Its scope ends at the end of the environment
           variable content. Arguments following an -extra flag are moved  on  the  command  line
           into  the  -extra  section, i.e. the end of the command line following after an -extra
           flag.

         ERL_ZFLAGS and ERL_FLAGS:
           The content of these environment variables will be added to the  end  of  the  command
           line for erl.

           The  -extra  flag  is  treated specially. Its scope ends at the end of the environment
           variable content. Arguments following an -extra flag are moved  on  the  command  line
           into  the  -extra  section, i.e. the end of the command line following after an -extra
           flag.

         ERL_LIBS:
           This environment variable contains a list of additional library directories  that  the
           code server will search for applications and add to the code path. See code(3erl).

         ERL_EPMD_ADDRESS:
           This  environment  variable  may  be set to a comma-separated list of IP addresses, in
           which case the epmd daemon will listen only on the specified address(es)  and  on  the
           loopback address (which is implicitly added to the list if it has not been specified).

         ERL_EPMD_PORT:
           This  environment  variable can contain the port number to use when communicating with
           epmd. The default port will work fine in most cases. A different port can be specified
           to  allow  nodes  of independent clusters to co-exist on the same host. All nodes in a
           cluster must use the same epmd port number.

CONFIGURATION

       The standard Erlang/OTP system can be re-configured to  change  the  default  behavior  on
       start-up.

         The .erlang Start-up File:
           When  Erlang/OTP  is  started,  the  system  searches  for a file named .erlang in the
           directory where Erlang/OTP is started. If not found,  the  user's  home  directory  is
           searched for an .erlang file.

           If  an .erlang file is found, it is assumed to contain valid Erlang expressions. These
           expressions are evaluated as if they were input to the shell.

           A typical .erlang file contains a set of search paths, for example:

                 io:format("executing user profile in HOME/.erlang\n",[]).
                 code:add_path("/home/calvin/test/ebin").
                 code:add_path("/home/hobbes/bigappl-1.2/ebin").
                 io:format(".erlang rc finished\n",[]).

         user_default and shell_default:
           Functions in the shell which are not prefixed by a  module  name  are  assumed  to  be
           functional  objects  (Funs),  built-in  functions  (BIFs),  or  belong  to  the module
           user_default or shell_default.

           To include private shell commands, define them in a module user_default  and  add  the
           following argument as the first line in the .erlang file.

                  code:load_abs("..../user_default").

         erl:
           If  the  contents  of  .erlang  are  changed  and a private version of user_default is
           defined, it is possible to customize the Erlang/OTP environment. More powerful changes
           can  be  made by supplying command line arguments in the start-up script erl. Refer to
           erl(1) and init(3erl) for further information.

SEE ALSO

       init(3erl), erl_prim_loader(3erl), erl_boot_server(3erl),  code(3erl),  application(3erl),
       heart(3erl), net_kernel(3erl), auth(3erl), make(3erl), epmd(1), erts_alloc(3erl)