Performance Erlang中的接受者池和负载平衡?

Performance Erlang中的接受者池和负载平衡?,performance,erlang,load-balancing,unicorn,Performance,Erlang,Load Balancing,Unicorn,发件人: 值得注意的是,不必发出接受调用 从套接字所有者进程。使用5.5.3及更高版本的 emulator,可以从发出多个同时接受调用 不同的进程,允许接受进程池 处理传入连接 (Q1)这是否意味着我们可以在Erlang中实现类似的负载平衡 (第二季度)如果是,是否有任何现有服务器或库使用此功能 (第三季度)独角兽的工作假设是请求处理速度很快。在相同的假设下,在Erlang中结合受体和工作者是否可能获得更好的性能 对于那些不熟悉Unicorn的人来说,它是一个传统的UNIX预工作web服务器。工

发件人:

值得注意的是,不必发出接受调用 从套接字所有者进程。使用5.5.3及更高版本的 emulator,可以从发出多个同时接受调用 不同的进程,允许接受进程池 处理传入连接

(Q1)这是否意味着我们可以在Erlang中实现类似的负载平衡

(第二季度)如果是,是否有任何现有服务器或库使用此功能

(第三季度)独角兽的工作假设是请求处理速度很快。在相同的假设下,在Erlang中结合受体和工作者是否可能获得更好的性能


对于那些不熟悉Unicorn的人来说,它是一个传统的UNIX预工作web服务器。工作进程之间的负载平衡由操作系统内核完成。所有工作进程共享一组公用的侦听器套接字,并对它们执行非阻塞accept()。内核将决定向哪个工作进程提供套接字,如果没有可接受的内容,则工作进程将休眠()。对于单个侦听器套接字,我相信当工作进程执行blocking accept()并且操作系统内核决定“竞赛”的结果时,情况也是一样的。

我还在Erlang问题邮件列表中发布了这个问题。 正如Daniel Goertzen所指出的, Erlang中有接受程序池库,如和

  • ranch的工作方式与Unicorn不同,它只在许多进程中“接受”,然后将套接字传递给某个工作进程

  • swarm的工作方式与独角兽相同,即 接受方和工作方是组合的。(感谢Loïc Hoguin指出) 但它们有点不同,因为swarm可以接受一个新的套接字 并行处理接受的套接字,而Unicorn 仅在处理接受的套接字后接受

我更喜欢swarm风格,因为它是快速和慢速的理想选择 请求,而Unicorn需要快速请求

unicorn没有试图高效地为慢客户提供服务 依靠缓冲反向代理来有效地处理慢速 客户

unicorn不适合所有应用程序。独角兽最适合 CPU/内存/磁盘密集型且花费时间很少的应用程序 等待外部资源(如数据库服务器或外部服务器) API)

unicorn对于Comet/ReverseHTTP/push应用程序效率极低 其中HTTP连接花费大量空闲时间


有人猜测,牧场法和群法在实践中同样适用。举个例子:牛仔使用牧场,而且牛仔的速度非常快。@igivecraps的答案也同意。顺便说一句,有关于牛仔等的最新基准吗?我不知道。我猜你需要衡量一下自己的工作量。就我的工作量而言,问题出现在链中的其他地方,远远早于cowboy将其作为一个稍微有点瓶颈的入口。@IGIVECRAPANSWERS谢谢您的回复:-)