【问题标题】:How can I fine-tune cowboy's runtime behavior?如何微调牛仔的运行时行为?
【发布时间】: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


【解决方案1】:

我没有足够的代表直接发表评论,所以我会在这里回答。我很想看看你在凤凰城得到的数字。你是在 prod 模式下运行的吗?如果您在 dev(默认)中运行,则性能会慢得多,因为启用了代码重新加载并检查每个请求。 Vanilla Plug 的工作量将比 Phoenix 少,但也不会少很多。一个标准的 Phoenix 路由器/控制器应该或多或少地与您最终得到的 Plug 代码内联。

【讨论】:

  • 我也是这么想的,我仍然怀疑有一个简单的配置更改可能会为 phoenix 解决它(因此问题)。我确实prod 中运行(由于代码重新加载,在dev 中运行不适用于exrm)。如果您有任何其他想法,我很乐意尝试。
  • 您能否提供一个用于基准测试的示例项目?
  • github.com/uriagassi/elixir_benchmark - 这包含 JSON 解析、两个到 dynamo db 的出口和一个从记忆表中读取的内容。我提醒您,plug 的非常相似的实现产生了更好的结果...
  • 谢谢尤里。看起来提供的项目只是一个 Hello World 应用程序?我没有看到所描述的任何 JSOn 解析、DB、mnesia 代码?
  • 你有没有发现什么有趣的事情?
【解决方案2】:

按照 cmets 中的建议,我使用 plug 而不是 phoenix 重新实现了我的项目。

使用相同的功能(将帖子正文解析为 JSON、调用 DynamoDB、从 Amnesia 表中读取并格式化 JSON 响应)我获得了更好的性能和更多的资源利用率。

我想我仍然可以每秒“挤”几个请求(目前我每秒收到大约 500 个请求),但现在它与 Go 实现相同的东西相当......

【讨论】:

  • 很高兴认识 Uri!请随时在 elixir-questions 邮件列表或 IRC 上的 #elixir-lang 上联系我们。如果你决定试一试 Phoenix,开发者们也会在频道中徘徊。
猜你喜欢
  • 2013-09-17
  • 2017-05-16
  • 2016-07-19
  • 2020-09-28
  • 2016-05-10
  • 1970-01-01
  • 2017-11-29
  • 2016-08-02
  • 2014-04-01
相关资源
最近更新 更多