加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:02:00 所属栏目:Linux 来源:网络整理
导读:嗨,我正在使用TCP在C语言的 Linux上编写服务器. 服务器必须处理多个连接(大约5000个连接). 5000是最大值,但平均值应该是大约500-1000. 我想知道什么是更好地用于处理客户端连接和监听.如果最好为每个客户端使用一个线程或使用select()函数. 1)线程 – 每个客
嗨,我正在使用TCP在C语言的 Linux上编写服务器.
服务器必须处理多个连接(大约5000个连接). 5000是最大值,但平均值应该是大约500-1000.
我想知道什么是更好地用于处理客户端连接和监听.如果最好为每个客户端使用一个线程或使用select()函数.

1)线程 – 每个客户端都有自己的线程.线程正在侦听客户端的请求并对其进行处理.

选择功能 – 一个带选择的循环,其中所有请求都在处理中. (类似于这个http://www.binarytides.com/multiple-socket-connections-fdset-select-linux/)

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

我正在寻找我的答案但是,我还没有找到它,或者我只是不知道要搜索什么.所以请不要生气.

解决方法

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

因此,我建议使用像poll(2)这样的多路复用调用(优于通常对文件描述符数量进行硬编码限制的选择,内置大小为fd_set).您可以另外使用线程池来提供活动连接(或请求).

实际上,你所指的是C10K problem.你也可以使用epoll(7).

几个event loop图书馆提供了一些有用的基础设施:来自GTK的libev,libevent,Glib,……

顺便说一句,您可以使用混合方法:使用线程池的进程池(可能在不同的计算机上运行).

请注意,有些编译器提供split stacks,而Go language的goroutines设计用于启用许多“green threads”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读