使用 libEvent 的高性能服务器 [关闭]
Posted
技术标签:
【中文标题】使用 libEvent 的高性能服务器 [关闭]【英文标题】:High-performance server using libEvent [closed] 【发布时间】:2013-03-20 15:25:48 【问题描述】:我正在设计一个高性能服务器(不是 HTTP 服务器)并且正在考虑我的设计选项。服务器应支持大量传入连接(以千计),并在 windows 和 linux 上编译。
在 Windows 端,我已经实现了一个 IO 完成端口服务器,到目前为止它似乎可以处理压力。由于 linux 的需求突然出现,我现在尝试找到一个跨平台库,它可以让我通过线程池使用接受/读取事件。
到目前为止,libEvent 似乎是正确的选择(类似于 link 中的“示例代码:回显服务器”)。但引用another page in the libEvent docs:
如果一个 event_base 设置为使用锁定,那么访问它是安全的 多个线程之间。它的循环只能在单个线程中运行, 然而。如果你想让多个线程轮询 IO,你需要 每个线程都有一个 event_base。
我的基本设计是让线程池对接受和读取事件做出反应。如果我理解正确的话,这句话说我不能那样做。
有没有人有过高性能的经验。基于 libEvent 的服务器?我应该使用不同的库吗?
这样的服务器的示例代码将是完美的
【问题讨论】:
【参考方案1】:libevent
是您想要跨平台的最佳选择。
如果您想要高效,我会推荐特定平台的 API,例如 IO 完成端口(您在 Windows 上工作)和 Linux 中的 epoll:
请注意,无论如何,libevent 在 Linux 内部都使用 epoll。
至于你的多线程设计问题,我希望你没有使用一个线程来处理每个传入的客户端连接......如果你这样做了,你将违背使用事件驱动模型的目的!您应该设计您的代码,以便少数客户端连接由单个线程处理,并随着并发连接数的增加而增加线程数。
我也不会对客户端在执行 IO 接收数据的线程池中发送的数据进行任何繁重的计算工作。我会将执行网络密集型 IO 和执行任何 CPU 密集型计算的任务分离到两个单独的线程池中
【讨论】:
以上是关于使用 libEvent 的高性能服务器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章