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

Posted

技术标签:

【中文标题】Erlang 中的接受器池和负载平衡?【英文标题】:Acceptor pooling and load balancing in Erlang? 【发布时间】:2012-12-16 19:35:42 【问题描述】:

来自http://www.erlang.org/doc/man/gen_tcp.html#accept-1:

值得注意的是,accept 调用不一定要发出 来自套接字所有者进程。使用 5.5.3 及更高版本的 模拟器,可以同时发出多个接受调用 不同的进程,这允许一个接受进程池 处理传入的连接。

(Q1)是不是意味着我们可以在Erlang中拥有Unicorn风格的负载均衡?

(Q2)如果有,是否有任何现有的服务器或库使用此功能?

(Q3) Unicorn 在请求处理快速的假设下工作。在同样的假设下,Erlang中结合acceptor和worker是否可以获得更好的性能?

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

【问题讨论】:

【参考方案1】:

我还在 Erlang Questions 邮件列表中发布了这个问题。 正如 Daniel Goertzen 所指出的, Erlang中有acceptor pool库,如ranch和swarm。

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

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

我更喜欢 swarm 风格,因为它既适合快速也适合慢速 请求,而 Unicorn 需要快速请求。

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

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

unicorn 对于 Comet/reverse-HTTP/push 应用程序的效率非常低 HTTP 连接花费大量空闲时间的地方。

【讨论】:

一种猜测是牧场方法和群体方法在实践中一样有效。举个例子:牛仔使用牧场,牛仔速度极快。 @IGIVECRAPANSWERS 同意。顺便说一句,有没有关于牛仔等的最新基准? 我不知道。我的猜测是您需要衡量自己的工作量。对于我的工作负载,问题早在牛仔进入成为瓶颈之前很久就出现在链条的其他地方。 @IGIVECRAPANSWERS 感谢您的回复 :-)

以上是关于Erlang 中的接受器池和负载平衡?的主要内容,如果未能解决你的问题,请参考以下文章

基于 Erlang 的聊天(负载平衡和通知分发)

操作系统如何在接受同一个套接字的多个进程之间进行负载平衡?

所谓的性能,是负载吞吐量可接受的响应时间和资源利用率之间的一种平衡。

GCP 中的网络和 HTTP(s) 负载平衡器有啥区别

负载平衡集群中的 PHP 会话 - 怎么样?

负载平衡环境中的 .Net Core 托管服务