在阅读着名的C10k article并在网上搜索自编写以来事情如何演变之后,我想知道今天的标准服务器是否可以处理> 10000使用每个连接的线程的并发连接(可能借助于线程池来避免创建/终止进程)。
可能会影响问题解决方法的一些细节:
显然我不是这方面的专家,所以任何评论或建议都会受到高度赞赏:)
答案 0 :(得分:58)
绝对。标准服务器可以使用每个连接一个线程的模型处理超过 10K并发连接。我已经构建了这样一个应用程序,五年前,它在标准Linux服务器上运行时每个进程的并发连接数超过50K。如今,应该可以在当前硬件上运行具有超过250K并发连接的相同应用程序。
只有几件事需要记住:
SO_REUSEPORT
在同一端点上创建多个套接字来优化新连接。open files
(默认1.024),max user processes
/proc/sys/kernel/pid_max
(默认为32K),/proc/sys/kernel/threads-max
和/proc/sys/vm/max_map_count
(默认为65K)。上面提到的应用程序最初设计为仅处理2K并发连接。但是,随着使用的增长,我们不必对代码进行重大更改,以便扩展到50K连接。
答案 1 :(得分:21)
您可能希望最近对该主题采取后续行动:The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution。
答案 2 :(得分:4)
服务器的常用方法是:(a)每个连接的线程(通常带有线程池),或(b)带有异步IO的单线程(通常带有epoll或kqueue)。我的想法是,这些方法的一些元素可以并且经常应该组合使用异步IO(使用epoll或kqueue),然后将连接请求移交给线程池进行处理。这种方法将异步IO的有效分派与线程池提供的并行性结合起来。
我编写了这样一个有趣的服务器(在C ++中),它在Linux上使用epoll,在FreeBSD和OSX上使用kqueue以及线程池。我只需要通过它的步骤进行繁重的测试,做一些代码清理,然后把它扔到github上(希望很快)。