Xia*_*Jia 8 erlang performance load-balancing unicorn
来自http://www.erlang.org/doc/man/gen_tcp.html#accept-1:
值得注意的是,不必从套接字所有者进程发出accept调用.使用版本5.5.3及更高版本的仿真器,可以从不同进程发出多个同时接受调用,这允许处理传入连接的接受器进程池.
(Q1)这是否意味着我们可以在Erlang中实现Unicorn风格的负载均衡?
(Q2)如果是,是否有任何现有的服务器或库使用此功能?
(Q3) Unicorn在假设请求处理很快的情况下工作.在同样的假设下,是否有可能通过在Erlang中组合受主和工人来获得更好的性能?
对于那些不熟悉Unicorn的人来说,它是一个传统的UNIX prefork web服务器.工作进程之间的负载平衡由OS内核完成.所有工作者共享一组通用的侦听器套接字,并对它们执行非阻塞的accept().如果没有什么可以接受(),内核将决定给哪个工作进程提供套接字,工作人员将休眠.对于单个侦听器套接字,我相信当工作进程阻塞accept()并且OS内核决定"竞争"的结果时,它是相同的.
我还在 Erlang Questions 邮件列表中发布了这个问题。\n正如Daniel Goertzen所指出的,\nErlang 中有接受器池库,例如ranch和swarm。
\n\nranch 的工作方式与 Unicorn 不同,它只在许多进程中“接受”,然后将套接字传递给某个工作进程。
swarm 的工作方式与 Unicorn 相同,即接受者和工作人员结合在一起。(感谢Lo\xc3\xafc Hoguin指出)\n但是它们有点不同,因为 swarm 可以在处理已接受的套接字的同时接受新的套接字,而 Unicorn\n 仅在已接受的套接字处理完毕后才接受
我更喜欢 swarm 风格,因为它非常适合快速和慢速请求,而 Unicorn 需要快速请求。
\n\n\n\nunicorn 不是尝试高效地服务慢速客户端,而是依赖缓冲反向代理来有效地处理慢速客户端。
\n\nunicorn 并不适合所有应用程序。unicorn 针对 CPU/内存/磁盘密集型且花很少时间等待外部资源(例如数据库服务器或外部 API)的应用程序进行了优化。
\n\nunicorn 对于 Comet/reverse-HTTP/push 应用程序效率非常低,其中 HTTP 连接花费大量时间处于空闲状态。
\n
| 归档时间: |
|
| 查看次数: |
2747 次 |
| 最近记录: |