NBIO的高效preforked服务器设计,如epoll,kqueue使用libevent

时间:2011-11-21 07:20:17

标签: c unix epoll libevent kqueue

我打算为客户端写一个'彗星'服务器来'流''数据。我过去已经增强了一个以利用多核CPU,但现在我从头开始。我打算使用epoll / kqueue或libevent来为服务器供电。

我一直在考虑的问题之一是要使用哪种服务器设计?我有几个选项,因为我计划使用多进程模型来利用所有CPU核心。

  1. 预分叉多进程 - 每个进程都自己接受
  2. 使用master - master进程的预分叉多进程接受然后使用描述符传递将接受的套接字传递给进程
  3. 具有不同端口的预分叉多进程 - 每个进程侦听同一系统上的不同端口。负载均衡器根据来自各个守护程序进程的一些负载反馈决定哪个进程获得下一个连接
  4. 设计#2是最复杂的。设计#3很简单,但涉及到我需要的额外硬件,无论设计如何,因为我将在多台机器上运行并且无论如何都需要负载均衡器。设计#1有一个雷鸣般的群体问题,但我认为雷鸣群对8个进程并不是一个大问题,但当客户经常连接和断开连接时它会变得很大(这应该是罕见的,因为这是一个彗星服务器)。

    正如我所看到的,#2很复杂,并且由于主设备和设备之间的描述符传递而需要2个额外的系统调用。每个接受的奴隶进程。这个开销是否比雷鸣般的群体问题更好?如果我有8个进程唤醒并执行接受,我可能会看到8个接受调用,因为我选择了设计#1?

    我的设计选择有哪些优缺点?你会推荐什么?

2 个答案:

答案 0 :(得分:0)

如果它不是进程而是线程我会去选项2.无论如何对于进程这对我来说看起来很昂贵,所以我们要在1到3之间进行选择。

如果有可能以某种方式估计预期的负载,我宁愿选择1。你能设定一个睡眠牧群大小的上限,会说预先准备好的过程吗?您需要多快才能接受新连接?

所以,如果你要去汤姆·杜恩森的方式,并把大群快速带到红河下来到堪萨斯州,你可能需要选择第三种方式。所以无论如何资源都可用......

答案 1 :(得分:0)

如果您的目标是制作一个非常大规模的高吞吐量HTTP守护程序, #1,#2和#3都不合适。如果你想获得可扩展性,你最好使用具有多线程的1到m或m到n模型,就像nginx / lighttp那样。

事实上, 如果你希望程序在一秒钟内处理不到一百个连接,那么  #1,#2和#3可能没有任何明显的区别。

但是,如果您可以通过将流程切换到线程来扩展您的程序,我会选择#2,因为它可以轻松集成到1到m或m到n的处理模型中