xenial (1) erl.1.gz

Provided by: erlang-base-hipe_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)