erl模块翻译
Posted 云彩草原
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了erl模块翻译相关的知识,希望对你有一定的参考价值。
命令:
erl
概述:
Erlang模拟器
描述:
erl程序启动一个Erlang运行时系统。准确的信息是依赖于系统的(举例,erl是否是脚本或程序,其它程序调用)。
相反,windows用户可能想要使用werl程序,它运行在自己带有滚动条和支持命令行编辑的窗口。Windows上的erl程序在shell没有提供行编辑,在Windows 95无法滚回已经滚出屏幕的文本。然而,在管道或如果你想要重定向到标准输入/输出,就必须使用erl程序。
在ERTS版本5.9(OTP-R15B),运行时系统默认将不绑定调度器到逻辑处理器。了解更多信息,参看+sbt系统标志的文档。
导出:
erl <arguments>
启动一个Erlang运行时系统。参数会被分成模拟器标志(emulator flag)、标志(flags)和简单的参数(plain arguments):
任何使用字符+启动的参数被解释为emulator flag。
被名称标明,模拟器标志控制模拟器的行为。
任何使用字符-启动的参数被解释为一个应该被传递到Erlang运行时部分系统的参数,更具体的说,init系统进程,参看init。
init进程自己解释一些标志,init标志。它也保存任何剩余的标志,user标志。随后,通过调用init:get_argument/1被检索。
可以指出,有少量“-”标志,现在实际是模拟器标志。参看下面的描述。
普通参数无论如何不解释。它们也可以被init程序保存,通过调用init:get_plain_arguments/0检索。普通参数可能出现在第一个标志,或在--标志之后。另外,-extra标志导致所有跟在后面的变成普通参数。
例子:
% erl +W w -sname arnie +R 9 -s my_init -extra +bertie
([email protected]) 1> init:get_argument(sname).
{ok,[["1"]]}
([email protected]) 2> init:get_plain_arguments().
["+bertie"]
这里+W w和+R 9都是模拟器标志。-s my_init是一个是init标志,被init解释。-sname arnie是一个用户标志,被init保存。它被内核读取,将导致Erlang运行时系统变成分布式。最后,跟在-extra(也就是,+bertie)的所有被认为是普通参数。
% erl -myflag 1
1> init:get_argument(myflag).
{ok,[["1"]]}
2> init:get_plain_arguments().
[]
这里用户标志-myflag 1被传递到init进程并保存。这是一个用户定义标志,大概被一些用户定义应用使用。
Flag
在下面的列表,init标识被标记(init 标志)。除非另有说明,所有其它标志都是用户标志,值可以通过调用init:get_argument/1检索。请注意,用户标志列表不是详尽的,可能有额外的,应用特定的标志相应记录在对应的应用文档里。
--(init flag)
所有跟在--后面到下一个标记(-flag或+flag)的被认为是原始参数,并且可以通过init:get_plain_arguments/0检索;
-Application Par Val
对应用Application设置应用配置参数Par给Val,参见app(4)和application(3);
-args_file FileName
从文件FileName读取命令行参数。在最终的命令行中,从文件读取的参数会替换‘-args_file FileName‘。
文件FileName应该是一个普通的文本文件,包含注释和命令行参数。注释以#开始,直到下一个行结束符。反斜杠(\\)被用作转义字符。所有被erl接收的命令行参数被允许,包括-args_file FileName。但是,小心不要造成递归依赖,在文件包含-args_file之间。
-extra是特殊的。它的范围在文件末尾结束。跟在-extra的参数被移动到-extra部分,比如跟在-extra后面的命令行参数。
-async_shell_start
初始Erlang shell不会读取用户输入直到系统启动程序已经完成(Erlng5.4或更高)。该标记使启动同步特性无效,并让shell并行和其它系统启动。
-boot File
指定启动文件名称File.boot,用来启动系统。参看init(3)。除非File包含绝对路径,系统在当前目录和$ROOT/bin目录搜索File.boot。
-boot_var Var Dir
如果启动脚本包含路径变量Var而不是$ROOT,该变量被扩展成Dir。当应用被安装在另一个目录而不是$ROOT/lib,该变量被使用,参看systools:make_script/1,2。
-code_path_cache
启动代码服务器的代码路径缓存,参看code(3)。
-compile Mod1 Mod2 ...
编译指定模块然后终止(如果有些文件编译未成功,会返回非零结束码)。意味着-noinput。不建议使用,建议用erlc。
-config Config
指定配置文件名称Config.config,被用来配置应用。参看app(4)和application(3)。
-connect_all false
如果有该标记,global不会管理一个全连接网络的分布式Erlang节点。全局名称注册不能使用。参看global(3)。
-cookie Cookie
没有任何副作用的废弃标记,-setcookie的一般错误拼写。建议使用-setcookie。
-detached
启动Erlang运行时系统,与系统控制台分离。对运行守护进程和后台程序有用。意味着-noinput。
-emu_args
调试有用。打印发送到模拟器的实际参数。
-env Variable Value
给Erlang运行时系统设置主机OS环境变量Variable到Value。举例:
% erl -env DISPLAY gin:0
例子中,有设置为gin:0的DISPLAY环境变量的Erlang运行时系统被启动。
-eval Expr(init flag)
使init计算表达式Expr,参看init(3)。
-extra(init flag)
所有跟在-extra后面的命令被看做是普通参数,可以使用init:get_argument/1被检索。
-heart
启动Erlang运行时系统的心跳监控。参看heart(3)。
-hidden
启动Erlang运行时系统作为隐藏节点,如果它作为一个分布式节点运行。隐藏节点总是和其它节点建立隐藏连接,除了相同全局组的节点。隐藏的连接不能发布在任何已连接的节点,比如,已连接节点都不是在其它节点执行nodes()结果的部分。参看隐藏全局组,global_group(3)。
-hosts Hosts
指定正在运行的Erlang启动服务器主机的IP地址,参看erl_boot_server(3)。如果标识有-loader inet,该标识是强制的。
IP地址必须以标准格式给出(以句号分隔的四个十进制数字,举例"150.236.20.74")。不接受主机名称,但是广播地址可以(仅限于本地网络)。
-id Id
指定Erlang运行时系统的身份。如果作为分布式节点,Id必须和一起提供的-sname或-name标记一致。
-init_debug
当解析启动脚本时,使init写一些调试信息。
-instr(emulator flag)
选择仪表化的Erlang运行时系统运行,而不是普通的。当运行一个仪表化的运行时系统,一些资源使用可以被获得,并且可以使用模块instrument分析。功能上,它表现得像普通的Erlang运行时系统。
—loader Loader
指定使用erl_prim_loader的方法来加载Erlang模块到系统。参看erl_prim_loader(3)。两个Loader方法被支持,efile和inet。efile意味着使用本地文件系统,这是默认。inet意味着使用另一机器上的启动服务器,并且-id、-hosts和-setcookie标记也必须指定。如果Loader是其它的,用户提供的Loader端口程序被启动。
-make
使Erlang运行时系统调用make:all()在当前工作目录然后终止。参看make(3)。意味着-noinput。
-man Module
显示Erlang模块Module的用户手册。仅支持Unix。
-mode interactive | embedded
表明系统应该动态加载代码(interactive),或者所有代码应该在系统初始化时加载(embedded),参看code(3)。默认interactive。
-name Name
使Erlang运行时系统成为分布式节点。该标记调用所有必要网络服务器使节点成为分布式。参看net_kernel(3)。也确保Erlang启动前epmd运行在当前主机。参看epmd(1)。
节点名称为[email protected],其中Host是当前主机的全限定主机名称。对于短名称,使用-sname。
-noinput
确保Erlang运行系统从不尝试读取任何输入。意味着-noshell。
-noshell
启动没有shell的Erlang运行时系统。该标记使Elang运行时系统在一系列UNIX管道中作为组件成为可能。
-nostick
使Erlang代码服务器的粘性目录设施无效。参看code(3)。
-oldshell
调用Erlang3.3的老Erlang shell。老shell可以被使用。
-pa Dir1 Dir2 ...
增加指定目录到代码目录的开头,与code:add_pathsa/1相同。参看code(3)。作为-pa的可供选项,如果几个目录自动加到代码目录开头,且目录有一个共同的父目录,父目录可以在ERL_LIBS环境变量指定。参看code(3)。
-pz Dir1 Dir2 ...
增加指定目录到代码目录的末尾,和code:add_pathsz/1相同。参看code(3)。
-path Dir1 Dir2 ...
替换指定在启动脚本的目录。参看script(4)。
-proto_dist Proto
为Erlang分布式指定协议。
inet_tcp IPv4的TCP(默认)
inet_tls TLS/SSL的分布式
inet6_tcp IPv6的TCP
举例,启动IPv6分布式节点
% erl -name [email protected] -proto_dist inet6_tcp
-remsh Node
启动Erlang,带有连接到Node的远程shell。
-rsh Program
指定可选项给rsh,对在远程主机启动从属节点。参看slave(3)。
-run Mod [Func [Arg1, Arg2, ...]](init flag)
使init调用指定函数。Func默认是start。如果没有提供参数,函数被认为是零参。否则被认为有一个参数,接收[Arg1,Arg2,...]作为参数。所有参数作为字符串传递。参见init(3)。
-s Mod [Func [Arg1,Arg2,...]](init flag)
使init调用指定函数。Func默认是start。如果没有提供参数,函数被认为是零参。否则被认为有一个参数,接收[Arg1,Arg2,...]作为参数。所有参数作为原子传递。参见init(3)。
-setcookie Cookie
设置节点magic cookie为Cookie。参见erlang:set_cookie/2。
-shutdown_time Time
指定多长时间(毫秒),init进程被允许用于关闭系统。如果Time毫秒已经过去,所有还在运行的进程被杀掉。默认为infinity。
-sname Name
使Erlang运行时系统成为分布式节点,类似于-name。节点名称[email protected]的主机名称部分将会是短名称,不是全限定。
如果DNS未运行,有时候这是唯一运行分布式Erlang的方式。那些以-sname标记运行的节点和以-name标记运行的节点,它们之间没有通信。作为节点名称必须是唯一的,在分布式Erlang系统。
-smp [enable|auto|disable]
-smp enable启动支持SMP的Erlang运行时系统。这也许会失败,如果没有支持SMP的运行时系统可用。-smp auto启动支持SMP的Erlang运行时系统,如果可用并且检测到超过一个的逻辑处理器。-smp disable启动不支持SMP的运行时系统。
-version(emulator flag)
使模拟器打印它的版本数字。和erl +V类似。
Emulator Flags
erl调用Erlang模拟器的代码,支持如下的标记:
+a size
对于一步线程池的线程,建议的栈大小,以千字计。有效范围是16-8192千字。默认推荐的栈大小是16千字。比如,在32位架构下是64千字节。异步线程的数量可能相当大,这个小的默认大小已经被选择。默认大小对于Erlang/OTP实现的驱动是足够的,但是对于其它动态链接的驱动,也许远远不够大,可以使用driver_async()功能。注意传递的值仅是一个建议值,在一些平台,甚至可能被忽略。
+A size
设置异步线程池的线程数量,有效范围是0-1024。如果线程支持可用,默认是10。
+B [c | d | i]
c选项使Ctrl-C中断当前shell,而不是调用模拟器中断处理程序。d选项使中断处理程序无效(与指定+B,和没有选项一样)。i选项使模拟器忽略任何中断信号。
如果在Unix oldshell使用c选项,Ctrl-C将重启shell程序,而不是中断它。
注意在Windows下,该标记仅仅对于werl适用,对erl不适用。也要注意在Windows上,使用Ctrl-Break,而不是Ctrl-C。
+c true | false
启用或不启用时间校正:
true
启用时间校正。在特定平台如果支持时间校正,该选型默认启用。
false
不启用时间校正。
为了向后兼容性,该布尔值被忽略。该项被解释为+c false。
+C no_time_warp | single_time_warp | multi_time_warp
设置时间扭曲模式:
no_time_warp
无时间扭曲模式(默认)
single_time_warp
单一时间扭曲模式
multi_time_warp
多时间扭曲模式
+d
如果模拟器检测出一个内部错误(或内存溢出),它会默认生成一个崩溃转储和一个内核转储。然而,内核转储也没什么用,因为进程堆的内容被崩溃转储产生销毁了。
d选项通知模拟器仅仅产生一个内核转储,如果检测出一个内部错误,则不会产生崩溃转储。
调用erlang:halt/1带一个字符串参数也将产生一个崩溃转储。在Unix系统,给模拟器进程发送SIGUSR1信号,也将强制产生一个崩溃转储。
+e Number
设置ETS表的最大数量。
+ec
对所有ETS表强制使用compressed选项。仅用于测试和评估。
+fnl
虚拟机使用文件名称,就好像他们使用ISO-latin-1编码,不允许使用超过255码点的Unicode字符。
了解更多关于文件名称,参看STDLIB User‘s Guide。注意该选项也应用于命令行参数和环境变量(参看STDLIB User Guide)。
+fnu[{w|i|e}]
虚拟机处理文件名称,就好像他们使用UTF-8(或一些其他系统指定Unicode编码)。在强制Unicode编码的操作系统上,这是默认的,比如Windows和MacOS X。
+fnu可以跟w,i,e切换来控制文件名称编码错误被报告的方式。w意味着,无论何时,在目录列表一个文件名称编码错误被跳过,一个警告被发送到error_logger;i意味着,文件名称编码错误被静默忽略;e意味着,无论何时遇到一个文件名称编码错误,API函数将返回一个错误。默认是w。注意,如果链接指向无效的文件名称,file:read_link/1总是返回错误。
了解更多关于文件名称,参看STDLIB User‘s Guide。注意该选项也应用于命令行参数和环境变量(参看STDLIB User Guide)。
+fna[{w|i|e}]
选择+fnl或+fnu基于当前操作系统的本地化设置,意味着如果你的终端已经设置了UTF-8编码,文件系统预计对文件名称使用相同的编码。在所有操作系统上这是默认的,除了MacOSX和Winsdows。
跟随w,i,e,切换+fna。如果本地化设置导致选择了+fnu的行为,这将生效。参看上述+fnu的描述。如果本地化设置导致选择了+fnl的行为,那么w,i,e将没有效果。
了解更多关于文件名称,参看STDLIB User‘s Guide。注意该选项也应用于命令行参数和环境变量(参看STDLIB User Guide)。
+hms Size
设置进程的默认堆大小。
+hmbs Size
设置进程的默认二进制虚拟堆大小。
+hpds Size
设置进程的初始进程字典大小。
+K true | false
启用或不启用内核轮询功能,如果模拟器支持。默认是不启用。如果模拟器不支持内核轮询,传递到模拟器的+K标记,启动时产生一个警告。
+l
启用自动负载追踪,在加载代码时显示信息。
+L
不加载关于源文件名称和行号的信息。这会节约内存,但是异常不会包含关于文件名称和行号的信息。
+MFlag Value
内存分配器特殊标记,参看erts_alloc(3)了解进一步信息。
+n Behavior
控制信号到端口的行为。
OTP-R16,信号到端口是真正地异步发送。注意信号总是异步地被记录。然而,以前底层实现,同步发送这些信号。正确编码的Erlang程序应该能处理这些问题。然而,Erlang程序存在的Bug,关于信号到端口做出错误的假设,很难发现。这种切换被引入为了更容易地比较过渡期间的行为。注意,在介绍时,这个标记被废弃,并计划在OTP-R17中移除。Behavior应该是下面字符之一:
d
默认值。异步信号。发送信号到端口的程序继续执行,在信号已经到达端口之前。
s
同步信号。发送信号到端口的进程继续执行直到信号已经发送。仅应该用于测试和调试。
a
异步信号。默认值。但发送信号的进程甚至将频繁地继续执行,在信号已达到端口之前。仅应该用于测试和调试。
+pc Range
设置字符范围,系统将以启发式字符检测考虑打印。这将显著影响shell、调试器和io:format函数。
当前,Range支持两个值:
latin1
默认。只有ISO-latin-1范围的字符认为是可打印的。这意味着字码大于255的字符将被认为是不可打印的,包含这些字符的列表将显示成整数列表而不是文本字符。
unicode
当确定一个整数列表是否以字符串语法显示,所有可打印unicode字符都被考虑。如果你的字体未覆盖所有unicode字符,这将给出未预料的结果。
+P Number | legacy
设置系统同时存在进程的最大数量,如果Number有值。Number有效范围是[1024-134217727]。
注意:
实际最大选择的数量可能远远比传递的Number大。当前运行时系统经常,但不是总是,选择2的幂的值。然而,这也许在未来改变。实际选择的值可通过调用erlang:system_info(process_limit)校验。
默认值为262144。
如果传的值为legacy,将使用进程标识符分配的遗产算法。使用遗产算法,标识符将以严格增地方式分配直到达到最大可能的标识符。注意,该算法存在性能问题,在某些情况下可能非常昂贵。遗产算法被废弃,并且legacy选项计划在OTP-R18被移除。
+Q Number | legacy
设置系统同时存在端口的最大数量,如果Number有值。Number有效范围是[1024-134217727]。
注意:
实际最大选择的数量可能远远比传递的Number大。当前运行时系统经常,但不是总是,选择2的幂的值。然而,这也许在未来改变。实际选择的值可通过调用erlang:system_info(port_limit)校验。
正常使用的默认值是65536。然而,如果运行时系统能够决定所能打开的最大描述符数量,这个值大于65536,选择的值将增大到大于或等于可以打开的最大描述符数量。
在Windows,默认值设置为8196,因为正常OS限制设置比大多数机器所能处理的要高。
以前环境变量ERL_MAX_PORTS被用于设置同时打开的最大端口数量。这个环境变量废弃了,计划在OTP-R17中移除,但还是可以是使用。
如果传的值为legacy,将使用端口标识符分配的遗产算法。标识符将以严格增地方式分配直到达到最大可能的标识符。注意,该算法存在性能问题,在某些情况下可能非常昂贵。遗产算法被废弃,并且legacy选项计划在OTP-R18被移除。
+R ReleaseNumber
设置兼容模式。
分布式机制默认不向后兼容。该标记使用早先的Erlang/OTP发布版本将模拟器设置为兼容模式。该发布号必须在<current release>-2到<current release>范围内。这限制了模拟器,使它能够和早先的版本的Erlang节点通信(包括C和Java节点)。
注意:确保一个分布式Erlang系统发布的所有节点都是相同的Erlang/OTP版本,或者两个不一样的Erlang/OTP版本X和Y,其中,所有Y节点兼容X。
+r
在realloc时,强制ets内存块移动。
+rg ReaderGroupsLimit
在Erlang运行时系统,限制为读操作使用读/写锁优化的读组数量。默认读组的数量限制等于64。
当调度器的数量少于或等于读组限制,每个调度器有自己读组。当调度器的数量大于读组限制,调度器共享读组。当大量读组降低写锁性能,共享的读组降低读加锁和读解锁性能,所以在读操作性能和写操作性能的限制是一种权衡。每个读组当前消耗64字节在每个读/写锁。也要注意,一个运行时系统使用共享读组受益于"绑定调度器到逻辑处理器",由于读组在调度器之间的分布比较好。
+S schedulers:SchedulerOnline
当启用SMP支持,设置要创建的调度器线程和设置在线的调度器线程的数量。这两个值的最大值是1024。如果Erlang运行时系统能够决定配置的逻辑处理器和可用逻辑处理器的数量;否则,默认值为1。Schedulers可能被忽略,如果SchedulerOnline不对,反之亦然。通过调用erlang:system_flag(schedulers_online, SchedulersOnline,可以在运行时改变在线调度器的数量)。
如果Schedulers和SchedulersOnline被指定为一个负数,配置的逻辑处理器默认值或可用的逻辑处理器分别被减去这个值。
对Schedulers或SchedulersOnline指定为零,会分别重置调度器线程或在线调度器线程的数量到默认值。
如果模拟器没有启用SMP支持,该选项被忽略(参看-smp标记)。
+SP SchedulersPercentage:SchedulersOnlinePercentage
当启用SMP支持,和+S类似,使用百分比设置要创建的调度器线程,基于配置的逻辑处理器,和设置在线的调度线程,基于逻辑可用的逻辑处理器。指定值必须大于零。举例,+SP 50:25设置调度器线程数量为配置的逻辑处理器的50%和调度器线程的在线数量为可用逻辑处理器的25%。SchedulersPercentage可能被忽略,如果SchedulerOnlinePercentage不对,反之亦然。通过调用erlang:system_flag(schedulers_online, SchedulersOnline),可以在运行时改变在线调度器的数量)。
该选项和+S设置相互影响。举例,在一个配置的8逻辑核心和可用的8逻辑核心的系统,选项+S 4:4 +SP 50:25(或另外的顺序)的组合结果是2个调度器线程(4的50%)和1个在线调度器线程(4的25%)。
如果模拟器没有启用SMP支持,该选项被忽略(参看-smp标记)。
+SDcpu DirtyCPUSchedulers:DirtyCPUSchedulersOnline
设置要创建的脏CPU调度器线程数量和设置在线的脏CPU调度器线程,当线程支持已经启用。这两个值最大是1024,而每个值被正常的调度器的设置进一步限制:创建的脏CPU调度器线程的数量不能超过正常创建的调度器线程数量,在线的脏CPU调度器线程数量不能超过在线正常的调度器线程数量(了解更多细节,参看+S和+SP标记)。默认,创建的脏CPU调度器线程的数量等于正常创建的调度器线程数量,而在线脏CPU调度器线程数量等于在线正常的调度器线程数量。DirtyCPUSchedulers可能被忽略,如果DirtyCPUSchedulersOnline不对,反之亦然。通过调用 erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline),可以在运行时改变在线脏CPU调度器的数量)。
如果模拟器未启用线程支持,该选项被忽略。当前,该选项是试验性的。只有模拟器被配置和编译启用脏调度器支持,才可用(默认不启用)。
+SDPcpu DirtyCPUSchedulersPercentage:DirtyCPUSchedulersOnlinePercentage
当启用线程支持,类似+SDcpu,但使用百分数设置要创建的脏CPU调度器线程数量和设置在线脏CPU调度器线程数量。指定值必须大于零。举例,+SDPcpu 50:25设置脏CPU调度器线程数量为配置的逻辑处理器的50%和在线脏CPU调度器线程为可用逻辑处理器的25%。 DirtyCPUSchedulersPercentage可能被忽略,如果DirtyCPUSchedulersOnlinePercentage 不对,反之亦然。通过调用 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 ioschedulers
当启用线程支持,设置要创建的脏I/O调度器线程数量。有效范围是0-1024。默认,被创建的脏I/O调度器线程数量是10,和在异步线程池的默认线程数量一样。
如果模拟器未启用线程支持,该选项被忽略。目前,该选项是试验性的。只有模拟器被配置和编译启用脏调度器支持,才可用(默认不启用)。
+sFlag Value
调度特定标记。
+sbt BindType
设置调度器绑定类型。
调度器也可以使用+stbt标记被绑定。这两个标记之间唯一不同的是下面的错误如何被处理:
在特定平台,调度器的绑定不支持;
没有可用的CPU拓扑。就是运行时系统不能自动探测CPU拓扑,并且没有用户自定义CPU拓扑被设置。
当使用+sbt,发生任何错误,运行时系统会打印一个错误消息,并且拒绝启动。当使用+stbt,发生任何错误,运行时系统会静默忽略错误,启动使用未绑定的调度器。
当前有效的BindTypeS:
u
unbound-调度器不会绑定到逻辑处理器,比如,操作系统决定调度线程执行位置,和什么时候移动它们。这是默认的。
ns
no_spread-带有关闭调度器标识符的调度器会尽可能近绑定硬件。
ts
thread_spread-引用硬件线程的线程(比如,英特尔的超线程)。带有低调度器标识符的调度器,会绑定到每个核心的第一个硬件线程,而带有更高等级调度器标识符的调度器会绑定到每个核心的第二个硬件线程,等等。
ps
processor_spread-调度器会传播像thread_spread,但也在物理处理器芯片之上。
s
spread-调度器尽可能的传播。
nnts
no_node_thread_spread-像thread_spread,但如果多个NUMA(不一致内存访问)节点存在,调度器将每次在一个NUMA节点上传播。比如,所有一个NUMA节点的所有逻辑处理器将逐一绑定到处理器。
nnps
no_node_processor_spread-像process_spread,但如果多个NUMA节点存在,调度器将每次在一个NUMA节点上传播。比如,所有一个NUMA节点的所有逻辑处理器将逐一绑定到处理器。
tnnps
thread_no_node_processor_spread-thread_spread和no_node_processor_spread的组合。在NUMA节点上,调度器在硬件线程上传播,但调度器内部上,只会逐一在一个NUMA节点在处理器上传播。
db
default_bind-默认方式绑定调度器。当前默认是thread_no_node_processor_spread(将来可能会变)。
处理器的绑定当前仅被支持,在更新的Linux、Solaris、FreeBSD和Windows系统。
如果没有CPU拓扑可用,当+sbt标记被处理,而BindType是其它类型而不是u,运行系统会启动失败。CPU拓扑使用+sct标记被定义。注意在命令行的+sbt标记前,+sct标记可能不得不被传递(这种情况,没有CPU拓扑自动被探测)。
运行时系统默认将不绑定调度器到逻辑处理器。
注意:如果Erlang运行时系统是唯一的操作系统进程,绑定线程到逻辑处理器,这提升运行时系统的性能。然而,如果其他操作系统进程(例如另一个Erlang运行时系统)也绑定线程到逻辑处理器,也许反而是一个性能惩罚。在一些情况下,这种性能惩罚可能严重。在这种情况下,建议你不要绑定调度器。
调度器被绑定如何起作用。举个例子,在这种情况,在线调度器少于运行程序,运行时系统尝试移动进程到低调度器标识符的调度器。更多调度器在硬件上传播,在这种情况下,运行时系统有更多的可用资源。
注意:如果调度器绑定失败,这将会静默忽略。这是因为它不总是验证有效逻辑进程标识符。如果一个错误被报告,它会报告给error_logger。如果你想要验证调度器实际已经按请求被绑定,调用erlang:system_info(scheduler_bindings)。
+sbwt none|very_short|short|medium|long|very_long
设置调度器忙等待阈值。默认是medium。这个阈值决定进入休眠前调度器应该忙等待多久。
注意:这个标志随时可能被移除或改变,恕不另行通知。
+scl true|false
启用或停用调度器负载压紧。默认调度器负载压紧启用。当启用,负载均衡将争取负载分布,会导致尽可能多的调度器线程被负载。这通过移动负载到更小集合的调度器完成,当调度器频繁不工作。当停用,那些频繁不工作的线程将不被负载均衡逻辑考虑在内。
+scl false类似于+sub true,不同在于+sub true还会在调度器间平衡调度器利用。
+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>
设置用户自定义CPU拓扑。用户自定义CPU拓扑将覆盖任何自动检测的CPU拓扑。当绑定调度器到逻辑处理器时,使用CPU拓扑。
大写字母意味着真实标识符,而小写字母意味着假的标识符,仅用于拓扑描述。传递真实标识符,当尝试访问特定硬件可能被实时系统使用,如果它们不对,行为是未定义的。假的逻辑CPU标识符不被接受,因为在定义CPU拓扑没有真实逻辑CPU标识符是没有意义的。线程、内核、处理器和节点标识符可能被忽略。如果忽略,线程id默认t0,内核id默认c0,处理器id默认p0,节点id将没有定义。每个逻辑处理器要么必须是一个且只有一个NUMA节点,要么没有逻辑处理器必须属于任何NUMA节点。
允许增加和减少<IdRange>s。
NUMA节点标识符在系统范围。也就是说,系统上的每个NUMA节点必须有一个唯一标识符。进程标识符也在系统范围。内核标识符在处理器范围。线程标识符在内核范围。
标识符类型的顺序隐含CPU拓扑层级。有效的顺序要么是<LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>,要么是<LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>。也就是说,线程是内核的一部分,内核是处理器的一部分,处理器又是NUMA节点的一部分,或者线程是内核的一部分,内核是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拓扑来使它们绑定到不同逻辑CPUs。一个例子,在一个四核机器运行两个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)。
+sfwi Interval
设置调度器强制唤醒间隔。每一个间隔毫秒,所有运行的队列都将被扫描。当系统中有睡眠调度程序时,会为找到的每个非空运行队列唤醒一个调度器。一个0的间隔禁用这个特性,这也是默认的。
这一特性已经被引入作为一种临时的解决方法,用于冗长的执行本地代码,以及在OTP中不适当地降低reduction的本机代码。当这些错误被修复时,将删除+sfwi标志。
+stbt BindType
尝试设置调度器绑定类型。与+sbt标记相同,除了如何处理一些错误之外。要了解更多信息,请参阅+sbt标志的文档。
+sws very_eager|eager|medium|lazy|very_lazy
设置调度器唤醒清理阈值。默认是medium。这个标志控制了调度程序由于某些清理操作而请求唤醒的急切程度。当使用惰性设置时,当调度程序处于空闲状态,可以将更出色的清理操作保留下来。当使用一个eager设置时,调度程序将更频繁的被唤醒,从而可能增加cpu利用率。
注意:此标志可以在任何时候删除或更改,而无需事先通知。
+sws default|legacy
设置调度程序唤醒策略。默认策略在erts-5.10/OTP-R16A中改变。这一策略以前被称为OTP-R15的提案。遗留策略在R13上被用作默认值,包括R15。
注意:此标志可以在任何时候删除或更改,而无需事先通知。
+swt very_low|low|medium|high|very_high
设置调度程序唤醒阈值。默认是medium。当更多的工作超出了当前清醒的调度程序的处理时,阈值决定了何时唤醒睡眠调度程序。较低的阈值将导致较早的唤醒,而高阈值将导致稍后的wakeups。早期的wakeups将会更快的分配多个调度程序,但是工作将更容易在调度程序之间来回切换。
注意:此标志可以在任何时候删除或更改,而无需事先通知。
+spp Bool
为端口并行设置默认的调度器。如果设置为true,VM将调度端口任务,这时它可以改善系统中的并行性。如果设置为false,VM将尝试立即执行端口任务,从而以牺牲并行性为代价来提高延迟。如果该标志没有被传递,则默认的调度程序提示端口并行性目前是错误的。默认的使用可以在运行时通过调用erlang:system_info(port_parallelism)来检查。默认情况下,通过将并行选项传递给open_port/2,可以在端口创建上覆盖。
+sss size
建议的堆栈大小,以千字计,用于调度器线程。有效范围是4-8192千字。默认的堆栈大小取决于操作系统。
+t size
设置VM可以处理的最大原子数量。默认是1048576。
+T Level
支持修改的定时,并设置修改的定时级别。目前有效范围是0-9。运行时系统的定时将会改变。高水平通常意味着比低水平更大的变化。更改定时对于查找与时间相关的bug非常有用。
目前,修改定时影响如下:
进程分裂
调用spawn、spawn_link、spawn_monitor或spawn_opt的进程在完成调用后将会立即被换出调度器。当使用更高的修改定时级别时,调用者在被调度后也会休眠一段时间。
上下文reductions
一个进程在被调度之前允许使用的reductions是增加或减少的。
输入reductions
在检查I/O之前执行的reductions增加或减少。
注意:当启用修改的定时,性能将受到影响。此标志仅用于测试和调试。还要注意,在跟踪衍生BIFs时,返回和返回的跟踪消息将丢失。此标志可以随时删除或更改,无需事先通知。
+V
使模拟器打印出它的版本号。
+v
详细的。
+W w | i
为error_logger设置警告消息的映射。使用其中之一警告程序发送给 error logger 的消息可以被映射到 errors (默认)、warnings(+W w)或
info reports(+W i)。当前的映射可以使用error_logger:warning_map/0来检索。请参阅error_logger(3)以获得更多消息。
+zFlag Value
混杂的标记。
+zdbbl size
设置分配缓冲区繁忙的限制,以千字节计(dist_buf_busy_limit)。有效范围是1-2097151。默认是1024。
更大的缓冲区限制允许进程在分配上缓冲更多传出的消息。当达到缓冲区限制时,发送过程将被暂停,直到缓冲区的大小缩小。缓冲区的限制是每个分配通道。更高的限制会降低延迟和更高的吞吐量,而牺牲更高的内存使用。
Environment variables
ERL_CRASH_DUMP
如果模拟器需要写一个崩溃转储,这个变量的值将是崩溃转储文件的文件名。如果该变量没有设置,崩溃转储文件的名称将会是erl_crash.dump,在当前目录中转储。
ERL_CRASH_DUMP_NICE
Unix系统:如果模拟器需要写一个崩溃转储,它将使用这个变量的值来设置进程的 nice 值,从而降低它的优先级。允许的范围是1-39(更高的值将被替换为39)。最高的值,39,将使这个过程称为最低的优先级。
ERL_CRASH_DUMP_SECONDS
Unix系统:这个变量给出了模拟器被允许用来编写崩溃转储的秒数。当给定的秒数已经过去时,模拟器将被一个 SIGALRM 信号终止。
如果环境变量没有设置,或设置为0秒,ERL_CRASH_DUMP_SECONDS=0,运行时系统甚至不会尝试编写崩溃转储文件,它只会终止。
如果环境变量被设置为负值,例如 ERL_CRASH_DUMP_SECONDS=-1,运行时系统将无限期等待崩溃转储文件的编写。
如果心跳在运行,这个环境变量就会被用于心跳:
ERL_CRASH_DUMP_SECONDS = 0
完全抑制写入崩溃转储文件,从而立即重新启动运行时系统。这与不设置环境变量是一样的。
ERL_CRASH_DUMP_SECONDS = -1
将环境变量设置为负值,将导致运行时系统的终止,直到崩溃转储文件被完全写入。
ERL_CRASH_DUMP_SECONDS = S
将等待S秒来完成崩溃转储文件,然后终止运行时系统。
ERL_AFLAGS
这个环境变量的内容将被添加到erl命令行的开头。
-extra 标记是特殊处理的。它的范围在环境变量内容的末尾结束。跟在 -extra 标记后的参数被移动到命令行的 -extra部分,即在 -extra标记之后的命令后结束。
ERL_ZFLAGS and ERL_FLAGS
这些环境变量的内容将被添加到erl命令行的开头。
-extra 标记是特殊处理的。它的范围在环境变量内容的末尾结束。跟在 -extra 标记后的参数被移动到命令行的 -extra部分,即在 -extra标记之后的命令后结束。
ERL_LIBS
这个环境变量包含一个额外的目录库列表,代码服务器将搜索应用程序并添加到代码路径中。参见code(3)。
ERL_EPMD_ADDRESS
这个环境变量可以被设置为一个逗号分隔的IP地址列表,在这种情况下,epmd守护进程只会监听指定的地址(es)和环回地址(如果没有指定的话,它会隐式地添加到列表中)。
ERL_EPMD_PORT
这个环境变量可以包含在与epmd通信时使用的端口号。默认端口在大多数情况下都可以正常工作。可以指定一个不同的端口,以允许独立集群的节点在同一个主机上共存。集群中的所有节点都必须使用相同的epmd端口号。
Configuration
标准的Erlang/OTP系统可以被重新配置,以改变启动时的默认行为。
The .erlang Start-up File
当Erlang/OTP启动时,系统会在Erlang/OTP启动的目录中搜索名为.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_default and shell_default
在shell中不预先固定的函数被假定为功能性对象(Funs)、内置函数(BIFs),或者属于模块user_default或shell_default。
要包含私人shell命令,请在模块user_default中定义它们,并将下列参数添加为.erlang文件中的第一行。
code:load_abs("..../user_default").
erl
如果定义了.erlang的内容,并且定义了user_default的私有版本,那么就可以定制Erlang/OTP环境。可以通过在启动脚本erl中提供命令行参数来进行更强大的更改。有关进一步信息,请参阅erl(1)和init(3)。
以上是关于erl模块翻译的主要内容,如果未能解决你的问题,请参考以下文章