Erlang 模拟器信息语句是啥意思?
Posted
技术标签:
【中文标题】Erlang 模拟器信息语句是啥意思?【英文标题】:What do the Erlang emulator info statements mean?Erlang 模拟器信息语句是什么意思? 【发布时间】:2015-12-12 12:03:57 【问题描述】:当我启动我的 Erlang 模拟器时,第一部分有一堆信息性的东西。 (为了效果稍微重新格式化。)
manoa:~ stu$ erl
Erlang (BEAM) emulator version 5.6.5
[source] [smp:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1>
其中一些我可以猜到,可能是准确的,但其中一些意味着“这里有魔法”。
Erlang (BEAM) emulator version 5.6.5
:当然是版本
[source]
:模拟器是源码编译的?
[smp:2]
:检测到两个 CPU 内核并可用
[async-threads:0]
:[hipe]
: ?
[kernel-poll:false]
: ?
我还想知道是否还有其他[foo]
项目可能会弹出不同的配置、构建或启动参数。
那么,Erlang 模拟器信息语句是什么意思?
【问题讨论】:
【参考方案1】:截至Erlang20.0,全套版本字符串标签为:
[64 位]
BEAM 仿真器旨在充分利用 64 位 CPU。
[异步线程:10]
这是指 Erlang 模拟器的异步线程池中的线程数,它或多或少地告诉您在模拟器停止之前可以将多少阻塞的系统调用分离到后台线程中。
虽然目前默认为 10,但多年来默认为 0,这意味着所有系统调用在每个 Erlang 模拟器线程中同步运行。当系统调用阻塞时,它会停止运行 Erlang 模拟器线程,直到系统调用完成。当前较小的默认值允许模拟器在系统调用阻塞异步 I/O 线程之一时尝试关闭并执行其他操作。
您可以使用 +A
选项将默认值更改为 Erlang 运行时。 (例如erl +A 50
)如果您要更改此设置,请注意您的结果将取决于您的特定系统和工作负载。过高的值可能会损害性能,因为它会导致系统在系统非常繁忙时尝试在后台执行许多操作,这只会使其更加繁忙。在某些工作负载上,使用 erl +A 0
禁用该功能可能是最佳选择。
[调试编译]
仅当您不遗余力地构建备用 BEAM 仿真器并设置编译器选项以使生成的可执行文件更易于调试时才会出现,例如 gdb
或类似的。您还必须以特殊方式运行此备用 BEAM 仿真器。
Erlang BEAM 模拟器通常是为提高速度而构建的,这通常会使调试器的工作变得更加困难。如果您正在开发 BEAM 仿真器的下一个版本,您可能会发现在改进工作时运行它的特殊调试版本会很有帮助。
要启用此模式,请在运行 configure
后将 cd
放入 Erlang 源代码树下的 erts/emulator
,然后输入类似 ERL_TOP=../.. make FLAVOR=smp debug
的内容。然后,要运行新的可调试 BEAM 仿真器,您必须在构建完 Erlang/OTP 系统的其余部分之后,从 Erlang 源代码树的顶层运行 bin/cerl -debug
。
有关此主题的更多信息,请参阅How to Build a Debug Enabled Erlang RunTime System。
[ds:1:1:1]
从 ERTS 9.0 开始,如果您构建了支持 SMP 的 BEAM 仿真器,则应始终显示此信息。它指的是“dirty schedulers”功能。这些值描述了此系统上的功能配置。
此功能是在 Erlang 19.0 中引入的,最初是作为一项实验性功能,在默认情况下并未像在 Erlang 20.0 中那样在 SMP 构建中编译。
[dtrace]
如果您将--with-dynamic-trace=dtrace
传递给configure
脚本以启用R15B01 中添加的实验性DTrace 检测功能,则会出现。此功能预计仅适用于 OS X、Solaris 和 FreeBSD。将来它可能会在其他平台上运行。请参阅下面的 [systemtap],了解同时为 Linux 系统添加的替代方案。
[帧指针]
这是上面 [debug-compiled] 选项的一个特例,只是它只禁用了frame pointer optimization。在上面的命令中使用frmptr
而不是debug
来启用此模式。
[嬉皮]
模拟器是在启用HiPE 功能的情况下编译的,这是一个用于 Erlang 的即时本机代码编译器。它仅适用于 Erlang 支持的最流行的 CPU 类型,并且即使在这些 CPU 上也不适用于所有配置,这就是它是可选的原因。
[指令计数]
如果您在构建期间定义 ERTS_OPCODE_COUNTER_SUPPORT
会出现,这会启用 BEAM 操作码计数功能,可能对那些分析 BEAM 仿真器性能的人有用。
[内核投票:假]
Erlang 模拟器代码知道几种不同的方法来询问操作系统的网络堆栈,一组文件描述符和套接字中的哪一个可用于 I/O。唯一一个几乎可以在任何地方工作的方法是旧的 BSD select()
调用,由于其设计,它相对较慢,此外还有其他可伸缩性问题。因此,大多数系统都有一个或多个更快且更具可扩展性的替代品——例如,kqueue、epoll()
等——但它们中的任何一个都不受任何地方的支持。当模拟器启动消息在这里显示false
时,这可能意味着内核轮询不可用,或者它是但您没有将+K true
传递给erl
。
[锁检查]
如果您将--enable-lock-check
传递给配置脚本,则会出现。
[锁计数]
如果您将--enable-lock-counter
传递给配置脚本,则会出现。
[lttng]
如果您将--with-dynamic-trace=lttng
传递给configure
脚本以启用对LTTNG(Linux 的跟踪框架)的支持,则会出现。
[净化编译]
当您运行特殊的Purify-aware 版本的 Erlang BEAM 仿真器时会出现此问题。
说明与上面的 [debug-compiled] 部分中的说明相同,只是您在命令中使用 purify
而不是 debug
。
[分享-保留]
如果您将--enable-sharing-preserving
传递给configure
脚本,则会出现这种情况,这会导致share immutable terms intra-node 而不是展平和重新创建它们。此选项是否使您的程序更快或更慢取决于程序的详细信息,因此默认构建中未设置它的原因。
[smp:2:2]
[smp:2] 标签在 Erlang R13 中变成了这种格式,意思是 2 个调度器,它们都在线。如果你说“erl +S1”,它会改为 [smp:1:1]。您可以使用 erlang:system_flag(schedulers_online, N) 在运行时使调度程序脱机,其中 N 可以是 1 和检测到的内核数之间的任何值,包括 1 和 1。
[来源] 或 [来源版本]
这意味着某些第三方(可能是您,可能是您的操作系统发行版的软件包维护者,可能是您的系统管理员)从源代码构建了 Erlang。另一种方法是从 Erlang.org 下载官方二进制版本。
如果您从 the Git repository 构建 Erlang,此消息将更改为类似 [source-8acc644],其中十六进制数字是存储库当前 Git hash 的片段,它允许您查看构建给定可执行文件的源代码的确切版本。
[系统点击]
如果您将--with-dynamic-trace=systemtap
传递给configure
脚本,则会出现。这是此配置选项的=dtrace
值的替代方案,在使用SystemTap 的Linux 上提供基本相同的功能,因为DTrace 通常在Linux 上不可用。请参见上面的 [dtrace]。
[类型断言]
在您取消注释 erts/emulator/beam/erl_term.h
中的 ET_DEBUG
行时出现,从而启用对所有特定于类型的数据访问的运行时检查。默认情况下未启用,因为它会减慢模拟器速度。
[valgrind 编译]
当您运行特殊的Valgrind-aware 版本的 Erlang BEAM 仿真器时会出现此问题。
说明与上面的 [debug-compiled] 部分中的说明相同,只是您在命令中使用 valgrind
而不是 debug
。
(此列表来自 Erlang OTP 源代码树中的erts/emulator/beam/erl_bif_info.c
。请参阅文件顶部附近的erts_system_version
定义。)
过时的标签:
[64-bit halfword] 对 BEAM 仿真器的 64 位构建的优化已在 R14 中添加,然后在 19.0.这也消除了查看与半字模拟器相关联的 [no-c-stack-objects] 标记的可能性。
[rq:2] 标签引用了一个运行队列系统,旨在提高 Erlang BEAM 仿真器的 SMP 版本的可扩展性。在 R13B 中添加,在 R15B 中替换为 a better solution。
[hybrid-heap] 和 [incremental GC] 标签和相关功能在 R15B02 中被删除,主要是因为它们是 failed experiements。
【讨论】:
【参考方案2】:[异步线程:0]
可供加载的驱动程序使用的异步线程池大小。这允许阻塞系统调用在与梁虚拟机不同的内核线程中执行。使用命令开关+A N
调整池的大小。
[嬉皮]
支持 erlang 源代码和字节码的原生编译。往往对数字运算代码很有用。 IO 绑定代码在字节码解释器上运行良好。
[内核投票:假]
有旧的 select(2) 和 poll(2) 系统调用来接收通知,通知某些文件描述符已准备好解除阻塞写入或读取。它们不能很好地扩展到大量打开的文件描述符。现代操作系统有替代接口,linux有epoll,freebsd有kqueue。使用命令开关启用+K true
【讨论】:
以上是关于Erlang 模拟器信息语句是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
WatchKit:啥是“Kermit”,这个控制台日志语句是啥意思?