From http://www.erlang.org/doc/man/gen_tcp.html#accept-1 http://www.erlang.org/doc/man/gen_tcp.html#accept-1:
值得注意的是,accept 调用不必发出
来自套接字所有者进程。使用 5.5.3 及更高版本
模拟器,可以同时发出多个接受调用
不同的进程,允许一组接受进程
处理传入连接。
(Q1)这是否意味着我们可以拥有Unicorn http://unicorn.bogomips.org/Erlang 风格的负载平衡?
(Q2)如果是这样,是否有任何现有的服务器或库使用此功能?
(Q3)Unicorn 的工作原理是假设请求处理是fast。同样的假设下,Erlang 中将acceptors 和workers 结合起来是否有可能获得更好的性能?
对于那些不熟悉 Unicorn 的人来说,它是一个传统的 UNIX prefork Web 服务器。工作进程之间的负载平衡由操作系统内核完成。所有工作人员共享一组通用的侦听器套接字,并对它们执行非阻塞的accept()。内核将决定向哪个工作进程提供套接字,如果没有任何内容可以接受(),工作进程将休眠。对于单个监听器套接字,我相信当工作进程阻塞accept()并且操作系统内核决定“竞赛”的结果时,情况是一样的。
我还在 Erlang Questions 邮件列表中发布了这个问题。
正如所指出的丹尼尔·戈岑,
Erlang中有接受器池库,例如ranch https://github.com/extend/ranch and swarm https://github.com/jeremey/swarm.
我更喜欢群体风格,因为它对于快速和慢速都是理想的
请求,而 Unicorn 需要快速请求。
独角兽并没有尝试高效地服务速度慢的客户,而是
依靠缓冲反向代理来有效地处理缓慢的情况
客户。
unicorn 并不适合所有应用程序。独角兽优化用于
CPU/内存/磁盘密集型且花费很少时间的应用程序
等待外部资源(例如数据库服务器或外部资源)
应用程序编程接口)。
unicorn 对于 Comet/reverse-HTTP/push 应用程序来说效率非常低
HTTP 连接花费大量时间处于空闲状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)