为什么一些网页游戏服务端架设喜欢用Erlang做服务端

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&实时网页游戏服务器端架构的设计与实现--《华南理工大学》2011年硕士论文
实时网页游戏服务器端架构的设计与实现
【摘要】:本文以《天下盛境》这一商业项目的服务器端架构设计与实现为蓝本,讲述以面向服务架构(SOA)为指导思想,对《天下盛境》的服务器端架构进行设计和实现的过程,探讨此类游戏的实用技术。面对实时性带来的技术挑战,和网页游戏的技术约束,我们研究了底层的I/O模型、CPU复用、进程间通信、远程过程调用(RPC),运维和测试支撑系统。
本项目独创性地将常用于Web项目的SOA思想应用到游戏的服务器端架构的设计中;使用Python编程语言实现了消息总线,屏蔽了服务的地址和协议,将服务器进程之间的耦合巧妙地分离;通过消息总线,游戏的数据库、聊天、外挂检测、登陆、区域、频道、副本和竞技场等子系统相互协作,共同完成业务需求;使用基于协程的高性能I/O模型,在高效的网络收发库gevent之上建立了基于Google Protobuf的RPC协议;使用基于序号的通信实现了防重放、防篡改机制,达到较好的安全通信效果。
通过对一些指标评测,如对RPC调用性能、平均单台物理服务器承载人数等进行评测,结果表明这些指标都达到商用水平。本项目的工作,对于进一步发扬SOA思想,把更多的服务分拆、独立出来,为公司(甚至整个行业)的其它项目所用具有重要意义。
【关键词】:
【学位授予单位】:华南理工大学【学位级别】:硕士【学位授予年份】:2011【分类号】:TP311.52【目录】:
摘要5-6Abstract6-9第一 章 绪论9-15 1.1 研究背景9-10 1.2 国内外研究现状10-12 1.3 本课题的研究内容12-13 1.4 本课题的研究意义13-14 1.5 本文的组织结构14-15第二章 《天下盛境》项目及技术选型15-31 2.1 游戏的市场定位和玩法15-16 2.2 游戏的技术约束和挑战16-17
2.2.1 技术约束16-17
2.2.2 实时性带来的技术挑战17 2.3 服务器端编程语言17-25
2.3.1 Python18-20
2.3.2 Cython20-25
2.3.2.1 直接使用 C 语言编写 Python 扩展模块20-22
2.3.2.2 使用 Cython 编写 Python 扩展模块22-25 2.4 基于协程的高性能 I/O25-31
2.4.1 gevent 介绍28-31第三章 服务器端架构设计31-38 3.1 SOA(面向服务的架构)概述31-32 3.2 基于 SOA 的架构设计32-34 3.3 数据库设计与备份34-38
3.3.1 设计34-36
3.3.2 备份36-38第四章 通信协议实现38-46 4.1 TCP/UDP介绍、选择38-39 4.2 Google Protobuf 介绍39-40 4.3 abu.RPC 介绍40-42 4.4 通信安全42-46
4.4.1 握手协议43-44
4.4.2 基于序号的通信44-46第五章 子系统的实现46-54 5.1 配置服务器46 5.2 聊天服务器46-47 5.3 外挂检测服务器47 5.4 登陆服务器47-48 5.5 频道(主城)服务器、副本服务器和竞技场服务器48-49 5.6 运维支撑系统49-54
5.6.1 基于角色的权限控制49-51
5.6.2 游戏仲裁51-52
5.6.3 数据与图表52-53
5.6.4 操作日志53-54第六章 测试与验收54-60 6.1 获取性能测试数据的方法54-56 6.2 性能测试的4 个方案56-57 6.3 性能测试数据比较57-60
6.3.1 主城同步测试性能(方案1 )57-58
6.3.2 主城同步测试性能(方案2 )58
6.3.3 副本测试性能(方案3 )58-59
6.3.4 竞技场测试性能(方案4 )59-60第七章 结论与展望60-62 7.1 项目实践效果60 7.2 结论60-61 7.3 后续的工作61-62参考文献62-64攻读博士/硕士学位期间取得的研究成果64-65致谢65
欢迎:、、)
支持CAJ、PDF文件格式
【参考文献】
中国期刊全文数据库
冯伟;;[J];福建电脑;2010年07期
吴兆定;袁江海;郑世宝;;[J];计算机工程;2007年15期
徐浙君;俞淑燕;;[J];计算机与现代化;2010年03期
游碧蓉;张晶;;[J];科技情报开发与经济;2008年13期
于志刚;陈强;;[J];山东警察学院学报;2009年01期
罗平;徐倩华;;[J];计算机工程与设计;2007年06期
杨玲;;[J];网络安全技术与应用;2010年04期
蔡莉;陈永波;梁宇;;[J];中国电化教育;2009年12期
中国硕士学位论文全文数据库
侯捷;[D];厦门大学;2009年
【共引文献】
中国期刊全文数据库
李玉安;周世菊;;[J];成都电子机械高等专科学校学报;2009年01期
杨丽;孙芳芳;;[J];长春大学学报;2011年01期
王勇;文敏;;[J];时代教育(教育教学);2011年05期
孟祥增;;[J];电化教育研究;2010年10期
蔡莉;刘芳妤;;[J];电化教育研究;2011年04期
刘江娴;刘江琳;陈苏芳;杨伟涛;;[J];电脑知识与技术;2012年18期
鲍陈;汪千松;;[J];福建电脑;2011年08期
张训;;[J];江苏警官学院学报;2011年05期
唐娟;景莉;;[J];甘肃科技;2011年09期
陈雨婕;;[J];电脑知识与技术;2012年33期
中国博士学位论文全文数据库
邵小平;[D];华东政法大学;2011年
孙兴;[D];云南大学;2010年
贺志军;[D];武汉大学;2009年
中国硕士学位论文全文数据库
张培;[D];吉林大学;2011年
王玉奎;[D];武汉理工大学;2011年
程骢;[D];武汉理工大学;2011年
刘丁瑞;[D];中国政法大学;2011年
李蔚;[D];北京邮电大学;2011年
黄皓祺;[D];华东师范大学;2011年
刘秀峰;[D];山西财经大学;2011年
李丽伟;[D];电子科技大学;2011年
李红瑾;[D];复旦大学;2010年
周小瑜;[D];吉林财经大学;2011年
【二级参考文献】
中国期刊全文数据库
刘守芬,孙晓芳;[J];北京大学学报(哲学社会科学版);2001年03期
薛伟,刘旭东,葛声,林学练;[J];北京航空航天大学学报;2003年10期
袁平华,俞理明;[J];比较教育研究;2005年08期
王陆;孙洪涛;刘敬光;;[J];电化教育研究;2007年01期
刘群艳;张大为;;[J];电脑知识与技术(学术交流);2007年17期
庞云霞;张有林;;[J];山西大同大学学报(社会科学版);2008年01期
肖群;[J];电子知识产权;2003年12期
王迁;;[J];华东政法学院学报;2006年03期
姜奇平;;[J];互联网周刊;2006年40期
尚海忠;;[J];程序员;2005年06期
【相似文献】
中国期刊全文数据库
郑先伟;;[J];中国教育网络;2008年01期
刘继平;;[J];科教新报(教育科研);2010年30期
马建伟,刘江海,张涛,曹哲;[J];自动化仪表;2003年02期
;[J];电脑爱好者;2010年16期
马志辉,黄强;[J];计算机与网络;2004年08期
史创明,韩娇红;[J];安阳师范学院学报;2005年02期
肖化昆,汤力颖;[J];微型机与应用;2005年07期
王震江;何英;吴绍兵;;[J];昆明师范高等专科学校学报;2007年04期
诸葛建伟;;[J];中国教育网络;2009年09期
张瑞强;;[J];电子商务;2010年07期
中国重要会议论文全文数据库
维尼拉·木沙江;吐尔洪·吾司曼;;[A];少数民族青年自然语言处理技术研究与进展——第三届全国少数民族青年自然语言信息处理、第二届全国多语言知识库建设联合学术研讨会论文集[C];2010年
任丽莉;郑颖;何群;;[A];科技创新与节能减排——吉林省第五届科学技术学术年会论文集(上册)[C];2008年
白清源;林锦贤;谢丽聪;;[A];第十七届全国数据库学术会议论文集(技术报告篇)[C];2000年
冯艳卉;洪宇;颜振祥;姚建民;朱巧明;;[A];第六届全国信息检索学术会议论文集[C];2010年
江志纲;丁增喜;刘洋;王大玲;鲍玉斌;于戈;;[A];第十九届全国数据库学术会议论文集(研究报告篇)[C];2002年
孔辉;梁洪亮;辛阳;杨义先;陈林顺;;[A];2010年全国通信安全学术会议论文集[C];2010年
李立宗;高铁杠;陈蓉;陈超;;[A];第六届全国信息获取与处理学术会议论文集(3)[C];2008年
王玉龙;叶新铭;李秀华;;[A];第二十二届中国数据库学术会议论文集(研究报告篇)[C];2005年
朱建国;孙钟德;刘婷;;[A];“推进气象科技创新,提高防灾减灾和应对气候变化能力”——江苏省气象学会第七届学术交流会论文集[C];2011年
刘晖;赵萍;;[A];信息技术在气象领域的开发应用论文集(一)[C];2005年
中国重要报纸全文数据库
浙江省上虞中学 何立峰;[N];中国电脑教育报;2004年
;[N];中国计算机报;2008年
朱毅;[N];政府采购信息报;2006年
美国《Network World》专栏作家James K[N];网络世界;2003年
刘杰;[N];网络世界;2006年
《计算机世界》评测实验室 秦钢;[N];计算机世界;2005年
;[N];网络世界;2000年
韩国良;[N];中国电脑教育报;2003年
陈曦;[N];中国计算机报;2008年
;[N];国际商报;2001年
中国博士学位论文全文数据库
刘雪梅;[D];哈尔滨工程大学;2010年
王芳;[D];中国科学技术大学;2013年
裴科;[D];太原理工大学;2010年
陆雯青;[D];复旦大学;2011年
陈庆涛;[D];成都理工大学;2008年
陈强;[D];华东师范大学;2004年
齐芳;[D];中南大学;2007年
詹骞;[D];中国地质大学(北京);2008年
沈希;[D];北京邮电大学;2012年
付玉;[D];中南大学;2008年
中国硕士学位论文全文数据库
赖勇浩;[D];华南理工大学;2011年
罗永刚;[D];山东大学;2011年
宋乔;[D];大连海事大学;2013年
马鹤楼;[D];华北电力大学(北京);2011年
李蔚;[D];北京邮电大学;2011年
邓俊华;[D];广西大学;2011年
王哲;[D];北京邮电大学;2012年
李贞;[D];电子科技大学;2011年
薛鹏;[D];北京交通大学;2012年
杨艳;[D];天津大学;2010年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 知识超市公司
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号为什么一些网页游戏喜欢用Erlang做服务端_百度知道
为什么一些网页游戏喜欢用Erlang做服务端
我有更好的答案
纵使出错也没关系只要不是什么大的数据结构或者跟数据库有关的错咱可以热更新嘛。做网页游戏团队大部分都不稳定,人才流动很大。 还有就是历史原因吧,erlang起码业务逻辑学起来很简单。游戏公司大都急功近利,学一个月就可以跟着项目走,巴不得你进来就给我贡献输出你好,很高兴为你解答
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁游戏服务器架构调研报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
游戏服务器架构调研报告
上传于||文档简介
&&该&#8203;文&#8203;档&#8203;对&#8203;现&#8203;有&#8203;的&#8203;开&#8203;源&#8203;游&#8203;戏&#8203;服&#8203;务&#8203;器&#8203;架&#8203;构&#8203;,&#8203;如&#8203;s&#8203;k&#8203;y&#8203;n&#8203;e&#8203;t&#8203;,&#8203; &#8203;k&#8203;b&#8203;e&#8203;,&#8203;一&#8203;级&#8203;采&#8203;用&#8203;的&#8203;服&#8203;务&#8203;器&#8203;架&#8203;构&#8203;,&#8203;语&#8203;言&#8203;等&#8203;做&#8203;了&#8203;简&#8203;单&#8203;调&#8203;研
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
你可能喜欢当前访客身份:游客 [
相信命运,just do it
:Ctrl + u用起来不错
:貌似可以应付面试啦!
:引用来自“九劫散仙”的评论用的啥IDE编辑器楼主...
:用的啥IDE编辑器楼主
:引用来自“zzuse”的评论谢谢大神,知道slice c...
:谢谢大神,知道slice cheap 了,汇编看不懂,找些...
:引用来自“湖心亭看雪”的评论啥是大小端? 计算...
:啥是大小端?
:引用来自“golang_yh”的评论golang里面http的p...
:引用来自“golang_yh”的评论golang里面http的p...
今日访问:40
昨日访问:95
本周访问:477
本月访问:1847
所有访问:14647
Erlang高并发服务器优化
发表于4个月前( 00:33)&&
阅读(276)&|&评论()
0人收藏此文章,
whatapp Erlang
从WhatsApp软件架构师Rick Reed在3月份即将发表的演讲介绍中(That’s ‘Billion’ with a ‘B’: Scaling to the next level at WhatsApp),我们可以得知WhatsApp当下的一些轮廓:
现在,WhatsApp有数百个节点、数千个核心及数百TB的内存,我们的目标是服务全世界数十亿用户。在WhatsApp,我们使用了Erlang/基于FreeBSD服务器基础设施,为了应对消息的增长需求,我们必须克服一个又一个挑战,可以说在系统容量(大于8000核心)和速度(每秒Erlang消息超7000万)上的极限挑战从未停歇!
鉴于这个演讲在3月份才发布,这里我们不妨聚焦Rick Reed两年前的分享—— WhatsApp如何应对数百万的同时链接数。
在Yahoo!供职时,Rick Reed曾负责用C++建立高性能的消息总线,因此他对高扩展性架构并不陌生。WhatsApp创始人中还包括了一个拥有大量扩展经验的Yahoo!工程师,不难得知,WhatsApp有现在的成就与两个创始人的超凡技术是分不开的。而企图成为全世界50亿手机服务商的远大目标,他们也必须将技术推向极限!
190亿美元的交易的背后
做为一个程序员,如果你问WhatsApp是否值那么多,我的答案必然是否定的!因为产品真正价值不在于那些死板的代码,而在如何让用户喜欢并且使用。
着眼这个应用的特点,我们知道WhatsApp是一个世界级的 零噱头(零广告,零创意,零游戏)产品,在SMS收费时代提供了一个免费的信息交互平台。当下,这个应用已被数量巨大的美国人使用,因此一旦有用户加入,即会在上面发现大量的亲朋好友。在手机如此普及年代,WhatsApp绝对称得上填补了美国社交网络上的空白。鉴于其跨平台特性,所以每个人都可以使用它;值得关注的是,它还可以传递各种格式信息,比如共享地理位置、发送语音及视频等。WhatsApp有着非常出色的国际化,使用手机号码作为验证信息、联系人列表作为社交图,因此你不需要邮箱验证、用户名及密码,更不需要提供信用卡等号码信息——“it just works”。
虽然WhatsApp有着如此的诱人特性,但是它仍然不值190亿美元,而且对于互联网巨头来说,这样的特性模仿起来也并不复杂。
WhatsApp之所以能卖190亿美元可能有多个原因: 第1, 如Google CEO Larry Page所说;第2, WhatsApp已经威胁到Facebook;第3,Facebook正在褪色,需要补充大量新鲜血液;第4, WhatsApp是你的电话簿;第5,WhatsApp可以收集到大量的元数据(虽然他们并未保存)。
准确的说,190亿美元收购WhatsApp是为了它的 4.5亿用户,为了它的日百万用户增加,为了它可能会有10亿用户的潜能——Facebook需要WhatsApp成为下一个10亿用户应用,当然只能成为它的一部分。同时,40美元一个用户的价格也并不离谱,特别是以股票充当大部分金额。Facebook曾今使用 30美元每用户的价格收购了Instagram,而 Twitter的每个用户更值110美元。
Benedict Evans 做了一个非常棒的预测,移动是一个万亿级的市场。WhatsApp通过每天发送180亿SMS消息(整个SMS系统每天发送的消息也只有200亿条)搅乱了整个SMS市场,而这个市场有着超过1亿美元的税收。在智能手机采用越发普及的年代,WhasApp有着比Facebook更清晰的盈利思路。然而,在承诺了零广告和零干涉后,Facebook又会从何处得益?
在 移动应用业务开发上有着许多有趣的用例, WhatsApp则经常被项目团队用来建立会话组,风投们也乐于将它作为交易流程中的对话工具。
Instagram被Kuwait用来出售绵羊。
WeChat,WhatsApp的一个竞争者,在1月份推出了一个叫车服务;值得关注的是,仅仅一个月,这个应用上的 打车成交量就达到了2100万。
商业活动看起来确实很适合WhatsApp,但是它的用途显然还有更多——西班牙警察使用它来抓捕罪犯,意大利人们使用它来组织篮球比赛。
鉴于每个人都有手机而且消息应用已变得更加强大、自由及便宜,商业及其它类型应用程序已逐步向移动端过渡。许多功能已不再只能用桌面或Web应用程序实现,消息应用已初露锋芒。
其中,许多应用已经对Facebook和Google产生威胁,桌面和网络皆将成为过去, 消息+移动将让整个系统愈加偏离这些巨头的王国,那么在这股移动的大潮中Facebook又该何去何从?
随着移动化的更加深入,Facebook的地位已愈发岌岌可危,用户的流逝显然已不可避免。桌面Web是Facebook后端所有特性的入口,它非常的肥胖、复杂及陈旧,当下已经很少有人会喜欢Facebook的UI。
在Facebook确定了“Mobile first”这个移动方案后,更深度的打磨被执行——不仅建立不同用途的应用,同时也提供了多个具有类似功能和相互竞争的应用,这些应用有时甚至不会共享相同的后台基础设施,比如:Messenger和WhatsApp,Instagram和Facebook图片应用。Paper也是Facebook一个限制功能候补入口,但是它表现得非常好。
在Mobile World Congress上,Facebook CEO Mark Zuckerberg发表了自己的看法, 他认为收购WhatsApp与Internet.org的愿景紧密相连:
这个思想就是建立一组基础互联网的免费服务——“互联网的911”,这可能是类似Facebook这样的社交网络服务、消息服务以及搜索服务等。将这些服务提供给那些支付得起却没有支付意识的用户,引诱其上瘾,让他们知道自己的重要性,从而更愿意使用更多的收费服务。
这是个长久的目标,这个舞台里有足够多的利益去追逐,然而即时回报率却非常的低, Facebook正在这条道路上前行着
抛开这次交易不谈,WhatsApp究竟是如何用32个工程师来支撑4.5亿的活跃用户,下面一起探索……
服务4.5亿用户的高可靠架构
需要注意的是, WhatsApp的整体架构并未公开,这里仅仅是从不同信息源中获取不同的片段。Rick Reed的讲座主要分享了使用Erlang实现单服务器200万连接数,虽然很有价值,但是并不是整个应用架构。
Rick Reed: 扩展到数百万并发连接数(2012, PPT)Rick Reed: Erlang Factory(访谈)Eugene Fooksman: WhatsApp的Erlang使用(访谈)DLD14: 关于WhatsApp(Jan Koum和David Rowan)Yowsup以前是WhatsApp的一个开源API,但是由于 弃用了DMCA当下已不可用,但是同样可以说明WhatsApp的一些内部工作机制。
相关文章中列出的一些信息。
这些统计是当下系统的一些数据,更多针对数据存储、消息、meta-clustering以及新加入的BEAM/OTP补丁。
4.5亿的活跃用户,并且是史上最快达到这个数字的公司
32个工程师,平均每人支撑1400万活跃用户(这个很牛逼~~~~)
每天收发跨7个平台的500亿消息
平均每天注册用户过百万
数百个节点
数百TB内存
每秒Erlang消息超过7000万
在2011年,WhatsApp单服务器取得 100万个tcp会话,同时还有内存和CPU剩余。在2012年, tcp会话发展到了200万。2013年WhatsApp 发表tweet声明,70亿消息入站,110亿消息出战,即每天处理180亿消息,伟大的2013!
Yaws、lighttpd
BEAM定制补丁(BEAM类似于Java的JVM,但适用于Erlang)
7个客户端平台:iPhone、Android、Blackberry、Nokia Symbian 360、Nokia S40、Windows Phone和一个未知的
标准的面向用户服务器:
Dual Westmere Hex-core(24个逻辑CPU)
100 GB RAM、SSD
Dual NIC(公共面向用户的网络、私有的后端 /分布)
聚焦消息传递。连接来自世界各地的用户,忽视他们的地理位置,无需支付高额费用,创始人Jan Koum还经常提起1992年在世界各地与家里人联系是多么的难。
隐私。由Jan Koum制定,消息不会在服务器上储存,聊天记录也不会储存,目的就是不去了解用户隐私。不会保存用户姓名及性别,聊天记录只存储在电话上。
1.WhatsApp服务器基本上完全使用Erlang实现
做后端消息路由的服务器系统使用Erlang实现
值得炫耀的是,如此庞大数量的活跃用户只使用非常少的服务器来管理,团队一致认为这很大程度上归功于Erlang。
值得注意的是,Facebook Chat就是在2009年使用Erlang开发,他们弃用Erlang的原因是难以招聘到优秀的程序员。
2.WhatsApp服务器最早从Ejabberd开始
Ejabberd是个非常出名的开源Jabber服务器,使用Erlang实现。
最初选用它的原因是开放、广受开发者关注、易于开始以及Erlang在大型通信系统上的长期口碑。
接下来的许多年一直从事Ejabberd的重写和修改,包括从XMPP转换到内部开发协议、调整代码库以及重设计一些核心组件,对Erlang VM做了大量的修改以获得高性能。
3.为了应对每天500亿消息,工作重心被放到可靠系统的打造上,货币化对于我们来说还是件遥远的事情。
4.系统的健康状况主要看队列的长度,每个节点上消息队列的长度都会被一直监控,超过预先设置的临界值则会发出提醒,多个警报发生则标志着系统进入了下一个瓶颈。
5.通过上传图片、音频、视频到一个HTTP服务器上来发送多媒体消息,然后将链接与Base64编码的缩略图一起添加到内容(如果可用)。
6.有些代码基本上每天都在变化,通常情况下是一天几次;当然,峰值期间必须避开的。Erlang非常适用于将修改或者是新功能添加到产品,热加载意味着无需重新启动就可以实现修改,错误可以很快的得到解决,同样通过热加载,系统变得更加松耦合,这可以让更新快速的发布。
7.WhatsApp使用了什么样的协议?WhatsApp服务器池使用了SSL Socket,在客户端重新连接对消息进行检索之前,所有消息都会在服务器上排队。消息的成功检索会发回给WhatsApp服务器,它将会被重新转发给原始发送者;一旦客户端成功接收这条消息,它就会在服务器存储中擦除。
8.WhatsApp注册程序的内部工作机制是什么样的?WhasApp依赖电话IMEI号码来建立用户名/密码,这点在最近已经修改。WhatsApp现在会让应用发送一个包含5位数Pin的一般请求,然后给这个电话号码发送一个SMS,这意味着WhatsApp客户端不再受限于某台手机。基于Pin的号码,应用会从WhatsApp请求一个唯一的键,这个键将作为未来的使用密码,这同样意味着在新的设备上注册后会无效原有设备上的键。
9.在Android上使用了Google的推送服务。
10.在Android上有更多的客户。与Android打交道更让大家愉快,开发者能够快速的基于一个特性构建原型,并以最短的时间推出,如果存在问题的话也可以快速修复,iOS则不行。
六、单服务器上200万连接数的探索
虽然用户增长是喜闻乐见的,但是它同样意味着你得投入更多钱去购买硬件;同时,机器数量的增加也大幅增加了管理和运维复杂性。
需要为流量的起伏做规划,例子就是西班牙的足球比赛和墨西哥的地震。这些现实世界中发生的大事件造成了非常高的流量峰值,因此需要有足够的剩余容量来应对流量高峰+突发事件,比如一场近期的足球比赛产生了当天35%的出站消息。
初始的服务器负载是每个服务器20万并发连接。
预期将会添加大量的服务器来维持用户增加。
服务器会因为负载的爆发而宕机,网络及其它的故障也会发生。这时候需要做一些组件的解耦,这样一来可以添加容量以应对峰值。
目标是单服务器支撑百万连接数,这个目标在只有20万连接数时已经制定。动态的容量规划以应对世界级事件、硬件故障及其它类型的小故障,系统需要足够的弹性去应对高使用率和故障。
七、用来增强可扩展性的工具和技术
编写系统活动报告工具(wsar):
记录整个系统状态,包括OS状态、硬件状态、BEAM状态。这是为了便于从其他系统获取状态信息,如虚拟内存。跟踪记录CPU利用率、系统整体利用率、用户时间、系统时间、中断时间、上下文切换、系统调用、traps、数据包发送和接收、所有进程队列中总消息数、繁忙的端口事件、通信速率、字节输入/输出、调度状态,垃圾回收状态等。(这些监控数据很重要,定时监控这些数据~~~)最初一分钟运行一次,当系统运行变得困难时,时间段将降为1秒钟一次,因为一分钟无法运行的情况很少发生。了解所有系统运行情况需要非常细粒度的统计数据。
CPU(pmcstat)中的硬件性能计数器:
通过查看CPU时间占用百分比,可以了解正在执行的模拟器(emulator)周期时间。假如是16%,说明只有16%的时间执行模拟代码,所以即使你能消除所有Erlang代码的执行时间,也只能节省总运行时间16%,这意味着你应该将重点放在其他方面以提高系统的效率。
dtrace、 内核锁计数、fprof
1.Dtrace是主要用于调试,而不是提高性能。2.在FreeBSD上给BEAM打补丁加入CPU时间戳。3.写脚本创建所有进程的聚合视图,查看哪些程序一直在占用系统资源。4.最大的胜利是给模拟器启用锁计数。
一些问题:
早期发现很多时间花在了垃圾回收程序上,这个问题已经被解决了。发现一些网络堆栈的问题,后来堆栈被调走了。大多数问题是关于模拟器的锁冲突,主要体现在锁计数的输出上。
综合的工作负载,这意味着从你自己的测试脚本中生成流量,这对极限规模下面向用户系统调优没有价值。
对于用户表这样简单的接口效果不错,生成接入然后尽可能快地读取。
假如在一台服务器只支持100万连接,那么整个系统将需要30台这样的主机去打开足够的IP端口,生成足够多的连接;然而,这么多的开销仅仅可以测试一台服务器。对于测试200万个连接的服务器需要用到60个主机,生成这样的规模真的很难。
很难生成生产环境下的那种流量。在正常的工作量下还可以估算,但在现实中看到的那些网络事件、世界事件,这主要因为多平台上客户端的不同用户行为,而且不同国家之间也有差异。
Tee’d 工作负载
采用正常生产环境流量,然后把它放到一个单独的系统中。
这对系统非常有用,因为产生的副作用会受到限制。不想看到网络拥堵,或者对用户造成影响。
Erlang支持热加载,所以可以在完整生产负荷下产生想法、编译,在程序运行时加载变化,而且能即时看到变化的好坏。
添加旋钮动态调节生产加载,观察它对性能的影响。观察特征输出,比如CPU使用率、VM 使用率、监听队列溢出并调节旋钮,看看系统会有怎样的反应。
真正的生产负载
最终测试。输入工作和输出工作都要测试。
多次将服务器放入DNS中,使其得到正常情况两倍或三倍的流量。TTL事务会产生问题,因为客户端不会遵守DNS TTL,而且这里还会有延迟,因此无法快速做出反应以获得更多可以被处理的流量。
IPFW. 将一台服务器的流量转移给另一台,这样可以使主机的连接数达到理想的水平。内核如果因为有个Bug就奔溃是不行的。
开始时每个服务器有20万个并发连接。
第一个瓶颈出现每台服务器42.5万个连接的时候。系统遇到了很多冲突,工作停止了。安装调度器检测有多少有用的任务被停止、睡眠,或回转了。在加载时,它开始遇到睡眠锁,整个系统只用35-45%的CPU利用率,但调度程序的CPU利用率却达到了95%。
第一轮修复使连接数超过100万个。
VM利用率为76%,CPU利用率为73%,BEAM模拟器利用率为45%,与用户百分比很吻合,这是件好事,因为模拟器得和用户一样。
通常CPU利用率并不是好的评估方法,因为可能由于调度程序使用CPU导致系统看起来很忙。
一个月以后解决了瓶颈,每个服务器连接数达到200万个。
BEAM利用率为80%,与FreeBSD开始分页的情况接近。CPU利用率大致相同,有两倍的连接数。调度程序遇到了冲突,但运行得很好。
看来测试可以暂停了,这时开始分析Erlang代码。
最初每个连接有两个Erlang进程,消减为一个。
用计时器完成一些工作。
在每个服务器有280万连接时达到顶峰
571k pkts/sec, &200k dist msgs/sec
做一些内存优化,VM加载下降到70%。
尝试过将连接数增加到300万,但没有成功。
当系统遇到故障时,查看长消息队列(单个消息队列或消息队列总和)。
将每个进程的消息队列统计添加到BEAM设备上。包括发送/接收了多少条消息以及发送/接收的速度。
每10秒取样一次,可以看到一个进程有60万条消息,每15秒延迟出列4万条消息。预计完全出列时间是41秒。
一些发现:
Erlang + BEAM + 它们的补丁——可以具有接近线性的SMP可扩展性。在24路服务器上运行系统,CPU利用率达到85%,持续运行负载——它可以像这样运行一整天。
Erlang程序模型的证明。
服务器使用的时间越长,其积累长时间运行连接就越多,但不是每个连接都很忙碌,其中大多数是闲置的,所以服务器使用时间越长能够处理的连接数也就越多。
*冲突是最大的问题。
Erlang代码中的一些修复可以减少BEAM的冲突问题。
向BEAM添加一些补丁。
分区负载工作不需要频繁跨处理器运行。
Time-of-day锁。每次从一个端口发送消息都会针对所有调度程序产生一个Time-of-day锁,这意味着所有的CPU都* 会遇到同一个锁。
优化计数器的使用,移除bif计数器
发现IO时间表算术增长。创建VM抖动使哈希表在不同的时间点重新分配,改进使用几何分配表。
通过你已经打开的端口添加写入文件,以减少端口冲突。
Mseg分配是所有分配器冲突的交点,因此创建好每一个调度程序。获得一个连接时会有很多端口事务,设置选项降低昂贵的端口交互。
当消息队列积压太多的话,垃圾回收会破坏系统稳定性。所以暂停 GC,直到队列收缩。
*避免一些不必要的麻烦。
从FreeBSD 9移植一个TSE计时器到FreeBSD 8。读取计时器开销更小,快速时间,比读取芯片还要便宜。
从FreeBSD 9移植igp网络驱动程序,因为多个队列会因为NIC锁定出问题。
增加文件和套接字的数目。
Pmcstat显示很多时间被用来在网络堆栈中查找PCB,所以扩大哈希表让查询更快些。
之前提到过的设备补丁。植入设备调度程序用来获取使用信息、信息队列统计信息、sleep数、发送率、消息数等。可以在Erlang代码中使用procinfo(任务管理)实现,但有100万的连接时,这一过程会变得非常慢。
统计数据收集非常高效,所以它们可以在生产中运行。
统计数据保持3个不同衰变间隔:1秒、10秒和100秒。允许随时观测发生的问题。
让锁计数为更大的异步线程计数工作。
为调试锁计数器添加调试选项。
设置低调度程序的唤醒值,因为调度程序一旦进入睡眠就再也无法唤醒。
mseg分配器优于malloc。
每个调度程序每个实例都有个分配器。
配置大的carrier,而且还会越来越大。导致FreeBSD使用超级页,降低 TLB thrash比率,并为相同的CPU提高了吞吐量。
以实时优先级运行BEAM,这样其他的东西比如cron作业就不会打断调度程序。防止小故障导致重要用户通信的阻塞。
打补丁下调spin数,从而使调度程序不会spin。
相比erlang:now,更喜欢os:timestamp。
不使用事务,用远程的备份,并行复制每个表以提高吞吐量。
事实上还对许多地方进行了修改。
八、经验总结
优化是件非常艰辛的事情,也只有工程师去做。Rick在回顾大量的修改后(使每个服务器连接数达到200),更觉得头皮发麻。大量的工作包括编写工具、运行测试、增加补丁、把让人眼花缭乱的方法添加到堆栈的每一层、调试系统、寻找蛛丝马迹,每一个细节都不能放过,你需要努力让一切都在掌握之中。只有这样才能消除瓶颈,提高性能以及最大程度地实现可扩展性。
获取你需要的数据;编写工具;为工具添加补丁;添加调控旋钮。扩展系统获取更多数据是Ken不懈的追求,为了获取他们需要的数据,需要不停地编写工具、脚本来管理和优化系统。为了数据,不惜一切代价。
度量;消除瓶颈;测试;不断重复这样的过程。枯燥无聊,但你需要这样做。
Erlang很给力!Erlang继续证明其作为一个多用途、可靠、高性能平台的优良品质。虽然Erlang也需要大量的调整和修补,这些工作难免会让人对Erlang产生质疑。
破解病毒式代码,获得利润。“病毒式”现在是优良品质的代名词,就像WhatsApp那样,只要你真得做到了,那意味着你得到了很多很多钱。
价值和员工数现在已经没有直接联系了。如今,员工的数量并不能说明什么。先进的世界级电信基础设施使WhatsApp这样的应用程序成为可能。如果WhatsApp还需要做网络或手机等设备,那可能根本就不会有WhatsApp这样的公司存在。功能强大、价格廉价的硬件和开源的软件也无疑使WhatsApp的成功事半功倍。换句话说WhatsApp的成功在于它在正确的地点、时间为正确的用户提供了正确的产品。
能够重视用户想法是很了不起的。WhatsApp 将自身定位成一个简单的消息传递应用,而不是游戏网络、广告网络或者已经面临消亡的照片网络,这一点很重要。这样的定位使他们没有在应用中添加广告,他们努力保持应用简单的同时添加新功能,傻瓜型操作方式使WhatsApp适用于每一个用户。
考虑到简单性,有一些限制是允许的。你的身份被绑定到电话号码,所以如果你更改了电话号码你的身份就失效了。这和一般的应用程序确实有点不太一样,但却使整个系统在设计上变得更加简单了。
年龄上的歧视。2009年,因为年龄歧视,WhatsApp创始人Brian Acton在Twitter和Facebook连一份工作都找不到,那就让它们后悔去吧。
先从简单的开始然后再深度定制。聊天刚推出时,服务器端基于jabberd,现在它已经被完全重写,但那个确实是Erlang方向上的第一步。Erlang初次使用时就体现出的可扩展性、可靠性和可操作性,这使得到了越来越广泛的应用。
保持低的服务器数量。努力让服务器尽可能的少,同时为短暂高峰期预留足够的上升空间。分析并优化直到达到收益递减点,然后再部署更多的硬件。
有目的地增加冗余服务器。这可以确保在公司放假时也能为用户提供不间断的服务,员工可以享受假期而不用花时间修复过载问题。
赚钱时也要考虑公司的成长。WhatsApp免费时成长是最快的,早期每天都有1万次的下载量。然后转向付费时,下载量下降至每天1000次。在年底增加了图片消息后,他们就把按下载次数付费改成了按年收费。
灵感总来自最意想不到的地方。忘记Skype用户名和密码的经历无疑给WhatsApp带来了灵感
总结 :Whatapp高并发实践涉及 Erlang应用层,Erlang虚拟机层,操作系统网络栈等等优化,从优化过程来看,他们对Erlang虚拟机源码理解非常深刻,比如Erlang内存分配的(mseg分配器),一些BIF等
提示:想做高并发的服务端Server就要注意CPU利用率,网络速率,如果是用Erlang还要查看相应VM资源使用情况,防止透支
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读}

我要回帖

更多关于 网页文字游戏服务端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信