繁体   English   中英

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

[英]Erlang (or elixir) performance (requests per second) is slow vs jruby?

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

选择的工具: webmachine瞬间对JSON编码/解码, poolboy用于连接池,并且eredis为redis的通信。

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

我的erlang每秒大约有5000个请求,而jruby / torqbox大约有12,0000个请求。 在这里查看完整的ruby性能测试设置

我意识到我可以在erlang中使用ets来节省时间,并且在响应之后留下用于“后台处理”的redis,但这将没有什么影响。 甚至是对'你好世界'背后的二郎腿的简单测试。

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

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

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

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

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

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

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

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

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

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

无论如何,如果你需要的只是快速的GET - >解码json - > store - > REPLY工作负载,那么你不想选择erlang。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM