作为一名rubyist,我决定采用erlang来实现高性能,可靠的后端。 设置非常简单:获取发布请求,将内容写入redis,返回统计信息。所有的json。这也是为什么我非常关心每秒的请求。
选择工具:webmachine,jiffy用于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用于后台处理'在回复后写,但这将产生很小的影响。甚至是对“你好世界”的简单测试。二郎腿背后。
有什么建议吗?我做错了吗?
答案 0 :(得分:18)
+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 - >商店 - >回复工作量。