什么时候将异步螺纹尺寸从零增加?

时间:2012-11-20 17:53:34

标签: erlang

我一直在阅读文档,试图了解何时通过+ A N开关增加异步线程池大小是有意义的。

我完全准备好进行基准测试,但我想知道当一个人应该怀疑将游泳池大小从0增加到N(或N到N + M)会有所帮助时,是否有一个经验法则。

由于

2 个答案:

答案 0 :(得分:24)

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

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

如果要为端口编写链接驱动程序,这些也可以使用异步线程池。但你必须自己检测它们何时开始。

您需要多少才能完全满足您的应用需求。默认情况下,没有启动。就像@demeshchuk一样,我也听说过Riak喜欢拥有一个大的异步线程池,因为它们打开了很多文件。我唯一的建议是尝试并衡量。与所有优化一样?

答案 1 :(得分:3)

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

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

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

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