4

我正在设计一个高性能服务器(不是 HTTP 服务器)并且正在考虑我的设计选项。服务器应支持大量传入连接(以千计),并在 windows 和 linux 上编译。

在 Windows 端,我已经实现了一个 IO 完成端口服务器,到目前为止它似乎可以处理压力。由于 linux 需求突然出现,我现在尝试找到一个跨平台库,它可以让我通过线程池使用接受/读取事件。

到目前为止,libEvent 似乎是正确的选择(类似于此链接中的“示例代码:回显服务器” )。但是从libEvent 文档中的另一个页面引用:

如果将 event_base 设置为使用锁定,则在多个线程之间访问它是安全的。但是,它的循环只能在单个线程中运行。如果要让多个线程轮询 IO,则需要为每个线程设置一个 event_base。

我的基本设计是让线程池对接受和读取事件做出反应。如果我理解正确的话,这句话说我不能那样做。

有没有人有过高性能的经验。基于 libEvent 的服务器?我应该使用不同的库吗?

这种服务器的示例代码将是完美的

4

1 回答 1

6

libevent如果您想保持跨平台,这是要走的路。

如果你想要高效,我会推荐平台特定的 API,比如 IO 完成端口(你在 Windows 上工作)和Linux 中的epoll :

请注意,无论如何,libevent 在 Linux 内部都使用 epoll。

至于您的多线程设计问题,我希望您不要使用一个线程来处理每个传入的客户端连接......如果您这样做了,您将违背使用事件驱动模型的目的!您应该设计您的代码,以便少数客户端连接由单个线程处理,并随着并发连接数的增加而增加线程数。

我也不会对客户端在执行 IO 接收数据的线程池中发送的数据进行任何繁重的计算工作。我会将执行网络密集型 IO 和执行任何 CPU 密集型计算的任务分成两个单独的线程池

于 2013-03-20T16:29:48.597 回答