高性能服务器使用libEvent

High-performance server using libEvent

本文关键字:libEvent 服务器 高性能      更新时间:2023-10-16

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

在windows端,我实现了一个IO Completion Port服务器,到目前为止似乎可以处理压力。由于linux的需求突然出现,我现在试图找到一个跨平台的库,它给了我一种使用线程池的accept/read事件的方法。

到目前为止,libEvent似乎是正确的选择(在这个链接中类似于"示例代码:一个echo服务器")。但是引用libEvent文档中的另一页:

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

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

有人有高绩效的经验吗?基于libEvent?我是不是该换个图书馆?

这样一个服务器的示例代码将是完美的

如果您希望保持跨平台,那么libevent是可行的方法。

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

注意libevent在Linux内部使用epoll。

关于你的多读设计问题,我希望你不要使用一个线程来处理每个传入的客户端连接…如果您这样做,就会违背使用事件驱动模型的目的!您应该设计代码,使单个线程能够处理少量客户端连接,并随着并发连接数量的增加而增加线程数量。

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