所有。我试图找出以最佳方式处理大量并发连接(超过800k)的最佳方法。我已决定使用libevent来处理套接字上的读/写,并将使用后端的一个端口并将fd放在非阻塞套接字上。我的问题在哪里发挥作用:
1)关于事件库的解放 - 例如,如果我为每个核心运行一个线程,每个核心都有自己的libevent基础,监听单个fd的传入连接,那么libevent如何处理多个事件库被触发在那个单一的fd?我们的想法是接收传入连接,接受它并在特定于该连接的新fd上启动新事件库。或者,是过去做的合适方式 - 在主程序线程中运行主事件库并将传入连接推送到工作线程以处理接受,然后为每个创建一个新的事件库连接呢?
2)每个连接的线程......是或否?在过去的实现中,我已经完成了每个接受连接的1:1线程模型。最终结果显然连接了500个客户端,500个线程以及我用作工作队列的任何线程。但是,我担心一旦我达到成千上万的连接标记,这可能会引起问题......任何人都可以确认吗?我也觉得在使用异步IO的东西时有很多线程,比如libevent不是必需的,只是增加了比所需要的更多的开销...但我可能是错的。
这是我第一次写一些能够支持这种高用户负载的东西,而我更愿意从一个可靠的概念设计中作为手段从头开始编写它充分理解游戏中的一切。显然我可以去挖掘像UnrealIRCD或者nginx的源代码这样的东西,然后想出一个解决方案,但是我真的更愿意通过理解我写的是什么来做到这一点以及为什么我是这样写的。因此,非常感谢一些反馈。
答案 0 :(得分:2)
我相信你可能会混淆两种不同的编程范式。如果您使用libevent,每个线程将处理数百或数千个连接。有关从何处开始开发高容量/并发服务器搜索C10K问题的详细信息。这是一个开始的页面:
http://www.kegel.com/c10k.html
顺便说一句,如果要扩展到800K并发连接,则不应使用“每个连接的线程”模型。