【发布时间】:2014-08-11 06:47:10
【问题描述】:
我正在为我的高吞吐量网络服务器选择一种技术。我使用 Phoenix 创建了两个简单的实现,一个在 Go 中,一个在 Elixir 中。
我已将这些版本部署在 AWS 上的一台超大型机器上,并使用 siege 对其性能进行基准测试。
在设置GOMAXPROCS 后,我设法提高了 Go 的性能,但运行 Elixir 版本似乎在充分利用机器的 CPU 或内存之前很久就达到了峰值性能。
我似乎找不到任何关于如何在生产环境中微调牛仔的行为的文档或解释,因此它会正确利用它运行的机器,并产生每个人都在谈论的性能......
我很确定有一个简单的地方(文件或环境变量)可以调整一两个值以产生更好的结果。
谁能告诉我那个地方可能在哪里?
【问题讨论】:
-
如果你想挤出性能,尝试只使用插件:github.com/elixir-lang/plug。否则,您是在将 Web 服务器与 Web 框架进行比较,这并不遥远。
-
@Soupd'Campbells 为什么从另一个库配置一个库的能力会给您一种语言不成熟的印象? Elixir 直接编译为 Erlang 代码。我从未听说有人因为 Elixir 语言而出现性能问题。
-
从 Erlang 的 AST(由 Elixir 发出)到 BEAM(字节码),有很多 Elixir 和 Erlang 编译器共享的优化。事实上,Elixir 代码甚至通过了与 Erlang 代码相同的 linting 阶段。
-
@Soupd'Campbells Elixir 编译器生成一个 Erlang 表单列表,该列表被馈送到 compile:forms/2。唯一不参与 Elixir 代码编译的 Erlang 通道是 epp 和 erl_parse,参见 pass_1/1。然后它扩展记录和其他无聊的东西(sys_pre_expand)并编译为 Core Erlang,在其上完成常量折叠和各种窥视孔优化,请参阅 compile:standard_passes/0 和 core_passes/0。然后将核心编译为 BEAM 程序集,在该程序集上完成大多数 Erlang 特定的优化,例如选择性接收 (beam_receive) 和二进制匹配上下文 (beam_bsm),请参阅 asm_passes/0。
-
@Soupd'Campbells 谢谢!顺便说一句,它不被称为“可变变量”,它只是“赋值”(而 Erlang 是“单一赋值”)。非正式地,您也可以将其称为“重新绑定”。而且实现起来非常简单,将代码转换为 SSA 表单是已知的编译器传递:en.wikipedia.org/wiki/Static_single_assignment_form
标签: performance erlang elixir cowboy phoenix-framework