查看源代码 erl

启动 Erlang 运行时系统。

描述

erl 程序启动 Erlang 运行时系统。具体细节(例如,erl 是脚本还是程序,以及它调用哪些其他程序)取决于系统。

注意

如果您在 Windows 上使用 Erlang/OTP 25 或更早版本,并希望启动具有完整 shell 支持的 Erlang 系统,则应使用 werl.exe。有关如何执行此操作的详细信息,请参阅 Erlang/OTP 25 文档

erl <参数>

启动 Erlang 运行时系统。

参数可以分为仿真器标志标志普通参数

  • 任何以字符 + 开头的参数都被解释为仿真器标志

    顾名思义,仿真器标志控制仿真器的行为。

  • 任何以字符 - (连字符) 开头的参数都被解释为标志,该标志将传递给运行时系统的 Erlang 部分,更具体地说,传递给 init 系统进程,请参阅 init

    init 进程本身会解释其中一些标志,即init 标志。它还会存储任何剩余的标志,即用户标志。后者可以通过调用 init:get_argument/1 来检索。

    存在少量 "-" 标志,它们现在实际上是仿真器标志,请参阅下面的描述。

  • 普通参数不会以任何方式解释。它们也由 init 进程存储,可以通过调用 init:get_plain_arguments/0 来检索。普通参数可以出现在第一个标志之前,也可以出现在 -- 标志之后。此外,-extra 标志会导致其后面的所有内容都成为普通参数。

示例

% 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"]

这里,+W w+R 9 是仿真器标志。-s my_init 是一个 init 标志,由 init 解释。-sname arnie 是一个用户标志,由 init 存储。它由 Kernel 读取,并导致 Erlang 运行时系统变为分布式。最后,-extra 之后的所有内容(即 +bertie)都被视为普通参数。

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

这里,用户标志 -myflag 1 被传递给 init 进程并由其存储。这是一个用户定义的标志,可能由某些用户定义的应用程序使用。

标志

在以下列表中,init 标志标记为“(init 标志)”。除非另有说明,否则所有其他标志都是用户标志,其值可以通过调用 init:get_argument/1 来检索。请注意,用户标志列表并非详尽无遗,可能存在更多特定于应用程序的标志,这些标志将在相应的应用程序文档中描述。

  • -- (init 标志) - -- 之后的所有内容,直到下一个标志 (-flag+flag) 都被视为普通参数,可以使用 init:get_plain_arguments/0 来检索。

  • -Application Par Val - 将应用程序 Application 的配置参数 Par 设置为值 Val;请参阅 app(4)application

  • -args_file FileName - 命令行参数从文件 FileName 中读取。从文件中读取的参数将替换结果命令行上的标志 '-args_file FileName'。

    文件 FileName 应该是纯文本文件,并且可以包含注释和命令行参数。注释以 # 字符开头,并持续到下一个行尾字符。反斜杠 (\) 用作引用字符。erl 接受的所有命令行参数都是允许的,也包括标志 -args_file FileName。但是,请注意不要在包含标志 -args_file 的文件之间造成循环依赖关系。

    标志 -extra 以特殊方式处理。它的作用域在文件末尾结束。-extra 标志之后的参数将移动到命令行上的 -extra 部分,即 -extra 标志之后的命令行末尾。

  • -async_shell_start - 在系统引导过程完成之前(Erlang/OTP 5.4 及更高版本),初始 Erlang shell 不会读取用户输入。此标志禁用启动同步功能,并允许 shell 与系统的其余部分并行启动。

  • -boot File - 指定用于启动系统的引导文件名 File.boot;请参阅 init。除非 File 包含绝对路径,否则系统会在当前目录和 $ROOT/bin 目录中搜索 File.boot

    默认为 $ROOT/bin/start.boot

  • -boot_var Var Dir - 如果引导脚本包含 $ROOT 之外的路径变量 Var,则此变量将扩展为 Dir。当应用程序安装在 $ROOT/lib 之外的另一个目录中时使用;请参阅 SASL 中的 systools:make_script/1,2

  • -code_path_cache - 启用代码服务器的代码路径缓存;请参阅 code

  • -compile Mod1 Mod2 ... - 编译指定的模块,然后终止(如果某些文件的编译未成功,则返回非零退出代码)。暗示 -noinput

    不推荐使用;请改用 erlc

  • -config Config [Config ...] - 指定一个或多个配置文件名 Config.config,用于配置应用程序;请参阅 app(4)application。有关配置格式以及读取配置参数的顺序的说明,请参阅配置文件格式的文档。

  • -configfd FD [FD ...] - 指定一个或多个文件描述符的名称(从这里开始称为配置文件描述符),其中包含应用程序的配置数据;请参阅 app(4)application。有关配置格式以及读取配置参数的顺序的说明,请参阅配置文件格式的文档。

    配置文件描述符将被读取到末尾,然后关闭。

    配置文件描述符的内容将被存储,以便在调用 init:restart/0init:restart/1 时可以重复使用。

    参数 -configfd 0 暗示 -noinput

    注意

    不建议将文件描述符 1(标准输出)和 2(标准错误)与 -configfd 一起使用,因为这些文件描述符通常用于将信息打印到程序运行的控制台。

    示例 (Unix shell)

    $ erl \
    -noshell \
    -configfd 3 \
    -eval \
    'io:format("~p~n",[application:get_env(kernel, logger_level)]),erlang:halt()' 3< \
    <(echo '[{kernel, [{logger_level, warning}]}].')
    {ok,warning}
    $ echo '[{kernel, [{logger_level, warning}]}].' > test1.config
    $ echo '[{kernel, [{logger_level, error}]}].' > test2.config
    $ erl \
    -noshell \
    -configfd 3 \
    -configfd 4 \
    -eval \
    'io:format("~p~n",[application:get_env(kernel, logger_level)]),erlang:halt()' \
    3< test1.config 4< test2.config
    {ok,error}
  • -connect_all false - 此标志已弃用,并已被 kernel 应用程序参数 connect_all 取代。

  • -cookie Cookie - 已过时的标志,没有任何效果,并且通常是 -setcookie 的拼写错误。请改用 -setcookie

  • -detached - 启动与系统控制台分离的 Erlang 运行时系统。对于运行守护程序和后台进程很有用。暗示 -noinput

  • -disable-feature feature - 禁用运行时系统中的功能 feature。特殊功能 all 可用于禁用所有非永久功能。

  • -dist_listen true|false - 指定此节点是否应侦听传入的分布连接。默认情况下,节点将侦听传入的连接。将此选项设置为 false 暗示 -hidden

  • -emu_args - 用于调试。打印发送到仿真器的参数。

  • -emu_flavor emu|jit|smp - 启动具有不同风格的仿真器。通常只有一个风格可用,可以通过构建特定风格来添加更多。当前可用的风格有:emujitsmp 风格是当前默认风格的别名。您可以将此标志与 --emu_type 结合使用。您可以使用 erlang:system_info(emu_flavor) 在运行时获取当前风格。(必须构建具有此风格的仿真器。您可以通过在 Erlang/OTP 源代码存储库中执行 make FLAVOR=$FLAVOR 来构建特定风格。)

  • -emu_type Type - 启动不同类型的仿真器。例如,要启动锁计数器仿真器,请使用 -emu_type lcnt。您可以使用 erlang:system_info(build_type) 在运行时获取当前类型。(必须已经构建了此类型的仿真器。使用 configure 选项 --enable-lock-counter 来构建锁计数器仿真器。)

  • -enable-feature feature - 启用运行时系统中的功能 feature。特殊功能 all 可用于启用所有功能。

  • -env Variable Value - 将 Erlang 运行时系统的主机操作系统环境变量 Variable 设置为值 Value。示例

    % erl -env DISPLAY gin:0

    在此示例中,启动了一个 Erlang 运行时系统,并将环境变量 DISPLAY 设置为 gin:0

  • -epmd_module Module - 此标志已弃用,并已被 kernel 应用程序参数 epmd_module 取代。

  • -erl_epmd_port Port - 此标志已弃用,并已被 kernel 应用程序参数 erl_epmd_node_listen_port 取代。

  • -eval Expr (init 标志) - 使 init 计算表达式 Expr;请参阅 init

  • -extra (init 标志) - -extra 之后的所有内容都被视为普通参数,可以使用 init:get_plain_arguments/0 检索。

  • -heart - 启动 Erlang 运行时系统的心跳监控;请参阅 heart

  • -hidden - 如果 Erlang 运行时系统作为分布式节点运行,则将其启动为隐藏节点。隐藏节点始终与其他所有节点建立隐藏连接,但与同一全局组中的节点除外。隐藏连接不会在任何连接的节点上发布,也就是说,其他节点上的 nodes/0 的结果中不包含任何连接的节点。另请参阅隐藏全局组;global_group

  • -hosts Hosts - 指定 Erlang 引导服务器运行的主机的 IP 地址,请参阅 erl_boot_server。如果存在标志 -loader inet,则此标志是必需的。

    IP 地址必须以标准形式指定(四个十进制数,用句点分隔,例如,"150.236.20.74")。主机名不可接受,但可以使用广播地址(最好限制在本地网络)。

  • -id Id - 指定 Erlang 运行时系统的标识。如果作为分布式节点运行,Id 必须与使用标志 -sname-name 提供的名称相同。

  • -init_debug - 使 init 在解释引导脚本时写入一些调试信息。

  • -instr (模拟器标志) - 选择一个带检测的 Erlang 运行时系统(虚拟机)来运行,而不是普通的运行时系统。当运行带检测的运行时系统时,可以使用 instrument 模块获取和分析一些资源使用数据。在功能上,它的行为与普通的 Erlang 运行时系统完全相同。

  • -loader Loader - 指定 erl_prim_loader 将 Erlang 模块加载到系统中使用的方法;请参阅 erl_prim_loader。支持两种 Loader 方法

    • efile,表示使用本地文件系统,这是默认设置。
    • inet,表示使用另一台机器上的引导服务器。还必须指定标志 -id-hosts-setcookie

    如果 Loader 是其他值,则会启动用户提供的 Loader 端口程序。

  • -make - 使 Erlang 运行时系统在当前工作目录中调用 make:all(),然后终止;请参阅 make。隐含 -noinput

  • -man Module - 显示 Erlang 模块 Module 的手册页。仅在 Unix 上受支持。

  • -mode interactive | embedded - 如果运行时系统在 interactive 模式下运行(这是默认模式),则在首次引用模块时会自动加载它们。在 embedded 模式下,模块不会自动加载。当引导脚本预加载所有模块时,建议使用后者,这通常发生在 OTP 发布版中。请参阅 code

  • -name Name - 使 Erlang 运行时系统成为分布式节点。此标志会调用节点成为分布式节点所需的所有网络服务器;请参阅 net_kernel。它还确保在启动 Erlang 之前,epmd 在当前主机上运行(请参阅 epmd(1)-start_epmd 选项),并且已设置了一个魔法 cookie(请参阅 -setcookie)。

    节点名称将为 Name@Host,其中 Host 是当前主机的完全限定主机名。对于短名称,请改用标志 -sname

    如果将 Name 设置为 undefined,则节点将以特殊模式启动,该模式经过优化,可作为另一个节点的临时客户端。然后,该节点将从其连接的第一个节点请求动态节点名称。请在 动态节点名称 中阅读更多内容。

    警告

    启动分布式节点而不指定 -proto_dist inet_tls 将使节点暴露于攻击之下,这些攻击可能会使攻击者完全访问该节点以及扩展集群。使用不安全的分布式节点时,请确保网络配置为防止潜在的攻击者进入。

  • -no_epmd - 指定分布式节点根本不需要 epmd

    此选项确保 Erlang 运行时系统不会启动 epmd,也不会启动用于分布的 erl_epmd 进程。

    仅当 Erlang 作为分布式节点启动时,此选项才有效,并使用 -proto_dist 选项,该选项使用替代协议进行 Erlang 分布,该协议不依赖 epmd 进行节点注册和发现。有关更多信息,请参阅 如何实现 Erlang 分布的替代载体

  • -noinput - 确保 Erlang 运行时系统永远不会尝试读取任何输入。隐含 -noshell

  • -noshell - 启动没有 shell 的 Erlang 运行时系统。此标志使 Erlang 运行时系统可以作为一系列 Unix 管道中的一个组件。

  • -nostick - 禁用 Erlang 代码服务器的粘性目录功能;请参阅 code

  • -oldshell - 调用 Erlang/OTP 3.3 中的旧 Erlang shell。旧 shell 仍然可以使用。

  • -pa Dir1 Dir2 ... - 将指定的目录添加到代码路径的开头,类似于 code:add_pathsa/1。请注意,给定目录的顺序将在生成的路径中反转。

    作为 -pa 的替代方案,如果要将多个目录添加到代码路径的前面,并且这些目录具有共同的父目录,则可以在环境变量 ERL_LIBS 中指定该父目录;请参阅 code

  • -pz Dir1 Dir2 ... - 将指定的目录添加到代码路径的末尾,类似于 code:add_pathsz/1;请参阅 code

  • -path Dir1 Dir2 ... - 替换引导脚本中指定的路径;请参阅 script(4)

  • -proto_dist Proto - 指定 Erlang 分布的协议

    • inet_tcp - IPv4 上的 TCP(默认值)

    • inet_tls - 通过 TLS/SSL 进行分布,有关如何设置安全分布式节点的详细信息,请参阅 将 SSL 用于 Erlang 分布 用户指南。

    • inet6_tcp - IPv6 上的 TCP

    例如,要启动 IPv6 分布式节点

    % erl -name [email protected] -proto_dist inet6_tcp
  • -remsh Node - 使用连接到 Node 的远程 shell 启动 Erlang。

    如果未给出 -name-sname,则将使用 -sname undefined 启动节点。如果 Node 不包含主机名,则会自动从 -name-sname 中获取一个主机名。

    注意

    在 OTP-23 之前,用户需要提供有效的 -sname-name 才能使 -remsh 工作。如果目标节点未运行 OTP-23 或更高版本,情况仍然如此。

    注意

    连接的节点需要具有带有终端仿真的适当 shell。这意味着 UNIX 用户必须使用具有终端功能的 Erlang 编译,并且在 Erlang/OTP 25 之前,Windows 用户必须使用 werl

  • -rsh Program - 指定 ssh 的替代方案,用于在远程主机上启动从属节点;请参阅 slave

  • -S Mod [Func [Arg1, Arg2, ...]] (init 标志) - 使 init 调用指定的函数。Func 默认为 start。该函数假定为 arity 1,将列表 [Arg1,Arg2,...] 作为参数,如果未传递任何参数,则为空列表。此选项之后出现的所有进一步参数都作为字符串传递给指定的函数。隐含 -noshell。请参阅 init

  • -run Mod [Func [Arg1, Arg2, ...]] (init 标志) - 使 init 调用指定的函数。Func 默认为 start。如果没有提供任何参数,则该函数假定为 arity 0。否则,它假定为 arity 1,将列表 [Arg1,Arg2,...] 作为参数。所有参数都作为字符串传递。请参阅 init

  • -s Mod [Func [Arg1, Arg2, ...]] (初始化标志) - 使 init 调用指定的函数。Func 默认为 start。如果没有提供参数,则假定该函数的元数为 0。否则,假定其元数为 1,并将列表 [Arg1,Arg2,...] 作为参数。所有参数都作为原子传递。请参阅 init

  • -setcookie Cookie - 将节点的 magic cookie 设置为 Cookie;请参阅 erlang:set_cookie/1。更多详细信息请参阅 Erlang 参考手册中的 分布式 Erlang 部分。

  • -setcookie Node Cookie - 将 Node 的 magic cookie 设置为 Cookie;请参阅 erlang:set_cookie/2

  • -shutdown_time Time - 指定 init 进程在系统中关闭 Erlang 应用程序时允许花费的时间长度(以毫秒为单位)。如果经过 Time 毫秒,所有仍然存在的进程都将被终止。默认为 infinity

  • -sname Name - 使 Erlang 运行时系统成为一个分布式节点,类似于 -name,但是节点名称 Name@Host 的主机名部分将是短名称,而不是完全限定的名称。

    如果域名系统(DNS)未运行,这有时是运行分布式 Erlang 的唯一方法。使用标志 -sname 运行的节点和使用标志 -name 运行的节点之间无法进行通信,因为节点名称在分布式 Erlang 系统中必须是唯一的。

    如果将 Name 设置为 undefined,则节点将以特殊模式启动,该模式经过优化,可作为另一个节点的临时客户端。然后,该节点将从其连接的第一个节点请求动态节点名称。请在 动态节点名称 中阅读更多内容。

    警告

    启动分布式节点而不指定 -proto_dist inet_tls 将使节点暴露于攻击之下,这些攻击可能会使攻击者完全访问该节点以及扩展集群。使用不安全的分布式节点时,请确保网络配置为防止潜在的攻击者进入。

  • -start_epmd true | false - 指定 Erlang 是否应在启动时启动 epmd。默认情况下,此值为 true,但是如果您希望手动启动 epmd,请将其设置为 false

    仅当 Erlang 作为分布式节点启动时(即指定了 -name-sname)才适用。否则,即使给定了 -start_epmd true,也不会启动 epmd。

    请注意,如果 epmd 未运行,分布式节点将无法启动。

  • -version (模拟器标志) - 使模拟器打印其版本号。与 erl +V 相同。

模拟器标志

erl 调用 Erlang 模拟器(虚拟机)的代码,该模拟器支持以下标志

  • +a size - 异步线程池中线程的建议堆栈大小(以千字为单位)。有效范围为 16-8192 千字。默认建议的堆栈大小为 16 千字,即 32 位体系结构上的 64 千字节。选择此小的默认大小是因为异步线程的数量可能很大。默认大小对于 Erlang/OTP 随附的驱动程序来说足够了,但对于其他使用 driver_async() 功能动态链接的驱动程序来说可能不够大。请注意,传递的值仅为建议,并且在某些平台上甚至可以忽略它。

  • +A size - 设置异步线程池中的线程数。有效范围为 1-1024。异步线程池供链接的驱动程序使用,以处理可能需要很长时间的工作。自 OTP 21 以来,默认的 Erlang/OTP 发行版包含很少使用异步线程池的链接驱动程序。它们中的大多数已迁移到脏 IO 调度程序。默认为 1。

  • +B [c | d | i] - 选项 c 使 Ctrl-C 中断当前 shell 而不是调用模拟器中断处理程序。选项 d(与指定不带额外选项的 +B 相同)禁用中断处理程序。选项 i 使模拟器忽略任何中断信号。

    如果选项 c 与 Unix 上的 oldshell 一起使用,则 Ctrl-C 将重新启动 shell 进程,而不是中断它。

  • +c true | false - 启用或禁用 时间校正

    • true - 启用时间校正。如果特定平台支持时间校正,则这是默认值。

    • false - 禁用时间校正。

    为了向后兼容,可以省略布尔值。这被解释为 +c false

  • +C no_time_warp | single_time_warp | multi_time_warp - 设置 时间扭曲模式

  • +d - 如果模拟器检测到内部错误(或内存不足),则默认情况下,它将生成崩溃转储和核心转储。但是,核心转储不是很有用,因为进程堆的内容会被崩溃转储的生成破坏。

    如果检测到内部错误,选项 +d 指示模拟器仅生成核心转储,而不生成崩溃转储。

    使用字符串参数调用 erlang:halt/1 仍然会生成崩溃转储。在 Unix 系统上,向模拟器进程发送 SIGUSR1 信号也会强制生成崩溃转储。

  • +dcg DecentralizedCounterGroupsLimit - 限制 Erlang 运行时系统中用于更新操作优化的分散计数器所使用的分散计数器组的数量。默认情况下,限制为 256。

    当调度程序的数量小于或等于限制时,每个调度程序都有自己的组。当调度程序的数量大于组限制时,调度程序共享组。共享组会降低更新计数器的性能,而许多读取器组会降低读取计数器的性能。因此,限制是在更新操作的性能和读取操作的性能之间进行权衡。每个组在每个计数器中消耗 64 个字节。

    请注意,使用分散计数器组的运行时系统受益于将调度程序绑定到逻辑处理器,因为使用此选项可以更好地在调度程序之间分配组。

    此选项仅影响分散计数器,该计数器用于跟踪内存消耗和类型为 ordered_set 且激活了 write_concurrency 选项的 ETS 表中的项数的计数器。

  • +e Number - 设置 ETS 表的最大数量。此限制部分过时

  • +ec - 在所有 ETS 表上强制使用选项 compressed。仅用于测试和评估。

  • +fnl - 虚拟机的工作方式就好像文件名使用 ISO Latin-1 编码进行编码一样,不允许使用代码点 > 255 的 Unicode 字符。

    有关 Unicode 文件名的更多信息,请参阅 STDLIB 用户指南中的Unicode 文件名部分。请注意,此值也适用于命令行参数和环境变量(请参阅 STDLIB 用户指南中的环境变量和参数中的 Unicode 部分)。

  • +fnu[{w|i|e}] - 虚拟机的工作方式就好像文件名使用 UTF-8(或其他一些特定于系统的 Unicode 编码)进行编码一样。这是强制执行 Unicode 编码的操作系统(即 Windows MacOS X 和 Android)上的默认值。

    +fnu 开关后面可以跟 wie 来控制如何报告编码错误的文件名

    • w 表示每当在目录列表中“跳过”编码错误的文件名时,都会向 error_logger 发送警告。这是默认值。
    • i 表示这些编码错误的文件名会被静默忽略。
    • e 表示每当遇到编码错误的文件名(或目录名)时,API 函数都会返回错误。

    请注意,如果链接指向无效的文件名,则 file:read_link/1 始终返回错误。

    有关 Unicode 文件名的更多信息,请参阅 STDLIB 用户指南中的Unicode 文件名部分。请注意,此值也适用于命令行参数和环境变量(请参阅 STDLIB 用户指南中的环境变量和参数中的 Unicode 部分)。

  • +fna[{w|i|e}] - 基于操作系统中的当前区域设置进行 +fnl+fnu 之间的选择。这意味着如果您已将终端设置为 UTF-8 编码,则文件系统应使用相同的编码来处理文件名。这是除 Android、MacOS X 和 Windows 之外的所有操作系统上的默认设置。

    +fna 开关后面可以跟 wie。如果区域设置导致选择 +fnu 的行为,则此操作会生效;请参阅上面对 +fnu 的描述。如果区域设置导致选择 +fnl 的行为,则 wie 不会产生任何影响。

    有关 Unicode 文件名的更多信息,请参阅 STDLIB 用户指南中的Unicode 文件名部分。请注意,此值也适用于命令行参数和环境变量(请参阅 STDLIB 用户指南中的环境变量和参数中的 Unicode 部分)。

  • +hms Size - 将进程的默认堆大小设置为大小 Size 个字。

  • +hmbs Size - 将进程的默认二进制虚拟堆大小设置为大小 Size 个字。

  • +hmax Size - 将进程的默认最大堆大小设置为大小 Size 个字。默认为 0,表示不使用最大堆大小。有关更多信息,请参阅 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxel true|false - 设置是否为达到最大堆大小的进程发送错误记录器消息。默认为 true。有关更多信息,请参阅 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxib true|false - 设置在与最大堆大小进行比较的总和中是否包括共享的堆外二进制文件的大小。默认为 false。有关更多信息,请参阅 process_flag(max_heap_size, MaxHeapSize)

  • +hmaxk true|false - 设置是否终止达到最大堆大小的进程。默认为 true。 更多信息,请参阅 process_flag(max_heap_size, MaxHeapSize)

  • +hpds Size - 设置进程的初始进程字典大小为 Size

  • +hmqd off_heap|on_heap - 设置 message_queue_data 进程标志的默认值。默认为 on_heap。如果未传递 +hmqd,则默认值为 on_heap。更多信息,请参阅 process_flag(message_queue_data, MQD)

  • +IOp PollSets - 设置在轮询 I/O 时使用的 IO 轮询集数量。此选项仅在支持并发更新轮询集的平台上使用,否则将使用与 IO 轮询线程相同数量的轮询集。默认值为 1。

  • +IOt PollThreads - 设置在轮询 I/O 时使用的 IO 轮询线程数。允许的最大轮询线程数为 1024。默认值为 1。

    检查是否需要更多 IO 轮询线程的一个好方法是使用 微状态统计 并查看 IO 轮询线程的负载。如果负载很高,则可以考虑添加更多线程。

  • +IOPp PollSetsPercentage - 类似于 +IOp,但使用百分比来设置要创建的 IO 轮询集数量,基于配置的轮询线程数。如果同时使用 +IOPp+IOp,则忽略 +IOPp

  • +IOPt PollThreadsPercentage - 类似于 +IOt,但使用百分比来设置要创建的 IO 轮询线程数,基于配置的调度器数。如果同时使用 +IOPt+IOt,则忽略 +IOPt

  • +IOs true|false - 启用或禁用调度器线程轮询优化。默认为 true

    如果启用,频繁读取的文件描述符可能会被移动到调度器线程使用的特殊轮询集中。目的是减少系统调用次数,从而减少 CPU 负载,但在某些情况下,可能会增加单个文件描述符输入事件的调度延迟。

  • +JPcover true|false|function|function_counters|line|line_counters - 自:OTP 27.0

    启用或禁用在使用 JIT 运行时对覆盖率的支持。默认为 false。

    • function - 所有加载的模块都将被检测以跟踪执行了哪些函数。可以通过调用 code:get_coverage(function, Module) 来检索有关已执行函数的信息。

    • function_counters - 所有加载的模块都将被检测以计算每个函数执行的次数。可以通过调用 code:get_coverage(function, Module) 来检索每个函数已执行次数的信息。

    • line - 当加载使用 line_coverage 选项编译的模块时,它们将被检测以跟踪哪些行已执行。可以通过调用 code:get_coverage(line, Module) 来检索有关已执行行的信息,并且可以通过调用 code:get_coverage(function, Module) 来检索有关已执行函数的信息。

    • line_counters - 当加载使用 line_coverage 选项编译的模块时,它们将被检测以计算每行执行的次数。可以通过调用 code:get_coverage(line, Module) 来检索有关每行已执行次数的信息,并且可以通过调用 code:get_coverage(function, Module) 来检索有关已执行函数的信息(请注意,在此模式下,无法检索每个函数已执行次数的计数器)。

    • true - 与 line_counters 相同。

    • false - 禁用覆盖率。

  • +JPperf true|false|dump|map|fp|no_fp - 启用或禁用在 Linux 上使用 JIT 运行时对 perf 分析器的支持。默认为 false。

    可以多次组合此选项以启用多个选项。

    • dump - 为 perf 提供详细的行信息,以便 perf annotate 功能正常工作。

    • map - 为 perf 提供所有模块代码的映射,使其可以将机器代码地址转换为 Erlang 源代码位置。这还为 Erlang 代码启用帧指针,以便 perf 可以遍历 Erlang 进程的调用堆栈,每个堆栈帧会额外消耗一个字。

    • fp - 独立于 map 选项启用帧指针。

    • no_fp - 禁用 map 选项添加的帧指针。

    • true - 启用 mapdump

    • false - 禁用所有其他选项。

    有关如何运行 perf 的更多详细信息,请参阅 BeamAsm 内部文档中的 perf 支持 部分。

  • +JMsingle true|false - 自:OTP-26.0

    启用或禁用对 JIT 代码使用单映射 RWX 内存。默认是将 JIT 编译的机器代码映射到共享相同物理页面的两个区域,其中一个区域是可执行但不可写的,另一个区域是可写但不可执行的。由于某些工具(例如 QEMU 用户模式模拟)无法处理双映射,因此此标志允许禁用它。此标志由 +JPperf 标志自动启用。

  • +L - 阻止加载有关源文件名和行号的信息。这会节省一些内存,但异常不包含有关文件名和行号的信息。

  • +MFlag Value - 内存分配器特定的标志。更多信息,请参阅 erts_alloc(3)

  • +pad true|false - 自:OTP 25.3

    +pad 参数一起使用的布尔值确定新生成的进程的 async_dist 进程标志的默认值。默认情况下,如果没有传递 +pad 命令行选项,则 async_dist 标志将设置为 false

    可以通过调用 erlang:system_info(async_dist) 来检查运行时使用的值。

  • +pc Range - 设置系统在启发式检测字符串时认为可打印的字符范围。这通常会影响 shell、调试器和 io:format 函数(当在格式字符串中使用 ~tp 时)。

    支持 Range 的两个值:

    • latin1 - 默认值。只有 ISO Latin-1 范围内的字符才被认为是可打印的。这意味着代码点 > 255 的字符永远不会被认为是可打印的,并且包含此类字符的列表会被工具显示为整数列表,而不是文本字符串。

    • unicode - 在确定整数列表是否以字符串语法显示时,会考虑所有可打印的 Unicode 字符。如果例如您的字体不涵盖所有 Unicode 字符,这可能会产生意外的结果。

    另请参阅 STDLIB 中的 io:printable_range/0

  • +P Number - 如果传递 Number 作为值,则为该系统设置同时存在的最大进程数。Number 的有效范围为 [1024-134217727]

    注意

    选择的实际最大值可能比传递的 Number 大得多。目前,运行时系统通常(但不总是)选择一个 2 的幂的值。但是,将来可能会更改。可以通过调用 erlang:system_info(process_limit) 来检查选择的实际值。

    默认值为 1048576

  • +Q Number - 如果传递 Number 作为值,则为该系统设置同时存在的最大端口数。Number 的有效范围为 [1024-134217727]

    注意

    选择的实际最大值可能比实际传递的 Number 大得多。目前,运行时系统通常(但不总是)选择一个 2 的幂的值。但是,将来可能会更改。可以通过调用 erlang:system_info(port_limit) 来检查选择的实际值。

    默认使用的值通常是 65536。但是,如果运行时系统能够确定允许打开的最大文件描述符数量,并且此值大于 65536,则选择的值将增加到大于或等于可以打开的最大文件描述符数量的值。

    在 Windows 上,默认值设置为 8196,因为通常的操作系统限制设置得比大多数机器能够处理的要高。

  • +R ReleaseNumber - 设置兼容模式。

    默认情况下,分发机制不向后兼容。此标志将模拟器设置为与早期 Erlang/OTP 版本 ReleaseNumber 兼容的模式。发布版本号必须在 <当前版本>-2<当前版本> 的范围内。这限制了模拟器,使其可以与运行早期版本的 Erlang 节点(以及 C 和 Java 节点)通信。

    注意

    确保分布式 Erlang 系统的所有节点(Erlang 节点、C 节点和 Java 节点)都属于相同的 Erlang/OTP 版本,或者来自两个不同的 Erlang/OTP 版本 X 和 Y,其中所有 Y 节点都具有兼容模式 X。

  • +r - 强制 ETS 内存块在重新分配时移动。

  • +rg ReaderGroupsLimit - 限制 Erlang 运行时系统中为读取操作优化的读/写锁使用的读取器组的数量。默认情况下,读取器组限制为 64。

    当调度器的数量小于或等于读取器组的限制时,每个调度器都有自己的读取器组。当调度器的数量大于读取器组的限制时,调度器会共享读取器组。共享读取器组会降低读取锁和读取解锁的性能,而过多的读取器组会降低写入锁的性能。因此,此限制是读取操作的性能和写入操作的性能之间的权衡。每个读取器组在每个读/写锁中消耗 64 字节。

    请注意,使用共享读取器组的运行时系统受益于将调度器绑定到逻辑处理器,因为读取器组在调度器之间分布得更好。

  • +S Schedulers:SchedulerOnline - 设置要创建的调度器线程数和要设置为在线的调度器线程数。这两个值的最大值均为 1024。如果 Erlang 运行时系统能够确定配置的逻辑处理器数量和可用的逻辑处理器数量,则 Schedulers 默认为配置的逻辑处理器数量,而 SchedulersOnline 默认为可用的逻辑处理器数量;否则,默认值均为 1。如果模拟器检测到它受到 CPU 配额的限制,则 SchedulersOnline 的默认值将相应地受到限制。

    如果 :SchedulerOnline 未省略,则可以省略 Schedulers,反之亦然。可以通过 erlang:system_flag(schedulers_online, SchedulersOnline) 在运行时更改在线调度器的数量。

    如果将 SchedulersSchedulersOnline 指定为负数,则该值将分别从配置的默认逻辑处理器数量或可用的逻辑处理器数量中减去。

    SchedulersSchedulersOnline 指定值 0 会分别将调度器线程数或在线调度器线程数重置为其默认值。

  • +SP SchedulersPercentage:SchedulersOnlinePercentage - 与 +S 类似,但使用百分比来设置要创建的调度器线程数(基于配置的逻辑处理器)和要设置为在线的调度器线程数(基于可用的逻辑处理器)。指定的值必须 > 0。例如,+SP 50:25 将调度器线程数设置为配置的逻辑处理器的 50%,并将在线调度器线程数设置为可用逻辑处理器的 25%。如果未省略 :SchedulersOnlinePercentage,则可以省略 SchedulersPercentage,反之亦然。可以通过 erlang:system_flag(schedulers_online, SchedulersOnline) 在运行时更改在线调度器的数量。

    此选项与 +S 设置交互。例如,在具有 8 个配置的逻辑核心和 8 个可用逻辑核心的系统上,选项 +S 4:4 +SP 50:25(顺序任意)的组合将导致 2 个调度器线程(4 的 50%)和 1 个在线调度器线程(4 的 25%)。

  • +SDcpu DirtyCPUSchedulers:DirtyCPUSchedulersOnline - 设置要创建的脏 CPU 调度器线程数和要设置为在线的脏 CPU 调度器线程数。这两个值的最大值均为 1024,并且每个值都进一步受到普通调度器设置的限制。

    • 创建的脏 CPU 调度器线程数不能超过创建的普通调度器线程数。
    • 在线的脏 CPU 调度器线程数不能超过在线的普通调度器线程数。

    有关详细信息,请参阅 +S+SP。默认情况下,创建的脏 CPU 调度器线程数等于创建的普通调度器线程数,在线的脏 CPU 调度器线程数等于在线的普通调度器线程数。如果未省略 :DirtyCPUSchedulersOnline,则可以省略 DirtyCPUSchedulers,反之亦然。可以通过 erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) 在运行时更改在线脏 CPU 调度器的数量。

    脏 CPU 调度器的数量受到普通调度器数量的限制,以便限制对在普通调度器上执行的进程的影响。如果允许脏 CPU 调度器的数量不受限制,则脏 CPU 绑定的作业可能会导致普通作业饥饿。

    脏 CPU 调度器的典型用户是大型垃圾回收、编写为 nifs 的 json 协议编码器/解码器以及矩阵操作库。

    您可以使用 msacc 来查看脏 CPU 调度器线程的当前负载,并相应地调整使用的数量。

  • +SDPcpu DirtyCPUSchedulersPercentage:DirtyCPUSchedulersOnlinePercentage - 与 +SDcpu 类似,但使用百分比来设置要创建的脏 CPU 调度器线程数和要设置为在线的脏 CPU 调度器线程数。指定的值必须 > 0。例如,+SDPcpu 50:25 将脏 CPU 调度器线程数设置为配置的逻辑处理器的 50%,并将在线脏 CPU 调度器线程数设置为可用逻辑处理器的 25%。如果未省略 :DirtyCPUSchedulersOnlinePercentage,则可以省略 DirtyCPUSchedulersPercentage,反之亦然。可以通过 erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) 在运行时更改在线脏 CPU 调度器的数量。

    此选项与 +SDcpu 设置交互。例如,在具有 8 个配置的逻辑核心和 8 个可用逻辑核心的系统上,选项 +SDcpu 4:4 +SDPcpu 50:25(顺序任意)的组合将导致 2 个脏 CPU 调度器线程(4 的 50%)和 1 个在线脏 CPU 调度器线程(4 的 25%)。

  • +SDio DirtyIOSchedulers - 设置要创建的脏 I/O 调度器线程数。有效范围为 1-1024。默认情况下,创建的脏 I/O 调度器线程数为 10。

    脏 I/O 调度器的数量不受普通调度器数量的限制,类似于脏 CPU 调度器的数量。这是因为只有 I/O 绑定的工作才会在脏 I/O 调度器上执行。如果用户应在脏 I/O 调度器上调度 CPU 绑定的作业,这些作业可能会导致在普通调度器上执行的普通作业饥饿。

    脏 I/O 调度器的典型用户是读取和写入文件。

    您可以使用 msacc 来查看脏 I/O 调度器线程的当前负载,并相应地调整使用的数量。

  • +sFlag Value - 调度特定的标志。

    • +sbt BindType - 设置调度器绑定类型。

      还可以使用标志 +stbt 绑定调度器。这两个标志之间的唯一区别是如何处理以下错误

      • 特定平台上不支持调度器绑定。
      • 没有可用的 CPU 拓扑。也就是说,运行时系统无法自动检测 CPU 拓扑,并且没有设置用户定义的 CPU 拓扑

      如果传递 +sbt 时发生这些错误中的任何一个,则运行时系统会打印错误消息,并拒绝启动。如果传递 +stbt 时发生这些错误中的任何一个,则运行时系统会静默忽略错误,并使用未绑定的调度器启动。

      有效的 BindType

      • u - unbound - 调度器未绑定到逻辑处理器,也就是说,操作系统决定调度器线程的执行位置以及何时迁移它们。这是默认设置。

      • ns - no_spread - 具有紧密调度器标识符的调度器尽可能紧密地绑定在硬件中。

      • ts - thread_spread - 线程是指硬件线程(如 Intel 的超线程)。具有低调度器标识符的调度器绑定到每个核心的第一个硬件线程,然后具有较高调度器标识符的调度器绑定到每个核心的第二个硬件线程,依此类推。

      • ps - processor_spread - 调度器的分布类似于 thread_spread,但也分布在物理处理器芯片上。

      • s - spread - 调度器尽可能地分布。

      • nnts - no_node_thread_spread - 类似于 thread_spread,但如果存在多个非一致内存访问 (NUMA) 节点,则调度器一次分布在一个 NUMA 节点上,也就是说,一个 NUMA 节点的所有逻辑处理器按顺序绑定到调度器。

      • nnps - no_node_processor_spread - 类似于 processor_spread,但如果存在多个 NUMA 节点,则调度器一次分布在一个 NUMA 节点上,也就是说,一个 NUMA 节点的所有逻辑处理器按顺序绑定到调度器。

      • tnnps - thread_no_node_processor_spread - thread_spreadno_node_processor_spread 的组合。调度器在 NUMA 节点之间的硬件线程上分布,但调度器一次仅在一个 NUMA 节点内部的处理器上分布。

      • db - default_bind - 以默认方式绑定调度器。默认为 thread_no_node_processor_spread(将来可能会更改)。

      仅较新的 Linux、Solaris、FreeBSD 和 Windows 系统支持调度器绑定。

      如果处理标志 +sbt 时没有可用的 CPU 拓扑结构,并且 BindType 不是 u 类型的任何其他类型,则运行时系统将无法启动。可以使用标志 +sct 定义 CPU 拓扑结构。请注意,如果未自动检测到 CPU 拓扑结构,则必须在命令行上在标志 +sbt 之前传递标志 +sct

      默认情况下,运行时系统将调度器绑定到逻辑处理器。

      注意

      如果 Erlang 运行时系统是唯一将线程绑定到逻辑处理器的操作系统进程,这将提高运行时系统的性能。但是,如果其他操作系统进程(例如另一个 Erlang 运行时系统)也绑定线程到逻辑处理器,则可能会导致性能损失。这种性能损失有时可能很严重。如果出现这种情况,建议不要绑定调度器。

      如何绑定调度器很重要。例如,在运行进程少于在线调度器的情况下,运行时系统会尝试将进程迁移到调度器标识符较低的调度器。调度器在硬件上分布得越广,运行时系统在这种情况下可用的资源就越多。

      注意

      如果调度器绑定失败,通常会被静默忽略,因为并非总是可以验证有效的逻辑处理器标识符。如果报告错误,则会报告给 error_logger。如果要验证调度器是否已按要求绑定,请调用 erlang:system_info(scheduler_bindings)

    • +sbwt none|very_short|short|medium|long|very_long - 设置调度器忙等待阈值。默认为 medium。该阈值确定调度器在耗尽工作并进入休眠状态之前忙等待的时间长度。

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +sbwtdcpu none|very_short|short|medium|long|very_long - 与 +sbwt 相同,但影响脏 CPU 调度器。默认为 short

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +sbwtdio none|very_short|short|medium|long|very_long - 与 +sbwt 相同,但影响脏 IO 调度器。默认为 short

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +scl true|false - 启用或禁用调度器负载压缩。默认情况下,启用调度器负载压缩。启用后,负载平衡会努力实现负载分布,从而使尽可能多的调度器线程完全加载(即,不会耗尽工作)。这是通过在调度器频繁耗尽工作时将负载(例如,可运行进程)迁移到较小的调度器集中来实现的。禁用后,负载平衡逻辑不会考虑调度器耗尽工作的频率。

      +scl false 类似于 +sub true,但 +sub true 也会在调度器之间平衡调度器利用率。

    • +sct CpuTopology - 设置用户定义的 CPU 拓扑结构。用户定义的 CPU 拓扑结构会覆盖任何自动检测到的 CPU 拓扑结构。在将调度器绑定到逻辑处理器时使用 CPU 拓扑结构。

      <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>

      大写字母表示真实的标识符,小写字母表示仅用于描述拓扑结构的虚假标识符。作为真实标识符传递的标识符可以在运行时系统尝试访问特定硬件时使用;如果它们不正确,则行为未定义。不接受虚假的逻辑 CPU 标识符,因为在没有真实的逻辑 CPU 标识符的情况下定义 CPU 拓扑结构是没有意义的。可以省略线程、核心、处理器和节点标识符。如果省略,线程 ID 默认为 t0,核心 ID 默认为 c0,处理器 ID 默认为 p0,节点 ID 未定义。每个逻辑处理器必须仅属于一个 NUMA 节点,或者没有逻辑处理器必须属于任何 NUMA 节点。

      允许增加和减少 <IdRange>

      NUMA 节点标识符是系统范围的。也就是说,系统上的每个 NUMA 节点必须具有唯一的标识符。处理器标识符也是系统范围的。核心标识符是处理器范围的。线程标识符是核心范围的。

      标识符类型的顺序表示 CPU 拓扑的层次结构。有效顺序如下

      • <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>,即线程是核心的一部分,核心是处理器的一部分,而处理器是 NUMA 节点的一部分。
      • <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>,即线程是核心的一部分,核心是 NUMA 节点的一部分,而 NUMA 节点是处理器的一部分。

      CPU 拓扑结构可以由处理器外部和处理器内部的 NUMA 节点组成,只要每个逻辑处理器仅属于一个 NUMA 节点即可。如果省略 <ProcessorIds>,则其默认位置在 <NodeIds> 之前。也就是说,默认值为处理器外部 NUMA 节点。

      如果在 <IdDefs> 中使用标识符列表

      • <LogicalIds> 必须是标识符列表。
      • <LogicalIds> 外,至少还有一个其他标识符类型也必须具有标识符列表。
      • 所有标识符列表必须生成相同数量的标识符。

      一个简单的例子。可以使用以下方法描述单个四核处理器

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

      一个更复杂的示例,其中包含两个四核处理器,每个处理器都在其自己的 NUMA 节点中。逻辑处理器的顺序有点奇怪。这是为了更好地说明标识符列表

      % 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}}]}]}]

      只要真实标识符正确,就可以传递一个不是 CPU 拓扑结构正确描述的 CPU 拓扑结构。谨慎使用时,这非常有用。这是为了欺骗模拟器按照您的意愿绑定其调度器。例如,如果您想在同一台计算机上运行多个 Erlang 运行时系统,则需要减少使用的调度器数量并操作 CPU 拓扑结构,以便它们绑定到不同的逻辑 CPU。一个示例,在四核计算机上有两个 Erlang 运行时系统

      % 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

      在此示例中,每个运行时系统都有两个在线的调度器,并且所有在线的调度器都将在不同的内核上运行。如果我们将一个运行时系统上的一个调度器在线更改为另一个运行时系统上的三个调度器在线,则所有在线的调度器仍将在不同的内核上运行。

      请注意,不反映真实 CPU 拓扑结构的虚假 CPU 拓扑结构可能会降低运行时系统的性能。

      有关更多信息,请参阅 erlang:system_info(cpu_topology)

    • +ssrct - 跳过读取 CPU 拓扑结构。

      注意

      在具有大量内核的系统上启动 ERTS 的许多并行实例时,读取 CPU 拓扑结构会减慢启动速度;在这种情况下,使用此标志可能会加快执行速度。

    • +sfwi Interval - 设置调度器强制唤醒间隔。每个 Interval 毫秒扫描所有运行队列。当系统中有休眠的调度器时,会为找到的每个非空运行队列唤醒一个调度器。Interval 默认为 0,这意味着此功能已禁用。

      注意

      引入此功能是为了临时解决长时间执行的本机代码以及未在 OTP 中正确提升缩减的本机代码。在修复这些错误后,将删除此标志。

    • +spp Bool - 设置端口并行性的默认调度器提示。如果设置为 true,则虚拟机将在提高系统并行性时调度端口任务。如果设置为 false,则虚拟机尝试立即执行端口任务,从而提高延迟,但会牺牲并行性。默认为 false。可以通过调用 erlang:system_info(port_parallelism) 在运行时检查使用的默认值。可以通过将选项 parallelism 传递给 erlang:open_port/2 来覆盖端口创建时的默认值。

    • +sss size - 调度器线程的建议堆栈大小,以千字为单位。有效范围为 20-8192 千字。默认建议堆栈大小为 128 千字。

    • +sssdcpu size - 脏 CPU 调度器线程的建议堆栈大小,以千字为单位。有效范围为 20-8192 千字。默认建议堆栈大小为 40 千字。

    • +sssdio size - 脏 IO 调度器线程的建议堆栈大小,以千字为单位。有效范围为 20-8192 千字。默认建议堆栈大小为 40 千字。

    • +stbt BindType - 尝试设置调度器绑定类型。与标志 +sbt 相同,只是处理某些错误的方式不同。有关更多信息,请参阅 +sbt

    • +sub true|false - 启用或禁用负载的 调度器利用率平衡。默认情况下,禁用调度器利用率平衡,而是启用调度器负载压缩,这会努力实现负载分布,从而使尽可能多的调度器线程完全加载(即,不会耗尽工作)。启用调度器利用率平衡后,系统会尝试在调度器之间平衡调度器利用率。也就是说,努力使所有调度器上的调度器利用率相等。

      仅在运行时系统检测并使用单调递增高分辨率时钟的系统上支持 +sub true。在其他系统上,运行时系统无法启动。

      +sub true 意味着 +scl false+sub true+scl false 之间的区别在于 +scl false 不尝试平衡调度器利用率。

    • +swct very_eager|eager|medium|lazy|very_lazy - 设置调度器唤醒清理阈值。默认为 medium。控制调度器因某些清理操作而请求唤醒的积极程度。使用延迟设置时,可以保留更多未完成的清理操作,而调度器处于空闲状态。使用积极设置时,调度器会更频繁地被唤醒,这可能会增加 CPU 利用率。

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +sws default|legacy - 设置调度器唤醒策略。默认策略在 ERTS 5.10 (Erlang/OTP R16A) 中更改。此策略在 Erlang/OTP R15 中称为 proposallegacy 策略用作从 R13 到 R15(包括 R15)的默认策略。

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +swt very_low|low|medium|high|very_high - 设置调度器唤醒阈值。默认为 medium。该阈值决定了当现有唤醒的调度器无法处理更多工作时,何时唤醒休眠的调度器。较低的阈值会导致较早的唤醒,而较高的阈值会导致较晚的唤醒。较早的唤醒会更快地将工作分配到多个调度器上,但工作更容易在调度器之间跳跃。

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +swtdcpu very_low|low|medium|high|very_high - 与 +swt 相同,但影响脏 CPU 调度器。默认为 medium

      注意

      此标志可以随时删除或更改,恕不另行通知。

    • +swtdio very_low|low|medium|high|very_high - 与 +swt 相同,但影响脏 IO 调度器。默认为 medium

      注意

      此标志可以随时删除或更改,恕不另行通知。

  • +t size - 设置虚拟机可以处理的最大原子数量。默认为 1,048,576。

  • +T Level - 启用修改后的时序并设置修改后的时序级别。有效范围为 0-9。运行时系统的时序将被更改。较高的级别通常意味着比低级别更大的变化。更改时序对于查找与时序相关的错误非常有用。

    修改后的时序会影响以下方面

    • 进程生成 - 调用 spawnspawn_linkspawn_monitorspawn_opt 的进程在完成调用后立即被调度出去。当使用较高的修改时序级别时,调用者也会在被调度出去后休眠一段时间。

    • 上下文减少 - 进程在被调度出去之前允许使用的规约次数会增加或减少。

    • 输入减少 - 在检查 I/O 之前执行的规约次数会增加或减少。

    注意

    启用修改后的时序会影响性能。此标志用于测试和调试。

    在 spawn BIF 上进行跟踪时,return_toreturn_from 跟踪消息会丢失。

    此标志可以随时删除或更改,恕不另行通知。

  • +v - 详细模式。

  • +V - 使模拟器打印其版本号。

  • +W w | i | e - 设置 error_logger 的警告消息映射。使用警告例程之一发送到错误记录器的消息可以映射到错误 (+W e)、警告 (+W w) 或信息报告 (+W i)。默认为警告。可以使用 error_logger:warning_map/0 检索当前映射。有关更多信息,请参阅 Kernel 中的 error_logger:warning_map/0

  • +zFlag Value - 其他标志

    • +zdbbl size - 以千字节为单位设置分配缓冲区繁忙限制 (dist_buf_busy_limit)。有效范围为 1-2097151。默认为 1024。

      更大的缓冲区限制允许进程通过分配缓冲更多传出消息。当达到缓冲区限制时,发送进程将被挂起,直到缓冲区大小缩小。缓冲区限制是每个分配通道的限制。更高的限制以更高的内存使用为代价,提供更低的延迟和更高的吞吐量。

      此限制仅影响禁用了 完全异步分布式信号 的进程。

    • +zdntgc time - 以秒为单位设置延迟节点表垃圾收集时间 (delayed_node_table_gc)。有效值可以是 infinity 或范围 0-100000000 的整数。默认为 60。

      未被引用的节点表条目在表中至少保留此参数确定的时间量。这种保留可以防止表中发生重复的删除和插入。

    • +zosrl limit - 限制协调系统范围更改的系统进程发出的未完成请求的数量。此限制的有效范围是 [1, 134217727]。有关更多信息,请参阅 erlang:system_flag(outstanding_system_requests_limit, Limit)

    • +zhft limit - 设置运行时系统在 停止 时允许执行 flush 操作的时间限制。有效的 <timeout> 值是范围为 0..2147483647 的整数或单词 infinity<timeout> 以毫秒为单位,默认为 infinity

      如果在停止操作期间刷新已持续 <timeout> 毫秒,则刷新将被中断,运行时系统将立即以退出代码 255 终止。如果在不刷新的情况下停止,则 <timeout> 对系统没有影响。

      Erlang 代码可以通过调用 erlang:system_info(halt_flush_timeout) 来读取此标志设置的值。

      另请参阅 erlang:halt/2 BIF 的 flush_timeout 选项。请注意,此命令行参数和 flush_timeout 选项的最短超时时间将是实际生效的超时值。

      自:OTP 27.0 起。

环境变量

  • ERL_CRASH_DUMP - 如果模拟器需要写入崩溃转储,则此变量的值是崩溃转储文件的文件名。如果未设置该变量,则崩溃转储文件的名称是当前目录中的 erl_crash.dump

  • ERL_CRASH_DUMP_NICE - Unix 系统:如果模拟器需要写入崩溃转储,它会使用此变量的值来设置进程的 nice 值,从而降低其优先级。有效范围是 1-39(较高的值将替换为 39)。最高值 39 使进程具有最低的优先级。

  • ERL_CRASH_DUMP_SECONDS - Unix 系统:此变量给出模拟器允许花费在写入崩溃转储上的秒数。当经过给定的秒数后,模拟器将终止。

    • ERL_CRASH_DUMP_SECONDS=0 - 如果变量设置为 0 秒,则运行时系统甚至不会尝试写入崩溃转储文件。它只会终止。如果将选项 -heart 传递给 erl 并且未设置 ERL_CRASH_DUMP_SECONDS,则此为默认值。

    • ERL_CRASH_DUMP_SECONDS=S - 如果变量设置为正值 S,则等待 S 秒以完成崩溃转储文件,然后使用 SIGALRM 信号终止运行时系统。

    • ERL_CRASH_DUMP_SECONDS=-1 - 负值会导致运行时系统的终止无限期地等待,直到完全写入崩溃转储文件。如果将选项 -heart 传递给 erl 并且未设置 ERL_CRASH_DUMP_SECONDS,则此为默认值。

    另请参阅 heart

  • ERL_CRASH_DUMP_BYTES - 此变量设置崩溃转储文件的最大大小(以字节为单位)。如果超出此限制,崩溃转储将被截断。如果未设置该变量,则默认情况下不强制执行大小限制。如果变量设置为 0,则运行时系统甚至不会尝试写入崩溃转储文件。

    在 ERTS 8.1.2 (Erlang/OTP 19.2) 中引入。

  • ERL_AFLAGS - 此变量的内容将添加到 erl 的命令行开头。

    标志 -extra 以特殊方式处理。其范围在环境变量内容的末尾结束。跟在 -extra 标志后面的参数将移到命令行中的 -extra 部分,即在 -extra 标志之后命令行的末尾。

  • ERL_ZFLAGSERL_FLAGS - 这些变量的内容将添加到 erl 的命令行末尾。

    标志 -extra 以特殊方式处理。其范围在环境变量内容的末尾结束。跟在 -extra 标志后面的参数将移到命令行中的 -extra 部分,即在 -extra 标志之后命令行的末尾。

  • ERL_LIBS - 包含代码服务器搜索应用程序并将其添加到代码路径的附加库目录的列表;请参阅 code

  • ERL_EPMD_ADDRESS - 可以设置为逗号分隔的 IP 地址列表,在这种情况下,epmd 守护程序仅在指定的地址和环回地址上侦听(如果尚未指定,则隐式添加到列表中)。

  • ERL_EPMD_PORT - 可以包含与 epmd 通信时要使用的端口号。默认端口在大多数情况下都能正常工作。可以指定不同的端口,以允许独立集群的节点在同一主机上共存。集群中的所有节点必须使用相同的 epmd 端口号。

信号

在 Unix 系统上,Erlang 运行时将解释两种类型的信号。

  • SIGUSR1 - SIGUSR1 信号强制执行崩溃转储。

  • SIGTERM - SIGTERM 将向 init 进程生成 stop 消息。这等效于 init:stop/0 调用。

    在 ERTS 8.3 (Erlang/OTP 19.3) 中引入。

信号 SIGUSR2 保留供内部使用。不处理其他信号。

配置

可以重新配置标准的 Erlang/OTP 系统以更改启动时的默认行为。

  • .erlang 启动文件 - 当启动 Erlang/OTP 时,系统会在用户的主目录filename:basedir(user_config, "erlang") 中搜索名为 .erlang 的文件。

    如果找到 .erlang 文件,则假定它包含有效的 Erlang 表达式。这些表达式的求值方式与输入到 shell 的方式相同。

    典型的 .erlang 文件包含一组搜索路径,例如

    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_defaultshell_default - shell 中不以模块名称为前缀的函数被假定为函数对象 (fun)、内置函数 (BIF) 或属于模块 user_defaultshell_default

    要包含私有 shell 命令,请在模块 user_default 中定义它们,并将以下参数作为 .erlang 文件中的第一行添加

    code:load_abs("..../user_default").
  • erl - 如果更改了 .erlang 的内容并定义了私有版本的 user_default,则可以自定义 Erlang/OTP 环境。通过在启动脚本 erl 中提供命令行参数,可以进行更强大的更改。有关更多信息,请参阅 init

另请参阅

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