18

作为一名 ruby​​ist,我决定采用 erlang 以获得高性能、可靠的后端。设置非常简单:获取 post 请求,向 redis 写入内容,返回统计信息。所有的json。这也是为什么我如此关心每秒请求数的原因。

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

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

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

我意识到我可以在 erlang 中使用 ets 来节省时间,并在响应后将 redis 留作“后台处理”,但这不会产生什么影响。甚至对'hello world' erlang 腿后面的简单测试。

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

4

3 回答 3

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

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

最重要的是,这不仅可以被认为是 Erlang 世界的微基准,还可以是 nano 或 atto 基准。当你尝试更困难、更复杂的事情时,真正的力量就会显现出来。并发请求应该以非常复杂的方式相互影响并且您必须处理最终一致性并实现它更具可扩展性并且需要使用异步进程间通信。

于 2014-08-14T09:40:25.030 回答
7

我的 2 美分。你有错误的一端。您正在测试 JVM 已针对其进行优化的一种机器上的问题,该机器已针对 JVM 进行了优化。

您真的不会看到 Erlang/OTP 在 mac book pro 上可用的内核数量方面的优势。这只是我的粗略猜测,但我会惊讶地看到 Erlang 在少于 8 核的服务器上击败了 JVM。在当前的硬件上使 JVM 尽可能快地投入了大量的工时。

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

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

于 2014-09-02T03:01:48.190 回答
5

仅供参考:“+A 100”对网络没有帮助,它仅用于文件 IO。如果您真的想要快速的 Web 服务器,请查看 github.com/knutin/elli,它会在硬件上为您提供 80 kprs,而牛仔将为您提供 30 krps。另一方面,许多人指责 elli 没有遵循 OTP 原则。

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

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

于 2014-08-23T00:02:59.137 回答