Erlang(或elixir)性能(每秒请求数)对jruby缓慢?

时间:2014-08-14 07:21:04

标签: performance erlang elixir webmachine requests-per-second

作为一名rubyist,我决定采用erlang来实现高性能,可靠的后端。 设置非常简单:获取发布请求,将内容写入redis,返回统计信息。所有的json。这也是为什么我非常关心每秒的请求。

选择工具:webmachinejiffy用于json编码/解码,poolboy用于连接池,eredis用于redis通信。

使用的机器:macbook pro,i5 2.4Ghz,8GB内存。

我的erlang每秒大约有5000个请求,而jruby / torqbox大约有12,0000个请求。 (look here for a complete ruby performance test setup

我意识到我可以在erlang中使用ets来节省时间,并留下redis用于后台处理'在回复后写,但这将产生很小的影响。甚至是对“你好世界”的简单测试。二郎腿背后。

有什么建议吗?我做错了吗?

3 个答案:

答案 0 :(得分:18)

  • Webmachine - 我不知道。我的味道非常重,我不使用它。
  • jiffy - 不错的选择。非常快,我经常使用它。
  • poolboy - 我没有听说过,我在Erlang身边已经好几年了。我绝对会将cowboy用于任何我期望的高性能或yaws更坚固但仍然表现良好的东西。对于你的基准是牛仔正确的选择,它是最佳性能。
  • eredis - 我不知道它有多成熟以及如何有效。 ets更适合基准测试。对于你的macbook测试,没关系,但对于大型服务器(数十个CPU),我会检查ti是不是瓶颈和分区表。
  • 最重要的是检查您的VM参数。对于这种负载,至少你应该+K true +A 100

与我的经验相比,你对Erlang的结果似乎太低了。你应该得到几乎十倍的大。您的有效负载生成工具也可能存在问题。

而且最重要的是,这不仅可以被认为是Erlang世界的微观基准,而且可能是nano或atto基准。真正的力量将揭示你何时会尝试更艰难,更复杂的事情。并发请求应以非常复杂的方式相互影响的事情,您必须处理最终的一致性并实现更具可伸缩性,并且需要使用异步进程间通信。

答案 1 :(得分:6)

我的2美分。你有错误的结局。您正在测试JVM针对JVM优化的一种机器进行优化的问题。

你真的不会看到Erlang / OTP对mac book pro上可用核心数量的优势。这只是我的粗略猜测,但我会惊讶地看到Erlang在不到8核心服务器上击败了JVM。在当前硬件上尽可能快地制作JVM需要大量的人/小时。

编写线程安全的I / O代码非常简单,当您处理数十到数百个线程中的内存访问时,会出现真正的问题。

在Erlang / Elixir中编写的目标是当前16或32核的高端服务器,并且有可能在不久的将来扩展得更高。

答案 2 :(得分:5)

仅供参考:“+ A 100”对网络没有帮助,只适用于文件IO。如果你真的想要快速的网络服务器,请看看github.com/knutin/elli,它将为你提供80 kprs的硬件,牛仔将给你30 krps。另一方面,elli是许多人因不遵守OTP原则而责备的事情。

如果您可以放置​​一些负载均衡器来清理请求,那么jiffy是一个不错的选择,因为jiffy会将segfaults引入您的代码 - 请查看问题列表。

无论如何,如果你需要的只是快速的GET,那么你可能想要选择erlang - >解码json - >商店 - >回复工作量。