【问题标题】:Acceptor pooling and load balancing in Erlang?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() 并且操作系统内核决定“竞争”的结果时也是一样的。

【问题讨论】:

    标签: performance erlang load-balancing unicorn


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

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