海量客户端的socket服务器设计(在线等)

hb0800092 2011-08-22 10:49:48
本人现在想再一台linux服务器上用c开发一个可能会有10万 100万 或上千万并发连接的服务器,目前我只用了线程池,一旦有1000个左右的客户端连接,cpu就会飙到100% , 原因可能是平凡的线程切换造成的,不知道有没有什么方法可以在一台服务器上实现这么大并发要求
...全文
307 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
乔巴好萌 2011-08-22
  • 打赏
  • 举报
回复
不好意思 看错了
你那个是1000个线程了
前面也说了 不是强并发 就不要用线程模型了
乔巴好萌 2011-08-22
  • 打赏
  • 举报
回复
你的CPU消耗是不是别的逻辑造成的
我写的流媒体服务器 2,300个线程也没到CPU 100%
当然 服务器的性能强些

[Quote=引用 7 楼 hb0800092 的回复:]
我当然知道普通电脑不可能实现,select , poll 都试过select有连接限制,虽然可以改,但是不知道改了之后对系统有没有不良影响,同时select好像很慢,epoll还没试,虽然epoll可以解决大并发的情况,但是对cpu的消耗,不知道怎么解决
[/Quote]
jackyjkchen 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hb0800092 的回复:]

我当然知道普通电脑不可能实现,select , poll 都试过select有连接限制,虽然可以改,但是不知道改了之后对系统有没有不良影响,同时select好像很慢,epoll还没试,虽然epoll可以解决大并发的情况,但是对cpu的消耗,不知道怎么解决
[/Quote]

别起那么多线程,并发线程太多,吞吐量不仅得不到提高,而且CPU时间都浪费在线程调度上了
jackyjkchen 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackyjkchen 的回复:]

当客户端太多,而服务器性能有限时,不必恪守一个客户端一个线程的教条,适当的循环,速度差别根本看不出来。

我现在在做的服务端,电信级别的,udp的接收线程只有5~10个,能应付百万级用户(当然不是同时并发)
[/Quote]

而且,我之所以分接收线程还不是为了网络,是为了多进程使用多块加密卡(瓶颈),前端有个转发器,真正对外的udp接收只有一个线程

当然,我这个是鉴权服务器,可能特点上与网站服务器不太一样
hb0800092 2011-08-22
  • 打赏
  • 举报
回复
我当然知道普通电脑不可能实现,select , poll 都试过select有连接限制,虽然可以改,但是不知道改了之后对系统有没有不良影响,同时select好像很慢,epoll还没试,虽然epoll可以解决大并发的情况,但是对cpu的消耗,不知道怎么解决
pathuang68 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 hb0800092 的回复:]
本人现在想再一台linux服务器上用c开发一个可能会有10万 100万 或上千万并发连接的服务器,目前我只用了线程池,一旦有1000个左右的客户端连接,cpu就会飙到100% , 原因可能是平凡的线程切换造成的,不知道有没有什么方法可以在一台服务器上实现这么大并发要求
[/Quote]

如果不是强并发,如果业务处理及其简单,在一台linux服务器用C开发一个并发数量是10万的服务器,或许是可能的。

但100万,上千万就不要去想了。

楼主并发数是强并发还是弱并发?强并发的话,1000就很了不起了。

单台服务器再强大,其能力都是有限的,此类问题的解决之道,可以考虑各种负载均衡的做法。
jackyjkchen 2011-08-22
  • 打赏
  • 举报
回复
当客户端太多,而服务器性能有限时,不必恪守一个客户端一个线程的教条,适当的循环,速度差别根本看不出来。

我现在在做的服务端,电信级别的,udp的接收线程只有5~10个,能应付百万级用户(当然不是同时并发)
iamjie 2011-08-22
  • 打赏
  • 举报
回复
保持合适的线程数在工作,其他的排队等待不就行了。
icansaymyabc 2011-08-22
  • 打赏
  • 举报
回复
如果在普通pc上写一个程序就能达到目的?那些售价上千万美元的专业服务器怎么卖得出去?

你可以上网搜搜服务器价格,那些售价几十万的服务器的内存和CPU频率和硬盘容量还比不上一台5、6千的PC机。它为啥能卖那么贵?因为人家的网卡能支持数千的并发连接。

所以你知道如何解决你的问题了吧?还不赶快凑钱去买服务器!
jackyjkchen 2011-08-22
  • 打赏
  • 举报
回复
单机千万并发?那就是搞笑了。

一个千万并发的网站,肯定都有个巨型的数据中心
乔巴好萌 2011-08-22
  • 打赏
  • 举报
回复
I/O复用啊
可以用select poll epoll什么的
epoll的理论上支持的最大连接数等同于文件描述符数 与内存大小有关
至于单台主机 不管什么样的模型 如果再加上应用层的一些处理
感觉上5万的并发就已经很厉害了
其他的要考虑集群
WebSocket客户端和服务端实例源码 WebSocket ws实例 HTML5 用java实现的服务端 Websocket服务器的正常通信 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发在处理此类业务场景时,通常采用实时通讯方案,常见的是: 轮询,原理简单易懂,就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端服务器端的数据同步。问题很明显,当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并没有更新,带来很多无谓请求,浪费带宽,效率低下。 基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动互联网终端上 Flash 的支持并不好。IOS 系统中没有 Flash 的存在,在 Android 中虽然有 Flash 的支持,但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012 年 Adobe 官方宣布不再支持 Android4.1+系统,宣告了 Flash 在移动终端上的死亡。 从上文可以看出,传统 Web 模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,我们需要一种高效节能的双向通信机制来保证数据的实时传输。在此背景下,基于 HTML5 规范的、有 Web TCP 之称的 WebSocket 应运而生。 早期 HTML5 并没有形成业界统一的规范,各个浏览器和应用服务器厂商有着各异的类似实现,如 IBM 的 MQTT,Comet 开源框架等,直到 2014 年,HTML5 在 IBM、微软、Google 等巨头的推动和协作下终于尘埃落地,正式从草案落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7 中也实现了 WebSocket 协议,从而无论是客户端还是服务端的 WebSocket 都已完备,读者可以查阅HTML5 规范,熟悉新的 HTML 协议规范及 WebSocket 支持。
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧