在linux服务器上处理多个客户端连接的正确方法是什么?

您好我正在使用TCP在C语言的Linux上写服务器。 服务器必须处理多个连接(最多约5000个)。 5000是最大的,但平均值应该是500 – 1000.我想知道什么是最好的用于处理客户连接和聆听。 如果最好为每个客户端使用一个线程或使用select()函数。

1)线程 – 每个客户端都有自己的线程。 线程正在侦听客户端的请求并处理它。

selectfunction – select一个循环,所有请求正在处理。 (类似于这个http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/ )

如果我使用线程,则需要大量的内存和CPU性能。 因此,我更喜欢使用select,但我不确定select是否可以处理如此多的连接,以及是否不会减慢来自服务器的响应(有必须通过客户端套接字的循环)。 所以可以使用select来做这么多的客户端吗?

我正在寻找我的答案,但我没有find它,或者我只是不知道要search什么。 所以请不要不高兴 对不起我的英语不好。

一般来说,线程非常昂贵:每个线程都需要其调用堆栈(通常为兆字节),并在调度程序中使用任务。 所以常见的建议是最多有几十个线程(也许使用一些线程池 )。 可能有一百个线程可能是合理的(在一些强大的服务器上),但是成千上万的线程可能是不合理的,即使空闲的线程也是昂贵的。

所以我建议使用poll(2)这样的多路复用调用(比select通常对文件描述符的数量有硬编码限制的选项, fd_set的内置大小fd_set )。 另外还可以使用线程池来为活动连接(或请求)提供服务。

其实,你所说的就是C10K的问题 。 你也可以使用epoll(7) 。

几个事件循环库提供了一些有用的基础设施: libev , libevent ,GTK的Glib ,…

顺便说一句,你可以有一个混合的方法:使用线程池的一个进程池(也许运行在不同的机器上)。

请注意,有些编译器提供拆分堆栈 ,而Go语言的goroutines被设计为启用许多“ 绿色线程 ”。