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

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

概述嗨,我正在使用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”.

总结

以上是内存溢出为你收集整理的在linux服务器上处理多个客户端连接的正确方法是什么全部内容,希望文章能够帮你解决在linux服务器上处理多个客户端连接的正确方法是什么所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1025796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存