Erlang 什么时候将异步线程大小从零增加合适?

Erlang 什么时候将异步线程大小从零增加合适?,erlang,Erlang,我一直在阅读文档,试图理解通过+AN开关增加异步线程池大小的意义 我已经做好了进行基准测试的充分准备,但我想知道是否有一个经验法则来确定何时应该怀疑将池大小从0增加到N(或从N增加到N+M)会有帮助 感谢默认情况下,正在运行的Erlang VM中的线程数等于处理器逻辑核数(当然,如果您使用的是SMP) 根据我的经验,当您同时进行许多文件I/O操作时,增加+A参数可能会提高性能。而且我怀疑增加+A可能会提高整个进程的性能,因为BEAM的调度器速度极快且经过优化 说到确切的数字,我想这完全取决于你的

我一直在阅读文档,试图理解通过+AN开关增加异步线程池大小的意义

我已经做好了进行基准测试的充分准备,但我想知道是否有一个经验法则来确定何时应该怀疑将池大小从0增加到N(或从N增加到N+M)会有帮助


感谢

默认情况下,正在运行的Erlang VM中的线程数等于处理器逻辑核数(当然,如果您使用的是SMP)

根据我的经验,当您同时进行许多文件I/O操作时,增加+A参数可能会提高性能。而且我怀疑增加+A可能会提高整个进程的性能,因为BEAM的调度器速度极快且经过优化

说到确切的数字,我想这完全取决于你的应用。比如说,在Riak的情况下,打开的文件的最大数量或多或少是可预测的,您可以将+A设置为该最大值,如果它太大,则可以将+A设置为该最大值的几倍(顺便说一句,默认值为64)。如果您的应用程序包含数以百万计的文件,并将它们提供给web客户端,那就另当别论了;最可能的情况是,您可能希望使用自己的代码和环境运行一些基准测试


最后,我相信我从未见过超过一百个的+A。这并不意味着您不能设置它,但这可能没有意义。

BEAM在它调用调度程序的特殊线程中运行Erlang代码。默认情况下,它将为处理器中的每个核心启动一个调度程序。例如,如果您不想在所有内核上运行Erlang,而是“保留”一些用于其他事情,则可以控制和启动时间。通常,当您执行文件I/O操作时,它将在调度程序中运行,并且由于文件I/O操作相对较慢,因此它们将在运行时阻止该调度程序。这可能会影响实时属性。通常情况下,您不会执行那么多文件I/O,因此这不是问题

异步线程池是用于I/O操作的操作系统线程。通常,池是空的,但如果在启动时使用
+A
,则BEAM将为此池创建额外的线程。然后,这些线程将仅用于文件I/O操作,这意味着调度程序线程将不再阻塞等待文件I/O,并且实时属性将得到改进。当然,这是因为OS线程不是免费的。线程不混合,因此调度程序线程只是调度程序线程,异步线程只是异步线程

如果您正在为端口编写链接的驱动程序,这些端口也可以使用异步线程池。但是你必须自己检测它们是什么时候开始的

你需要多少取决于你的申请。默认情况下,没有启动。像@demeshchuk一样,我也听说Riak喜欢有一个大的异步线程池,因为他们会打开很多文件。我唯一的建议就是去尝试和衡量。与所有优化一样