这里有了解腾讯或者中游游戏平台架构的吗

24 views
Skip to first unread message

Jacky

unread,
Apr 12, 2006, 5:26:52 AM4/12/06
to 高性能网络编程邮件列表

以前看SODME写过腾讯的架构分析,
大的服务器分类架构大厅 登陆
游戏服务器这些都知道了点,

SODME说腾讯单个游戏服务器支持2W个用户,
这样就单个服务器的通讯架构有没有更详细的讨论过,因为单个服务器是最基本的处理游戏业务逻辑的,我想这个应该和客户端是是长连接的SOCKET,在WINDOWS平台下前面已经有人提供了IOCP模型数据,可以支持到1W用户的长连接
,腾讯技术实力强点
机器配置再高点,可能在WINDOWS平台可以做到支持2W用户长连接的单个服务器.
但腾讯的游戏服务器是WINDOWS的SERVER吗,我估计不是的.
所以它应该不是采用WINDOWS下完成端口模型这种方式,

而在LINUX 或者UNIX下就没有完成端口模型这种可以使用,
这样UNIX下效率最高的是什么模型,直接自己使用EPOLL ?
或者采用ACE的PROACTOR模型来做呢.
要支持2W用户的长连接,线程模型又怎么安排呢,
是一个线程处理400个长连接然后用50个线程这种类似的吗,还是有什么更好的模型来实现这
2W用户长连接的数据通讯.

有了解的吗,可以详细讨论下它单个服务器怎么做到支持用户最大化的模型,

有了解中游平台的也可以说下
中游是深圳网域做的,应该这也有人了解的,说说吧

zhongqing zhang

unread,
Apr 12, 2006, 7:18:55 AM4/12/06
to dev4s...@googlegroups.com
腾讯的技术属于内部最高机密,!!!!

Donald

unread,
Apr 12, 2006, 8:30:07 AM4/12/06
to dev4s...@googlegroups.com
unix和linux下也有posix的aio啊,跟iocp差不多

2006/4/12, Jacky <szche...@gmail.com>:


--
Donald
My Blog:http://flyingbug.blogjava.net

Jacky

unread,
Apr 12, 2006, 11:04:28 AM4/12/06
to 高性能网络编程邮件列表
unix和linux下也有posix的aio啊,跟iocp差不多

AIO是异步模型了,腾讯是用这种模型来实现的吗,异步模型那ACE
的PROACTOR就比较容易实现了在UNIX下的架构了?是这样的吗

胡人

unread,
Apr 12, 2006, 11:07:17 AM4/12/06
to dev4s...@googlegroups.com
我最早是破解联众游戏的,那个时候中游还刚出生,很少人玩,我还不屑于破解他们的东西呢。后来到自己开发休闲类游戏,才对服务器端有了比较深刻的理解。我公开的数据都是3年前的测试数字,现在当然能支持更多用户,但具体数据属于保密范畴,拿了公司保密费就要遵守啊。
 

szli...@gmail.com

unread,
Apr 12, 2006, 10:59:37 PM4/12/06
to 高性能网络编程邮件列表
QQGAME是基于Linux平台的,看过他们内部的一个平台介绍的PPT,是通过EPOLL实现的,
使用了共享内存技术,辅助线程等技术,单台服务器可容纳30000人的设计容量.

Jacky

unread,
Apr 12, 2006, 11:30:46 PM4/12/06
to 高性能网络编程邮件列表

szli...@gmail.com wrote:
> QQGAME是基于Linux平台的,看过他们内部的一个平台介绍的PPT,是通过EPOLL实现的,
> 使用了共享内存技术,辅助线程等技术,单台服务器可容纳30000人的设计容量.

嗯,这个信息是个方向
如果是使用EPOLL那应该是使用了同步读写的模型没有使用异步模型吧,是这样理解的吗,

Jacky

unread,
Apr 12, 2006, 11:35:01 PM4/12/06
to 高性能网络编程邮件列表
刚刚找到的:

1)单机最高容纳35,000人同时在线,对没有看错是这么多,由于它适用了Linux下高性能的网络处理模型ePoll技术,并且一系列高超的优化技术轻松破万人,当然为了稳定性考虑单机保持了2万人的容量,此时的带宽消耗为近30M;

2)采用共享内存方式高速完成进程间高速通讯;
3)服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构;

4)所有的游戏服务器不是直接和数据库联系,而是和数据proxy(qq管叫数据交换机和路由器)进行联系,由此带来的就是游戏用户数据的分布存储,我分析着应该是proxy上记录着这个用户数据所在的实际的dbserver的信息,然后定时的将最新的用户信息写回到db中去,这样就大大缓解了数据库服务器的压力,而且可以非常平滑的将数据分裂开来,数据库服务器也就可以无限的扩充,当然我觉得肯定有个数据库信息索引了用户的id和对应的存储地点的关联关系,这点就类似于google的原理了,所以对于数据库的硬件要求也就不是那么高了,qqgame的一组服务器通常是7台服务器,可以容纳5万人,其中就包含了数据库服务器,这点就不是棋牌游戏所常使用的数据集中存储了;

5)游戏服务器的网络和逻辑分开,不仅仅是层次上的分开,而是在进程上分开,然后中间通过共享通道进行管理和协调,并且增加了辅助线程,在主线程处理大压力的异步的操作的时候直接交给辅助线程处理,保障了游戏服务器的高效性运转。


大家讨论下呀,看来也不是什么很保密的,
QQGame的系统分析的文档外面也是有流传.

Jacky

unread,
Apr 12, 2006, 11:35:16 PM4/12/06
to 高性能网络编程邮件列表

zhongqing zhang

unread,
Apr 12, 2006, 11:41:25 PM4/12/06
to dev4s...@googlegroups.com
把找到的文档发过来

胡人

unread,
Apr 13, 2006, 12:13:44 AM4/13/06
to dev4s...@googlegroups.com
我看这些说法未必是内部资料,看上去倒象投标的资料一样,说得有些悬,容易蒙人,或者是外部人根据推测写的东西,实际上并不全是这样的。具体说几点:
 
数据proxy(qq管叫数据交换机和路由器),我们内部称为dbservice,内部是由很多表组成的,最常用的表cache在内存,不是很常用的表一部分在内存,一部分在硬盘,主要给其他gameservice提供服务,大多数服务只是查询数据和更新数据,后台定时回写db,这个服务的能力很强,就我们在windows平台上实现的dbservice来说设计可支持超过1000万用户在线(我们是休闲类游戏),所以并不需要很多这种dbservice在运行中,平时只开两个,而且只有一个在服务,一个在值守,以便万一第一个因为各种故障不能服务的情况下提供备份,类似ups功能。实际上我们运行dbservice的服务器还开了几个游戏服务,因为单运行一个dbservice服务资源太浪费了。
 
游戏服务器io和逻辑分开,从设计上肯定是这样的,但从实现上就未必要层次分离,在windows下更不要搞进程分离,那是自找麻烦(对休闲类逻辑简单的游戏而言,对mmoprg可能是必要的)。这就类似osi模型和windows下ip协议栈的实现一样,理论上七层模型,实际上几个层都是做在一起的。就我们的gameservice来说,很多小游戏io和逻辑是做在一起的,io完了连线程都不切就立刻计算,因为计算量很少,所以几乎不阻塞,当然为了避免特殊情况下可能阻塞会把io线程多开几个,虽然多开的线程大多数时候是休眠。我们的gameservice实现中逻辑被切割为几个状态非常明确的job,跟io用同一组线程调度,大多数时候job下达后会被线程池用跟io相同的线程进行调度,并不切换线程,所以效率很高。
 
qq每服务器定义为支持2万人在线估计也是个概数,实际上每个游戏差别很大,有的游戏数据量大计算复杂,跟数据量少计算简单的游戏相比单服务器能支撑的人数要少得多。实际上我们开发的gameservice中最显著的差距超过5倍。
 

Stone Jiang

unread,
Apr 13, 2006, 1:46:02 AM4/13/06
to 高性能网络编程邮件列表
ACE Proactor只能在Windows下有部分支持aio的posix下使用.

Jacky

unread,
Apr 13, 2006, 8:17:36 AM4/13/06
to 高性能网络编程邮件列表
Stone Jiang wrote:
> ACE Proactor只能在Windows下有部分支持aio的posix下使用.?

这是不是个病句呀?


ACE
Proactor能在Windows下和能支持aio的posix下的unix和linux下使用

永恒白天

unread,
Apr 13, 2006, 8:27:37 AM4/13/06
to 高性能网络编程邮件列表
3)服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构

这里的裂变方式是什么意思?
负载均衡阵列树状结构又是什么,谁能解释一下

Stone Jiang

unread,
Apr 13, 2006, 8:32:36 AM4/13/06
to dev4s...@googlegroups.com
sorry,打错一个关键的连词
应该是 ACE Proactor只能在Windows下和部分支持aio的posix下使用.
 
ACE_Proactor需要系统具有异步I/O机制,也就是说,只能在Windows(需要WindowsNT 4.0或更高版本)上使用overlapped I/O,在实现了POSIX.4 Realtime Extension标准的Asynchronous I/O (AIO)选项的平台(包括HP-UX,IRIX,Linux, LynxOS和Solaris)上使用AIO.
 
感谢Jacky发现并指出的错误

yufeng

unread,
Apr 13, 2006, 9:30:27 AM4/13/06
to dev4s...@googlegroups.com
可否发给我一份,谢谢

大宝(sodme)

unread,
Apr 13, 2006, 11:26:01 AM4/13/06
to 高性能网络编程邮件列表
hi, 请注意, 我当时分析的单台两万人,
完全是从同一IP,同一端口上判断出来的,
记得当时分析的游戏是斗地主. 当然,为了稳定起见,
实际运行时承载的数字肯定要比服务可承载最高量要小的.

HuYi

unread,
Apr 13, 2006, 9:06:50 PM4/13/06
to dev4s...@googlegroups.com
AIO到底能不能用于网络?大家谁实际做过?
好像aio只能用于监视普通文件句柄,反之我是从来没有用过。

Jacky

unread,
Apr 17, 2006, 11:00:40 PM4/17/06
to 高性能网络编程邮件列表
AIO到底能不能用于网络?大家谁实际做过?

AIO在SUN下是肯定可以用的,因为我正在移植,大问题没有
,还有些小问题,是用ACE_SUN_Proactor
这个类来实现的,在IBM的AIX下链接出错,可能有什么没有设置队,应该也是可以的.

Jacky

unread,
Apr 17, 2006, 11:07:40 PM4/17/06
to 高性能网络编程邮件列表

这个贴子就没人讨论了?顶上去继续

具体点,假定服务器要保持2W稳定链接的SOCKET句柄
,因为还每隔30秒
或者60秒就需要遍历这些SOCKET看看是否有数据接收,是否活动的,
那遍历这
2W的活动句柄如果在一个线程中遍历那时间就不行了,
有什么好线程模型来管理这2W的活动句柄

Li Jie

unread,
Apr 17, 2006, 11:28:37 PM4/17/06
to dev4s...@googlegroups.com
全部遍历应该不太好吧,可以维护另一个指针数组,收到数据以后把这个指针放到前面去,直接就形成了排序,不活动的就会在后面。只需要从后面往前面遍历很少几个就可以了。

2006/4/18, Jacky <szche...@gmail.com>:

Li Jie

unread,
Apr 17, 2006, 11:31:43 PM4/17/06
to dev4s...@googlegroups.com
在 06-4-18,Li Jie<cpu...@gmail.com> 写道:

> 全部遍历应该不太好吧,可以维护另一个指针数组,收到数据以后把这个指针放到前面去,直接就形成了排序,不活动的就会在后面。只需要从后面往前面遍历很少几个就可以了。

不是编程语言里面的数组,是列表、集合,或类似概念的东西。。。由于插入、删除比较频繁,可能用list比较合适。

Jacky

unread,
Apr 18, 2006, 1:46:48 AM4/18/06
to 高性能网络编程邮件列表

具体点吗?
如果你维护那个指针数组,是不是每个SOCKET句柄收到数据,你都要先查找一翻,把原来的记录给清了,在把刚收数据这个句柄放入数组里,
另外如果SOCKET每次收数据就要维护那个表,代价太大了吧,
SOCKET可能一秒种要收50次数据,那要对那个表维护50次吗,如果我定时遍历一个表,基本我只需要间隔定长时间比如
30秒维护一次.

所以我没觉得你那样有什么优势,是我没有理解你的想法吗?

Li Jie

unread,
Apr 18, 2006, 2:56:59 AM4/18/06
to dev4s...@googlegroups.com
在 06-4-18,Jacky<szche...@gmail.com> 写道:

不需要每次收到都去维护,超过5秒维护一次就够了。如果有句柄到list节点的映射(这个东西总该有的吧?一般都会映射到对象,可以由对象来保存一个list节点指向),移动一个list节点是非常快的,这个每隔5秒做一次维护就是移动节点到头部。

不过好像操作成本更高了,遍历处理2W个连接,找出超时的应该是很快的,不计发送的话,普通PC也能在几毫秒内完成。

Donald

unread,
Apr 18, 2006, 3:59:40 AM4/18/06
to dev4s...@googlegroups.com
select和epoll不就在做这个事情?

2006/4/18, Jacky <szche...@gmail.com>:

papamms

unread,
Apr 18, 2006, 8:47:54 PM4/18/06
to 高性能网络编程邮件列表
是阿

Jacky

unread,
Apr 23, 2006, 11:59:20 PM4/23/06
to 高性能网络编程邮件列表

永恒白天 写道:

> 3)服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构
>
> 这里的裂变方式是什么意思?
> 负载均衡阵列树状结构又是什么,谁能解释一下

照我的理解: 平面扩充
,假定你单台服务器支持2w用户,那你新增加一台服务器,那就扩容为
4w用户了,这时候 2w
-4W的用户都是增加负载在新加的服务器上,也就是说当是3w用户连接的时候,一个服务器是满负载着2w用户,另外一个服务器是
1w用户.


裂变式的扩充方式:与之相对应,当3w用户时候,每个服务器各负载
1.5w用户, 而不是一边2 w一边1w用户.

jlbnet

unread,
Apr 24, 2006, 11:35:52 PM4/24/06
to 高性能网络编程邮件列表
可能意思不一样的吧,他遍历的意思可能是为了查看哪些是不活动的,把不活动的清除,防止太多的死连接占用socket

Jacky

unread,
Apr 25, 2006, 12:29:20 AM4/25/06
to 高性能网络编程邮件列表

jlbnet wrote:
> 可能意思不一样的吧,他遍历的意思可能是为了查看哪些是不活动的,把不活动的清除,防止太多的死连接占用socket

是这样的意思,因为是长连接,所以在客户端我没业务数据发送的时候,会定时(比如15秒)发送一次链路检测包,也就是说服务器每个保存的客户端socket句柄,正常情况下20秒内肯定有一次数据包可读,这样,超过20秒没有数据包的socket句柄,就会清除掉.

有什么好的方法管理?

热血老猫

unread,
Apr 30, 2006, 2:21:48 AM4/30/06
to 高性能网络编程邮件列表
2-3万,能否创建这么多的socket,那可是文件描述符,好像比较稀有。
Reply all
Reply to author
Forward
0 new messages