如何提高服务器端的效率
在网络编程中,server端accept到一个连接后,马上开启一个接收线程进行数据的接收和处理,因为需进行一些特殊处理,这个过程需要一定的时间(大概半秒左右),而当client端很多时,容易造成连接失败,从而产生数据丢失。
采用何种机制,可以避免或尽量减少这种冲突。
现在准备将数据接收和数据处理分开,那么这两部分间如何进行数据交互了,采用何种机制较可靠一点(消息、自定义链表还是其他)。
问题点数:100、回复次数:30Top
1 楼masterz(www.fruitfruit.com)回复于 2005-07-07 15:21:29 得分 10
看看这2本书
Programming Server Side Application for Windows 2000.chm
Network Programming for Microsoft Windows
有时间的话可以研究ACETop
2 楼comman_wang(一加一)回复于 2005-07-08 09:05:05 得分 0
谢谢masterz的指点.
我想继续听听大家的意见,希望大家能够将自己的经验共享一下,谢谢!Top
3 楼VCSQLVB(深谷清音(谁知还是难脱俗尘))回复于 2005-07-08 11:26:04 得分 0
你要在windows系统下提高服务性能,最好的办法是服务端使用IOCP,用AcceptEx代替accept,用完成端口来管理你的网络事件。Top
4 楼huqian2003(huqian2003)回复于 2005-07-08 11:32:52 得分 0
IOCP + 线程池 是最好的解决办法
用增加内存使用量为代价来提高系统的速度和稳定性Top
5 楼lifengice0706(无)回复于 2005-07-08 15:42:14 得分 5
曾在一本书中,看到过windows下几种socket使用方式的比较,完成端口的性能确实不错。如果要实现跨平台的话,ace中的前摄器模型(ace_proactor)是很好的选择。Top
6 楼qrlvls( 空 气 )回复于 2005-07-08 16:58:03 得分 15
IOCP 本身就是基于线程池实现的,因此不需要再次扩展线程池
现在高效的网络服务器模型还是使用完成端口来实现Top
7 楼gdy119(夜风微凉)回复于 2005-07-08 17:08:47 得分 10
完成端口是最好的,
WSAEventSelect()+线程池 其次;
纯粹的多线程在次之;Top
8 楼comman_wang(一加一)回复于 2005-07-11 20:52:05 得分 0
谢谢各位给我提出建议.那么我想了解一下完成端口的实际处理效率如何.(在windows平台下,采用VC开发)
另外多CPU对性能的提升作用大吗?请各位继续指教.谢谢!Top
9 楼loseme915(郁闷)回复于 2005-07-11 21:00:44 得分 5
如果你的并发真的有成千上万的话可以考虑,在你的真正的服务器前加一个负载平衡,后面架设多台工作服务器。至于你的处理过程用多线程还是用线程池都是次要的,就算设计出再好的线程池,也不能满足无限止的并发啊。处理好均衡是最重要的。如果服务器不能稳定的工作什么都是白费!!Top
10 楼qrlvls( 空 气 )回复于 2005-07-11 21:03:27 得分 0
Windows 网络编程一书中曾经给出了一个数据
使用完成端口的线程用两个线程100%的正确接收7000个/次客户端连接
而不使用完成端口的情况下用数十个线程接收成功率不足一半Top
11 楼comman_wang(一加一)回复于 2005-07-11 21:28:39 得分 0
对于loseme915(郁闷)的说法表示赞同。不管采用哪种架构,其并发数量都是有限制的。如每秒能正确接收多少次连接(函数调用都是需要耗费时间的)。
对于qrlvls(空 气)的数据表示理解。从我的demo程序分析看,不采用完成端口也就每秒处理小几十个连接。
所以需要与大家讨论一下,能够集思广益。谢谢!Top
12 楼wwwllg(野蛮人)回复于 2005-07-12 08:46:08 得分 5
to qrlvls(空 气) ( ) 信誉:
不要瞎说,误导。Top
13 楼VCSQLVB(深谷清音(谁知还是难脱俗尘))回复于 2005-07-12 15:30:35 得分 15
to qrlvls(空 气) ( ) :
使用完成端口的线程用两个线程100%的正确接收7000个/次客户端连接
不清楚要表达什么,每次是多长时间,一个小时的话远不止这么多,1秒的话恐怕又太夸张了些。Top
14 楼comman_wang(一加一)回复于 2005-07-13 10:58:49 得分 0
谢谢大家的关注。
对于qrlvls(空 气) 所说的:
“使用完成端口的线程用两个线程100%的正确接收7000个/次客户端连接”这个我不太清楚,我的demo程序分析看,采用普通的多线程也就每秒处理小几十个连接。不知各位是否知道这种架构的性能大概是多少(我采用TCP+windows 2000,监听到一个连接开一个接收线程)
Top
15 楼BuZhang_AP97091(Email:gold_ap97091@163.com,Q45324223)回复于 2005-07-13 11:03:12 得分 1
好久没有见到masterZ了,激动中Top
16 楼sodme(大宝)回复于 2005-07-13 11:06:06 得分 5
server端accept到一个连接后,马上开启一个接收线程进行数据的接收和处理,
-------------------------------------------------------------------------------
首先,你的这种架构方案就不是高效率的方案,你是thread per client,每个客户端的处理都开一个这样的线程,你不觉得累吗?别把机子当黄牛,行不?Top
17 楼alating(我是熬夜狂)回复于 2005-07-13 11:15:24 得分 1
现在正在做一个服务器客户端的程序,关注中!!!!大家继续讨论Top
18 楼comman_wang(一加一)回复于 2005-07-19 10:41:02 得分 0
sodme(大宝)的建议是值得考虑的。
其实原来考虑这种架构时,主要是出于设计简单方面考虑的。多线程程序作为数据交互的平台一般是作为底层的,所以稳定和可靠是第一位的。而thread per client逻辑对于初学者更容易理解和掌握的,虽然效率不是很高,但还是经受过长期考验的。
现在随着规模的扩大和性能的提升,效率方面的劣势也就显现出来,所以希望各位能够把经验共享交流一下。谢谢!Top
19 楼elssann(睡睡裤)回复于 2005-07-19 14:02:26 得分 1
啊暗暗啊啊啊
Top
20 楼HiIM()回复于 2005-07-19 17:45:55 得分 5
提高服务器端的效率不是这样可以笼统来讨论的。和整个服务器端的架构有密切关系。需要仔细处理的细节也很多,绝不单是网络通讯部分就可以决定的,所以这样的讨论太不科学。Top
21 楼ForTopLevel(Beahead)回复于 2005-07-19 20:49:50 得分 5
完成端口,毕竟他有系统的底层在支持,自己做线程池太不合算了.Top
22 楼AntonlioX(做人要厚道)回复于 2005-07-19 21:55:41 得分 1
mark upTop
23 楼chengwei02(flyingeagle)回复于 2005-07-28 18:31:55 得分 2
完成端口Top
24 楼flashboy(爱写程序的小绵羊)回复于 2005-07-29 13:10:16 得分 1
赞成elssann(睡睡裤) 说的!!!Top
25 楼HiIM()回复于 2005-07-30 18:49:00 得分 0
看了对这位大宝的留言不知道大家有什么看法。
http://blog.csdn.net/sodme/archive/2005/06/15/394576.aspx?Pending=true
marrabech 发表于2005-07-26 2:21 PM
写的大体万不错,不过这哥们看得出没有实际经验
单台2万是什么了不起的数据,edonkey服务器单台可以达60万连接
1..3个connect server+n个game server+1个数据库agent server
就能够构成一个服务器组了
短连接..,的观点是错误的,无论如何服务器端都要维持对应的连接,快速断开,只是把负载踢给其他程序,该干的活是逃不掉的
全局信息的索引..这不是问题,一个database agent server 就可以解决
xingliu2001@hotmail.com 发表于2005-07-27 9:30 AM
marrabech:你好。我刚学服务器编程,希望能够认识你。交个朋友。
能给个联系方式吗。我的MSN:xingliu2001@hotmail.com
另:支持sodme.反对II,我们写文章、读文章希望大家能共同提高。
打赢老外。
xingliu2001@hotmail.com 发表于2005-07-27 9:30 AM
marrabech:你好。我刚学服务器编程,希望能够认识你。交个朋友。
能给个联系方式吗。我的MSN:xingliu2001@hotmail.com
另:支持sodme.反对II,我们写文章、读文章希望大家能共同提高。
打赢老外。
sodme 发表于2005-07-27 7:41 PM
to marrabech:
偶一直是从事win平台下的服务器开发,说实话,我还真没见到过在目前我看到的网游项目中有单台能支持2万以上的,如果你遇到过,请你告诉我游戏的名字。我知道,在linux底下支持2万在线并不是什么大不了的,但那是linux。至于说edonkey单台60万或者更高,我想,这不能简单归结于“连接量”问题,edonkey的服务器逻辑以及数据通信量与游戏服务器相比,游戏服务器要复杂得多,你以edonkey有连接量来类比游戏服务器的承载量显然是不合适的。
相反的,我坚持认为短连接是解决有限的系统规模与庞大用户量矛盾的重要手段,至于服务器组到底可支撑多少人,当然还是要看底层的逻辑服务器的同时承载量。在底层的服务器组内,客户端肯定是要保持连接的,这一点毫无疑问。你自己也说了要快速断开。我不知道你这里的不是短连接是什么?请注意,我说的短连接,并不是指的在game server这一层,而是在connecter server这一层。
stanley 发表于2005-07-28 4:59 PM
qq那些服务器之间的数据同步算不了什么。
GOOGLE的流量更大,一般采用infiband技术,采用特殊硬件,各个机器之间直接访问对方内存,几个G的流速都可以。
短连接解决负载均衡的问题,没看明白。连接都建立了,还能怎么均衡?把自己的活推给别人?推给谁?在降低每个连接的消耗上下工夫个人觉得更好,比如如何减少交流的数据,如何减少运算,等等,这是最关键的。
野草 发表于2005-07-28 9:45 PM
,假设每个服务器程序最高支持2W的用户在线
======================
以棋牌类游戏的数据量以及逻辑运算量,单台服务器支持2W的用户,即使采用UNIX系统也是不太可能的吧.我说的是一般的单双CPU PC服务器,当然可能存在这么牛的PC服务器,当然不考虑中、小型机机之类。个人觉得,这个服务器程序肯定是基于分布式服务器构架。也就是有一台机子负责数据的接收和发送,就是客户端接触到的机子。其他的
逻辑运算则分布到各个服务器中处理。
楼主的文章写得不错。受益匪浅啊~~
sodme 发表于2005-07-29 3:01 AM
to stanley:
sorry,这里提到的“负载均衡”应该是打引号的,呵呵,并不指如LVS那样实现的底层负载均衡,而是指应用层的,它并不负责在底层建立连接的这一步之前作均衡,而是只作业务层的均衡,呵呵。
sodme 发表于2005-07-29 3:05 AM
to 野草:
用linux作棋牌类的,单台支持2万,问题不大。呵呵。分布式架构是肯定有的,但每台单独的服务器程序,也完全有能力支持2万在线。偶现在业余时间正在linux下作这方面的开发。
carcy 发表于2005-07-29 10:07 AM
光是比连接数没有什么实际意义.
如果链接上去后什么也不干,什么包也不发,
即使一台普通PC,也能开到64511 (65535 -1024)个链接。
这个连接数跟游戏设计是相关的。
不同的游戏,相差很大,带宽需求不同,每秒钟发包数、接包数不同。
保守的算,所有链接合起来一秒钟发一万条消息的话(也就是每条链接一分钟发一次包),
服务器网卡每秒钟要处理多少次中断?时钟中断也不过18ms一次!
这时会出现严重的丢包,然后客户端超时重传,问题会更加严重。
不同的游戏比这个一点意义没有。
AAA 发表于2005-07-29 4:28 PM
看来说大宝是在棋牌(类)connecter server这一层做的。说的没有错吧?
对MMORPG网络游戏希望能看到你的所知道的看法。特别是整体架构上的看法,老在门口转不过瘾,哈哈
joey 发表于2005-07-30 8:46 AM
sodme的东西不是用小工具抓点包为依据来推测一些想象的东西就是转点翻译的iocp的文章。还有点什么空连接的数量讨论加较简单的棋牌逻辑,就是没有深入mmorpg网络游戏服务器端架构的东西,整体感觉单薄,缺乏有力度的知识文章。
如果能写点关于mmorpg网络游戏服务器端设计应该注意的要点之类的文章应该会增添点色彩。Top
26 楼ExtUSA(兵者)回复于 2005-07-30 19:13:16 得分 5
这就是经验丰富的架构师一展风采的时候了。
只知道网络部分皮毛的入门者是不会对你有什么帮助的。Top
27 楼HiIM()回复于 2005-07-31 06:13:02 得分 2
海边空气不错啊,深呼吸...
感觉昨天说的这个大宝是想换工作单位吧~
锈锈自己“25岁,原成都某网络游戏公司副总”也可以理解~
在blog公开和各公司hr联系,不知道现在换新东家没有~
不容易呀Top
28 楼gohappy_1999(碧水蓝天)回复于 2005-07-31 21:19:55 得分 1
顶一下Top
29 楼ppchen(韦古)回复于 2005-08-01 13:21:52 得分 5
为什么很简单的事情,搞得这么复杂。
连接层的东西都很简单的,只要连接<15w的,请求<4w/S。
好像大家都很痛苦似的,随随便便就可以啦。
安慰大家一下,其实很简单啦。Top
30 楼comman_wang(一加一)回复于 2005-08-08 16:27:48 得分 0
感谢大家的讨论,希望能够继续得到指点.Top




