??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产高清精品线久久,伊人久久大香线焦AV综合影院,2021久久国自产拍精品http://www.shnenglu.com/daly88/archive/2012/11/30/195826.htmlDalyDalyFri, 30 Nov 2012 06:14:00 GMThttp://www.shnenglu.com/daly88/archive/2012/11/30/195826.htmlhttp://www.shnenglu.com/daly88/comments/195826.htmlhttp://www.shnenglu.com/daly88/archive/2012/11/30/195826.html#Feedback5http://www.shnenglu.com/daly88/comments/commentRss/195826.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/195826.html   最q整理了q去一q发生过的bugQ包含跟其他目l程序朋友交的例子, 都是大家发生q的真实营运事故?br />   游戏服务器程序,很多bug的原因都是共通的。抽象出了以?0点启C? 作ؓchecklist, 写下来以后写E序review时自Q?br />
1. 安全边界问题
     对于有界限的东西Q数|bufferI间Q队列或一切对象容器)Q一定要考虑界判断?br />     启示Q用snprint, strncpy{限刉?  永远都要考虑过边界的情?/span>
               数值加法和乘法Q考虑上限溢出; 
               减法Q考虑负数; 除法Q判断分?br />
2. 输入参数非法
    case1: 扣钱逻辑Q减M个负敎ͼ变成了加钱? 
    case2: int型大负数相加Q负溢出变成大正?br />    启示Qtest case要全覆盖输入参数范围, 处理各种可能的情?br />
3. 上下文改变错?/strong>
     ׃n变量/全局变量被外部改变,q似乎很常见Q而且有时很隐蔽。在异步回调的情况下更常见?br />
     check A变量 
     call func_B()
     ....
     A变量被func_B改变? 但l信任A变量check的结果?br />
    启示Q白盒复查代码时Q注意检查调用后的变化?/span>
               减少׃n变量和全局变量的?/span>
               外部接口调用后,注意׃n变量的更新和恢复
     启示Q在最接近执行的地方,查上下文变量。不信Q调用者,如果效率不关键,多一遍冗余检查没有坏?br />
4. 执行中断
     动态脚本抛异常Q或者引擎层面的EINTR中断信号Q都有可能中断代码执行,需要考虑函数的重入性问题?br />     启示Q要查一致性,有些逻辑不允许多ơ被执行Q比如发奖励Q,需要有状态变量确保只执行1ơ(避免出刷bugQ?br />     推广到异步环境(多线E,多进E,各种回调Q,事务的中断也有一个重入性问题,解决Ҏ也只有一个:用一个唯一可L认的状态变量,保证某些逻辑不会被多ơ执行(比如购物应用中,用唯一订单h识别Q状态改变是一ơ性的Q当逻辑q行多次Q也不会重复加物品,或者重复扣׃Q?br />
5. l止条g问题--d@?/strong>
     case: 异步环境中,RPCq程调用Q调用成环,逻辑一直不l束?br />     启示Qwhile或递归的终止条Ӟ逻辑全覆盖检查,避免d@环。较深层ơ的互相调用Q要注意是否出现了递归Q是否有可能d@环?br />
6. 兌数据操作的不一?/strong>
     例子QEmployee对象有company变量Q?Company中有employee变量Q?/span>
          如果操作改变其中一方,而另一Ҏ有改变,则造成数据不一致?/span>
      Q数据库表可以指定constrain, 兌表删? 但代码变量中需要程序员自己实现Q?/span>
       双向引用的数据一致性问题,要特别注意?/span>
       Z么要双向引用Qؓ了查找效率,而避免遍历其中一?
       q个问题本质是数据一致性问题,~程中遇到的很多bug也归l到q个问题Q比如野指针Q就是因为数据结构相互引用的操作不一致造成的?br />       处理q个问题Q个人经验是Q他们的attachQdetach操作可能在同一个模块,不要分散在多个地斚w意修改,所有修攚w集中在同一U接口做?br />
       同理适用于new, delete, malloc, freeq些分配Q释放,都集中在同一层的接口/模块文g中做Qdebugh也容易;非常反感在一个地方new, 然后不知道哪个模块去delete, 很容易泄漏或者野指针, 无论如何Q想办法传递这些指针,一直传到分配他所在的模块文g中释放,而且new和delete的接口代码要靠近Q方便查N题?/span>

7. 涉及多玩Ӟ防止W误传错参数
     l典错误Q?foreach(uid in team) some_func(usernum, xxx)   
     l典错误Q有usernum和target两个对象Q调用函数搞混了。review时要仔细?br />
8. Ҏ分支忘了return
     异常判断{if分支忘了return。导致逻辑l箋往下走。这属于W误问题Q测试期间未必能留意的到?br />
9. 异步q回没清变量
    对于异步操作Q如果在q回时清变量Q这时如果不能保证把变量清掉Q比如期间玩家下U无法离U修改该变量Q,׃出刷?/span>
    启示Q对于已奖励标记Q一定要保证各种情况下领奖后能正记录?br />
10. 瞬爆定w上限
     case1:  |络待发送队列,因ؓ瞬间大量hQ塞满抛异常Q导致流E受影响?/span>
     case2:  大量q接hQlisten的accept没有规定单次M件的acceptQ用了while(true), D爆机
                在listen fd的读事g回调? 通常会accept所有新的连接请求,如果用while(true)而不设一个上限,有可能被攻击(惌一下客L也用一个死循环来做connect)?br />                一斚w要限制单ơ接受的socketơ数, 另外各个状态要有超时机Ӟt掉不寻常的q接Q以防被d占尽资源?br />
     case3: 异步情况下,要限制操作者连l频J的操作。(比如在请求入口处增加最时间间隔限Ӟ避免玩家狂点QŞ成雪崩效应)
                Q同时要考虑用户体验Q不要让玩家ȝQ可以做一个提C转,或者等候的动画Q?br />
参考资料:
附上最q看的一文?br /><Writing-reliable-online-game-services> 作者曾是魔兽争霸和星际争霸Qbattle.net的开发者,
里面讲的point也是游戏里经帔R到的可靠性问题?br />
http://www.codeofhonor.com/blog/wp-content/uploads/2012/04/Patrick-Wyatt-Writing-reliable-online-game-services.pdf





Daly 2012-11-30 14:14 发表评论
]]>
|游服务器多q程架构的思?/title><link>http://www.shnenglu.com/daly88/archive/2012/08/05/186363.html</link><dc:creator>Daly</dc:creator><author>Daly</author><pubDate>Sun, 05 Aug 2012 09:01:00 GMT</pubDate><guid>http://www.shnenglu.com/daly88/archive/2012/08/05/186363.html</guid><wfw:comment>http://www.shnenglu.com/daly88/comments/186363.html</wfw:comment><comments>http://www.shnenglu.com/daly88/archive/2012/08/05/186363.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/daly88/comments/commentRss/186363.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daly88/services/trackbacks/186363.html</trackback:ping><description><![CDATA[<span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">    by  Daly<br />    |游服务器程序优化要解决的最主要矛盾无非是在保证流畅游戏体?响应旉在可接受范围)的前提下Q容Ux多的玩家Q当然还要保证开发的便捷性。一个靠qMMOG游戏服务器基本上都是多线E或多进E的架构Q?nbsp;利用多个CPU核把串行处理变成q行处理Q以容纳更大的ƈ发玩家规模?br /></span><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">    然而ƈ行处理程序会使开发的复杂度增加,一不小心很ҎZ些诡异bug。ؓ什么这栯呢?实际环境的大部分E序Q函数的执行l果与状态数据相?外部状态,全局数据)Qƈ且函数执行可能会改变q些状态。如果把处理模块拆成多进E,q程间的q些状态数据的一致性和处理时序Q会影响到结果的正确性。多q程状态数据的理Q读写和同步更新机制Q便是本文要探讨的主要问题?nbsp;</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">       如果函数能变成无状态的(l果只与输入参数相关)Q则分拆成多q程毫无压力。于是业界开始探讨erlangq种函数式编E语aQƈ有已有实际游戏项目(参看:<a >http://www.qingliangcn.com/</a>) 。不q笔者觉得,erlang的无状态,本质上是把状态数据通过函数参数传递,q样意味着频繁而大量的数据复制和传递,是否更适合于MMORPG开发很难说Q本文不予讨论,可见文章末尾参考资料。下面探讨一下状态数据在多进E之间的问题?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">     ZҎ描述Q整个架构如下图</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">                      G</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">    client <--->║ <------> A</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">                     ║ <------> B</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; text-align: -webkit-auto; border-spacing: 0px; font-size: medium; ">     其中G表示接入|关Q负责把client协议分发到内|对应处理进E,A,B是负责不同功能的处理q程Qclient表示客户端,玩家状态数据只有个v和w两个。用reqA,reqB分别表示client对A, B的处理请求,respA, respB表示A,Bq回lclient的处理结果?/span></div><div>     游戏逻辑大部分情况下需要保证状态数据的Z致性,Zq期的数据进行处理会得到错误的结果(分布式数据一致性的工程问题见文末的参考资料)。D个有点蹩脚的例子Q假设client先后发出reqA, reqB两个hQreqA是换武器QreqB是发h击,变量v是攻击输出量QdpsQ。reqB在reqA之后发出Q攻ȝ应是按穿上武器后的dps数值来计算的。但多进E情况下Q却有可能reqB先于reqA处理Q比如Aq程很忙Q,q时reqB的逻辑会基于还没穿上装备时的变量v来计结果。下面分别讨论几U解x据一致性问题的Ҏ?/div><div></div><div><strong>模式一Q共享内?/strong></div><div>     适合于单机多q程或多U程的模式?/div><div>     优点Q数据只有一份,可以保证Z致性?/div><div>     ~点Q进E无法扩展到多台服务器;</div><div>          需要加锁,加锁相当于把处理串行化,q是有可能被某一个较忙的q程卡住。如果精心设计和划分数据Q减锁的粒度可以提高性能Q但l粒度的锁(设计成类似MySQL的行U锁Q,在涉及多个玩家数据的交互逻辑ӞE有不慎又容易导致死锁。随手写一个:</div><div>        假设q程A和B同样执行以下cM的逻辑</div><div>         foreach( user in mapA) {</div><div>              lock(user);</div><div>              lock(user‘s friend);</div><div>              do_something();</div><div>              unlock(user's friend);</div><div>              unlock(user_id);</div><div>         }</div><div>         ׃遍历的是map, q程A和B中的user序有可能交? 假设交叉的两个user互ؓfriendQ就可能死锁了?br />         参考资料[4]采用了这U模式的Ҏ?/div><div></div><div><strong>模式二:状态数据只׃个进E管?/strong></div><div>      把状态数据根据游戏逻辑q行划分Q比如变量v只由Ad, 变量w只由Bd。假如A逻辑需要用到wQ则通过异步hB获取w?/div><div>      优点Q保证强一致性;数据只有一份,无需q程间复制更新?/div><div>      ~点Q异步请求增加了响应旉(嗯,又从q行变成了串?; 异步写v来的代码有点uglyQ到处是callback, 回来要检查上下文Q不然又是诡异bug.</div><div>      适用范围Q如果状态数据能比较好的划分Q即l大多数情况下,某个数据只会在某个进E的逻辑中用刎ͼQ用q种Ҏ比较适合Q因为简单。比如玩家位|只由AOIq程理Q玩家好友由聊天q程理?/div><div></div><div><strong>模式三:多个writer, cMMVCCҎ</strong></div><div>      q是完全的分布式设计。每个进E有自己版本的状态数据,q程间可互相同步更新, 状态数据v分别在A,B都有一份。互相updateӞҎ版本信息q行merge?nbsp;</div><div>      q种Ҏ不能保证Z致性,而且merge时会有可能发生冲H,需要逻辑开发者仲裁这U冲H(比如按时间先后)。不同于互联|应用,游戏需要较强的数据一致性和实时性,q种Ҏ比较复杂且不太可控?/div><div></div><div><strong>模式四:Master-Slave模式</strong></div><div>      q个是对模式二的一个扩展,某个状态数据还是只׃个进E进行写操作Q但其他q程会维持一份cacheq行L作,比如变量vpEA理Qv的更C同步到进EBQ进EB逻辑如果要用到v,直接读自qcache可以了。对于变量v</div><div>     特点Q这U方式也是不能保证强一致性,只能保证最l一致性。作为模式二的补充,有些数据不需要保证更新时序,Ҏq期数据q行处理也可以接?q个是代P需要权衡玩家体验)Q可以采取这U方式。而对于不能接受的Q走模式二。某些需求reqAQreqB虽然先后发出Q如果respAq没反馈回来的话Q即佉K辑上reqB先于reqA处理Q在玩家体验上也是可以接受的。比如reqAI装? 然后reqBdQ但是respAq没q回Q客Lq是看作是没I上装备Q这时候按照老的属性计攻d是可接受的。广域网几百毫秒的gq,reqB要晚于reqA + respAq种概率很小了,如果真的发生Q服务器已经很卡了?<br />    又比如聊天进E,reqAd场景Q然后reqB发聊天消息往当前场景频道Q需要知道当前场景的玩家列表(假设场景玩家列表在AOIq程理)Q如果reqB先到达聊天进E?拿到旧的场景玩家列表, 那么q个q播׃准确了。这U不一致性的代h可以忍受的话没问题(在这个聊天栏例子Q在跛_景的瞬间发错Z也可以忍Q,实际情况Q进E间通信几个毫秒Q发生这U处理时序反转的几率其实非常了?br /></div><div></div><div></div><div>lgQ如果要设计多进E结构,个h比较推崇模式四。这时又引申出几个问题:状态数据如何合理划分?何时更新Q同步给谁?</div><div><strong>如何划分Q?/strong></div><div>     有些功能很好划分。比如聊天进E,状态数据只与好友列表有养Iq个需求可以忍受过期数据,好友关系׃q程修改Q同步到聊天q程。玩家position, 由AOIq程理Q修改同步到主进E,主进E几乎没有需要用到position的逻辑?/div><div>    但有些数据就可能很纠l,比如背包数据。玩家交易,在线奖励Q战斗都需要修改背包物品数据,而且必须保证Z致性,否则可能出C失或物品复制Q该p做这个数据的理者呢Q如果AOIq程理Q物品用效果可以马上生效,但是交易和在U奖׃需要验证背包物品,q些逻辑也放到AOIq程么,如果放,则又牉|出更多的变量Q如果不放,则需要退化成模式2的异步请求。如果放主进E,则用物品后产生的效果不能立d步到AOIq程。可以经q仔l对比,AOI与背包数据交互的频率q高于主q程Q于是背包数据可由AOIq程理?/div><div></div><div><strong>何时更新Q?/strong></div><div>     两种选择Q一有修改立马发送更新给其他q程Q队列buffer住所有更斎ͼ定时送出去(比如?U同步一ơ)Q既然是无法保证Z致性,后者性能Ҏ优化些。比如AOIq程中的位置信息变化很频J,但主q程对位|实时性不敏感Q比如只用于持久化,掉线重上后的位置恢复Q,则更新间隔可以长一些,否则会有频繁而大量的位置数据更新Q定时更C利于同步间隔内数据修改的合ƈQ减同步量?/div><div></div><div><strong>同步l谁Q?/strong></div><div>     某类数据有修ҎQ需要通知哪些q程Q意味着要维持一个映表。可以在~码阶段Q在数据定义旉态写LcL据要通知哪一cd能进E; 也可以在q行期设计成pub-sub模式(或者叫observer模式), 动态增删订阅者。笔者觉得前者可控一点,因ؓq程要用到哪些数据,在编码阶D|可以清楚规划的,Ҏq个原则把数据划分成一个个模块Q比如玩家数据分为基本角色属性,avatar, 位置/朝向, 好友数据....  然后军_归属?/div><div></div><div>    多进E可以提升系lƈ发规模,但同时有各种异步调用和数据一致性问题,带来的代价就是bug的风险增?其团队水^不能保证个个都很高的情况下,一个菜鸟程序员够受了Q还很难跟踪Q,开发难度增大。这个需要仔lprofile和实验确定瓶颈在哪,真的跑满CPU或者卡IO才有必要分出去,惛_然的把模块拆分很多进E,设计看上d优雅也很牛|往往是麻烦的开?——> 开发效率降低,出bug意味着啥?加班Q加班,深夜q维的夺命追call... ...</div><div></div><div>参考资?/div><div>[1] 当webgame邂逅erlang.  明朝|络的庆亮?nbsp;<a >http://www.slideshare.net/qingliangcn/webgameerlang-8241397#btnNext</a></div><div>[2] 陈杰谈网游服务器后端技?  西山居陈杰的ppt, 讲多q程架构下的寻\法 <a >http://timyang.net/architecture/game-backend/</a></div><div>[3] nosql ecosystem. 13节讲q分布式pȝ的数据一致性问?br />[4] l构化数据的׃n内存, 云风 <a >http://blog.codingnow.com/2011/12/dev_note_6.html</a></div><img src ="http://www.shnenglu.com/daly88/aggbug/186363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daly88/" target="_blank">Daly</a> 2012-08-05 17:01 <a href="http://www.shnenglu.com/daly88/archive/2012/08/05/186363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>|络游戏不同cd的技术分c?/title><link>http://www.shnenglu.com/daly88/archive/2012/07/17/183838.html</link><dc:creator>Daly</dc:creator><author>Daly</author><pubDate>Tue, 17 Jul 2012 01:45:00 GMT</pubDate><guid>http://www.shnenglu.com/daly88/archive/2012/07/17/183838.html</guid><wfw:comment>http://www.shnenglu.com/daly88/comments/183838.html</wfw:comment><comments>http://www.shnenglu.com/daly88/archive/2012/07/17/183838.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/daly88/comments/commentRss/183838.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daly88/services/trackbacks/183838.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">    不同的游戏类型需要有不同的技术设计,其服务器端Q没有一个通用游戏引擎可以适应所有类型。所以大部分游戏的服务器端引擎都是根据品需求手工打造,商业引擎通常也得l过别扭的折腾改造才能用得比较好Q比如Bigworld ^_^ )?本文对常见的几种|络游戏的服务端技术做一个技术特点的分类?/span><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">    U束性能和容量规模的因素归纳h是:数据׃n域,消息q播域,q算׃n域。这几个因素涉及的对象数量会直接影响了架构涉及,下面分别来说?br />  </span><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     <strong>分类特征Q?/strong></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     </span><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; color: #0000ff; ">玩家数据总量Q同时在U数</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     q里是指Q玩家登录后Q需要从多大规模的数据中d自己的数据。social game全局׃n的角色数?l一世界)Q随着玩家数量增多U性增长,往往单机储存不能满需求,需要分布式储存技术。而对于传lMMORPGQ由于是分服Q服务器之间是^衡世界,角色数据怺独立Q,相当于天然地用服务器id做了数据分区(而不需要像分布式储存那栯虑分区法的扩展性问题)Q除了登录信息,没有全局数据Q单机储存即可解决问题?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     </span><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; color: #0000ff; ">AOI范围与频?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     q里指的是游戏过E中Q即时广播涉及的对象数量以及消息密度Q比如同屏玩家数。竞技和休闲类游戏通常比较,而传lMMORPG通常较大?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     范围和频率还影响client间传输消息的方式Q通常有两U:client间直?P2P)Q?中心服{发。从延时来看Q广域网游戏q两者区别到不大Q前提是中心服不卡,其实可以看做一个\由器Q。如果广播范?x 频率较大Q中心服的带宽成本很高(嗯嗯Q带宽是很贵的)。如果采用纯P2PQ则需要考虑客户端作弊问题。当然还可以用؜合的ҎQ即中心服监督下的P2PQ比如有些竞技游戏在服务端也做一层校验,查出外挂的可能,当然q个不容易实现得好?大部分情况下Q服务器监督一切,最省心?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     </span><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; color: #0000ff; ">AOI跌{方式</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     是指在不同运共享域和广播域直接切换的方式,分ؓ无缝和蟩转点。D个例子,休闲游戏和竞技游戏通常是玩家主动点击进入或退出房?频道Q不同房?频道分隔了广播域。而即时制MMORPGQ比如WOWQ区域之间是无边界的。这两者区别媄响运性能的扩展性,卛_现多q程处理的技术难度。对于前者可以很Ҏ实现多进E分担处理Q务。后者的无缝AOIQ要实现多进E的话,在边界处需要较复杂的进E数据同步技术?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     </span><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; color: #0000ff; ">实时?同步要求</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     |络延时的前提下Q同步方案主要是用户体验和数据正性之间的权衡。竞技和动作游戏强调打L和位|准性,需要很高的同步要求。很多游戏采用同步ҎQ即一旦对应数据未到Q卡住整个客LQdota的等待连U)。也有采用运动补偿的方式(也称q媄Q,卛_L预判Q当和服务端位置不一致时Q通过加速等方式qxq上。ؓ了减g时带来的影响Q一部分计算攑֜客户端,关键计算{待服务器返回。在{待服务器返回结果的q程中,通常l合术和技术手D?ƺ骗"玩家的视觉(比如h动作Q,辑ֈ较好的体验?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><strong>Social game</strong></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     玩法Q策略经营类Q好友互?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     玩家数量大,h据总量?(量玩家同一交互域)Q同时在UKQ?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     AOI范围中。频率低。消息在好友之间分发Q好友数量一般在一百以内)</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     实时?同步要求Q低Q不需要实时。运较单(看成是v量数据的CURD应用Q?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     技术特点:跟微博,QQ等传统互联|应用比较接q:数据量大QAOI范围中,实时要求低。主要难点在于读写规模大QL据量大,cache热度不明显(无明昄数据Q?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     性能扩展Q依赖于分布式储存和d技术,与一般社交网l技术类伹{由于需要预先加好友Q设定好友数量上限可以限制数据广播的规模?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><strong>休闲牌cL?/strong></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     玩家数量大;h据总量大;但登录后通常q入戉K?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     戉K之间分隔了广播域Q游戏局之间玩家互相独立Q除了聊天频道)。意味着较容易根据房间和游戏分服/q程Q性能扩展Ҏ?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     AOI范围低(一局游戏的几个hQ,实时性一般。运一般(牌法计算Q?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     架构上通常分前端(d和房间逻辑Q和后端Q具体一局游戏Q,分服设计较容易。通常一个前端要对应很多U不同类型的后端逻辑Q各U类型游戏)Q需要制定一个容易开发和接入的框架?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     定w扩展Q由于游戏局的独立性,分进E?分服做运扩展比较简单?通过分区分房间限制了数据q播规模?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><strong>竞技cL?/strong></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     玩法Qdota, FPS, 格斗动作c?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     AOI范围低(10Z下)Q交互频率高</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     实时交互和同步要求极?技术难?</span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     定w扩展Q通常与休闲类一P先进入房?有些叫频道)限制数据q播规模。不同房间互相独立,因此也较Ҏ通过增加q程/服务器分散运规模?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><strong>x制MMORPG</strong></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     通常技能有cooldown, 玩家之间可以I插(没有动态碰撞检?Q同步要求低于动作类和dota|游。单服同时在Uh数有限(1w人左叻IQ逻辑复杂, IO通常单机可搞定。AOI通常是运瓶颈,要提高容量就要分q程或分U程。对于区域间无缝世界Q在边界处的对象Q由于互相可见且可战斗,分管两个区域的进E间需要较复杂的同步机制。比如bigworld用的是对象代理技术,卛_原区域是real对象Q对端区域徏立一个ghost(代理对象), 对real对象的所有状态改变即时同步到对端q程Q反之对ghost操作也同步到real。也是说玩家A在两个进E都有自q副本Q且都可写,需要借鉴分布式技术中Q多Writer的数据一致性设计?br />     对MMORPG来说Q单服h数越高,游戏的社区性和人气感就强, 但h数越多,pҎ卡住服务器。现在都是多核的世界Q基本上都是多线E?q程的架构了Q多writer/reader, 数据同步Q锁q些是常见技术考量炏V一般功能模块交互性不强,分进E?U程隑ֺ不大Q但AOIq块分进E要比较折腾?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; "><br /></span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     题外?/span></div><div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">     q两q公司的校园招聘Q程序员的title是虚拟世界架构师Q汗 -_-!Q。真正的虚拟世界应该是:数据规模大,AOI范围大,实时交互。以上还没有一U游戏同时符合几个特征,都不同程度通过分区/分服/分房?分场?分频道分隔了单个q程的处理规模,单台服务器的数据规模和带宽规模。当Ӟ即技术上可行Q玩家脑子同时能处理的对象数比电脑要差多?呃,试想C人同处一个场景,然后走来走去Q这个有游戏性可aQ)Q这时候瓶颈不在服务器Q超密集的角Ԍ客户端的渲染效率变成瓉?/span></div></div></div><img src ="http://www.shnenglu.com/daly88/aggbug/183838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daly88/" target="_blank">Daly</a> 2012-07-17 09:45 <a href="http://www.shnenglu.com/daly88/archive/2012/07/17/183838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>替代pȝmalloc/new--选择合适的内存跟踪Ҏhttp://www.shnenglu.com/daly88/archive/2012/07/02/181131.htmlDalyDalyMon, 02 Jul 2012 05:01:00 GMThttp://www.shnenglu.com/daly88/archive/2012/07/02/181131.htmlhttp://www.shnenglu.com/daly88/comments/181131.htmlhttp://www.shnenglu.com/daly88/archive/2012/07/02/181131.html#Feedback0http://www.shnenglu.com/daly88/comments/commentRss/181131.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/181131.html 
替代pȝ自带的malloc/new原因无非两个Q?nbsp;
reason 1. 做内存profile或查N?  
reason 2. 自定义的分配Ҏ提高性能

不过文章[1]中说明了Q替代全局new不是一个好做法. 其实要达C上两点目的,W者认为用valgrind工具铑ְ可以了?/span>

解决ҎQ?/strong>
1. 用valgrind和massif
     valgrind的memcheck做内存泄露和bug的查? 里面的massif工具包做内存性能profile, 矣。比自己山寨的一个profiler要好?/span>
     注意Qtcmalloc目前q不能很好支持valgrind,  实测中jemalloc可以

2.  linux下C的程序可以用wrap的方?相当于python的decorator)
     ~译加上选项Qgcc -Wl,-wrap,malloc
     可以做到对mallocq个函数Qlinker会调用__wrap_malloc代替? 若要调用原来的malloc函数__real_malloc
     ~点Q依赖于~译器支持; 对c++的new不v作用 --> 不实?/span>
     启示Q这个方法作为function装饰器,对于调试别的问题倒有帮助。(例如不改变函数的情况下,wrap一层,输出些调试信?
3. 用__malloc_hook
     #include <malloc.h>
     void *(*__malloc_hook)(size_t size, const void *caller);
     ~点Q依赖GNU~译工具?  Ҏd@?惛_用原有mallocQ要参考例子中Q把原__malloc_hook变量保存h使用Qƈ恢复现场)

4. LD_PRELOAD注入.so Q替代原
     环境变量LD_PRELOAD指定E序q行时优先加载的动态连接库Q这个动态链接库中的W号优先U是最高的。标?/span>C的各U函数都是存攑֜libc.so.6的文件中Q在E序q行时自动链接。?/span>LD_PRELOAD后,自己~写?/span>malloc的加载顺序高?/span>glibc中的mallocQ这样就实现了替换。用?/span> LD_PRELOAD=" ./mymalloc.so"
      ~点Q在生环境不现实。因为LD_PRELOAD相当于库注入Q有安全性问题,是必ȝ止的?生环境很多时候用-staticq接)
5. 用宏或另外的函数替代new/malloc
   比如定义一个宏或者指定的函数Q规定所有的分配释放都调用他。这L当于l项目引入了额外的代码规?而且是一立项p遵@q个规则Q否则该Ҏ无效Q,不能很自然的new/delete, 如果分配和释放调用得不一_会生问题的。某产品l就是用宏,然后加上__FILE__, __LINE__之类的信息?br />
 有时候valgrind的效率是个问?其生环境)Q这U方案有其h值所? 是代码看上L较ugly|了

   用宏的例子:
   #define _New(Type, Catergory)                    (Type*)MyMemController::New((new Type), #Type, 1, sizeof(Type),   Catergory, __FILE__, __LINE__, false)
   #define _NewArray(Type, N, Catergory)          (Type*)MyMemController::New((new Type[N]), #Type, N, sizeof(Type)*(N), Catergory, __FILE__, __LINE__, true)

   
MALLOC的替代品Q?/strong>
     自己写一个malloc其实很复杂,要考虑U程安全{各U问题,性能到头来可能更差。google 的tcmalloc,  facebook使用的jemalloc.   多线E下性能较好Q可以考虑使用?br />
     ~点Q笔者尝试过。tcmalloc不能正确用valgrind,只能用自带gperftoolsQ运行中会core)
                 jemalloc可以使用valgrindQ不q还没完全验证是否都准确?/span>
tcmalloc相关:
    ?4位系l上要装libunwind, 对x86-64架构使用q有些问?br />
源码包的INSTALL文档里面也提Cq个问题?br /> CAUTION: if you install libunwind from the url above, be aware that
   you may have trouble if you try to statically link your binary with
   perftools: that is, if you link with 'gcc -static -lgcc_eh ...'.
   This is because both libunwind and libgcc implement the same C++
   exception handling APIs, but they implement them differently on
   some platforms.  This is not likely to be a problem on ia64, but
   may be on x86-64.

主要?4位机frame-pointer的媄? 他的profile工具里的backtrace用libunwindq个库,q个库又有版本问题,各种囧啊....
W者试q系lx86-64, freebsdQ用静态链接。实际用了一下,问题很多很折腾,{他fix了再说吧.

windows下可以参考:

jemalloc暂时未发现有什么兼Ҏ问题,q行得挺好的?/span>
 


Daly 2012-07-02 13:01 发表评论
]]>
Zbinlog的游戏数据储存引?/title><link>http://www.shnenglu.com/daly88/archive/2012/07/01/181023.html</link><dc:creator>Daly</dc:creator><author>Daly</author><pubDate>Sun, 01 Jul 2012 10:05:00 GMT</pubDate><guid>http://www.shnenglu.com/daly88/archive/2012/07/01/181023.html</guid><wfw:comment>http://www.shnenglu.com/daly88/comments/181023.html</wfw:comment><comments>http://www.shnenglu.com/daly88/archive/2012/07/01/181023.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/daly88/comments/commentRss/181023.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/daly88/services/trackbacks/181023.html</trackback:ping><description><![CDATA[    最q组内发表一小论文Q是关于改进游戏储存pȝ的IO性能思\。老大原来早有相同的想法,q且已经实现了大部分模块Q后来和老大一同努力,新的储存引擎l于逐步完善。在外服环境跑了两个多月Q性能和可靠性得C明显的提升。具体的l节׃方便发表了,实践证明Q用binlog来做MMORPG的数据储存是行得通的?br /><br />几个事实Q?br />   1. 盘IO的瓶颈在寻道Q顺序写性能比随机写性能高一个数量?br /><div><p style="text-indent:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">目前典型盘的顺序写入速度大约?/span>60MB/s , <span style="font-family:宋体;Times New Roman";Times New Roman"">而寻道时间在</span>5~8ms (200<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>/<span style="font-family:宋体;Times New Roman";Times New Roman"">U?/span>)<span style="font-family:宋体;Times New Roman";Times New Roman"">。可以看到硬?/span>IO<span style="font-family:宋体;Times New Roman";Times New Roman"">的主要瓶颈在于磁头寻道,也就是随机写。在</span>linux<span style="font-family:宋体;Times New Roman";Times New Roman"">开发服</span>(<span style="font-family: 宋体;Times New Roman";Times New Roman"">非虚拟机Q?/span>Xeon 3.0G 4<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>/16G<span style="font-family:宋体;Times New Roman";Times New Roman"">内存</span>)<span style="font-family:宋体;Times New Roman";Times New Roman"">上做了一?/span>benchmark<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span></p> <p style="text-indent:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">序?/span>50MB: 700ms</p> <p style="text-indent:21.0pt"><span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>5000<span style="font-family:宋体;Times New Roman";Times New Roman"">个文Ӟ每个</span>10KB(<span style="font-family:宋体;Times New Roman";Times New Roman"">?/span>50MB): 12<span style="font-family:宋体;Times New Roman";Times New Roman"">U?br /></span></p> <span style="font-size:10.5pt;font-family: "Times New Roman";">        10000</span><span style="font-size:10.5pt;font-family:宋体;Times New Roman";Times New Roman";Times New Roman";">ơ随机写Q每?/span><span style="font-size: 10.5pt;font-family:"Times New Roman";">1KB(</span><span style="font-size:10.5pt;font-family:宋体;Times New Roman";Times New Roman";Times New Roman";">?/span><span style="font-size:10.5pt;font-family:"Times New Roman";">10MB): 21</span><span style="font-size:10.5pt;font-family:宋体;Times New Roman";Times New Roman";Times New Roman";">U?br />   2. 游戏数据都是K-V数据Q关pL询需求极;k-v数据的update很频J?实测是每玩家?U一ơ修?<br />   3. MMORPG单服的玩家同时在U数量是10KU别, q个数量U可以有效估binlog的规模,使得Ҏ可行?br /></span></div><br />     一般MMORPGpȝ的存盘策? 定时存盘。就是过一D|?比如5分钟Q把在线有修改过的玩家数据,整个snapshot存下去(mysql也好Q文件系l也?。这h两个主要问题Q一C存点QIO随机写暴增,玩家卡机Q如果系ldown机, 数据׃有几分钟的回档。而性能和数据可靠性两则是矛盾的,存盘间隔q小Q玩家卡机,q大Q故障后数据回档旉ѝ需知现在的MMORPGQ贵h器h值都成千上万RMBQ数据可靠性对游戏营运影响q是很大的?br />    so,   可以用定制的binlog来记录玩家数据,也就是说Q不记录整个snapshotQ而是每个k-v变化时记录opcode马上写入binlog文g, binlog的格式根据游戏情况可以高度定Ӟ量减少I间。由于是序写,性能可以非常高。如果down机,可以Ҏbinlog来恢复,基本上没有回档。不q要解决一个问题:binlog增长q大 --> 崩溃恢复旉q程 & binlog文g本n损坏的风险增?& 盘I间用光。因此binlog需要有rotate机制, rotate的时候需要存一ơ在U玩家数据的snapshot, q样旧的binlog可以存到远处或者丢弃。rotate的过E中需要考虑恢复时玩家数据一致性和完备性等{一pdl节问题Q后来一一解决了?br />    q是最q做的成感的事。几q没写blog了,W记都记在evernote里,最q又惛_公开的地方写点东西,发个文纪念一下?br /><br /><br /><img src ="http://www.shnenglu.com/daly88/aggbug/181023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/daly88/" target="_blank">Daly</a> 2012-07-01 18:05 <a href="http://www.shnenglu.com/daly88/archive/2012/07/01/181023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx源码学习(2) ---- 模块化及配置http://www.shnenglu.com/daly88/archive/2010/06/18/118175.htmlDalyDalyFri, 18 Jun 2010 08:15:00 GMThttp://www.shnenglu.com/daly88/archive/2010/06/18/118175.htmlhttp://www.shnenglu.com/daly88/comments/118175.htmlhttp://www.shnenglu.com/daly88/archive/2010/06/18/118175.html#Feedback0http://www.shnenglu.com/daly88/comments/commentRss/118175.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/118175.html阅读全文

Daly 2010-06-18 16:15 发表评论
]]>
山寨版小游戏~~~http://www.shnenglu.com/daly88/archive/2010/06/18/118172.htmlDalyDalyFri, 18 Jun 2010 05:38:00 GMThttp://www.shnenglu.com/daly88/archive/2010/06/18/118172.htmlhttp://www.shnenglu.com/daly88/comments/118172.htmlhttp://www.shnenglu.com/daly88/archive/2010/06/18/118172.html#Feedback1http://www.shnenglu.com/daly88/comments/commentRss/118172.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/118172.html阅读全文

Daly 2010-06-18 13:38 发表评论
]]>
Nginx源码学习(1) ---- 基础数据l构http://www.shnenglu.com/daly88/archive/2010/06/18/118147.htmlDalyDalyFri, 18 Jun 2010 04:27:00 GMThttp://www.shnenglu.com/daly88/archive/2010/06/18/118147.htmlhttp://www.shnenglu.com/daly88/comments/118147.htmlhttp://www.shnenglu.com/daly88/archive/2010/06/18/118147.html#Feedback1http://www.shnenglu.com/daly88/comments/commentRss/118147.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/118147.html阅读全文

Daly 2010-06-18 12:27 发表评论
]]>
高效的Timer实现http://www.shnenglu.com/daly88/archive/2010/05/26/116414.htmlDalyDalyWed, 26 May 2010 12:44:00 GMThttp://www.shnenglu.com/daly88/archive/2010/05/26/116414.htmlhttp://www.shnenglu.com/daly88/comments/116414.htmlhttp://www.shnenglu.com/daly88/archive/2010/05/26/116414.html#Feedback2http://www.shnenglu.com/daly88/comments/commentRss/116414.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/116414.html阅读全文

Daly 2010-05-26 20:44 发表评论
]]>
资源和内存管理学习ȝhttp://www.shnenglu.com/daly88/archive/2010/05/02/114150.htmlDalyDalySat, 01 May 2010 16:02:00 GMThttp://www.shnenglu.com/daly88/archive/2010/05/02/114150.htmlhttp://www.shnenglu.com/daly88/comments/114150.htmlhttp://www.shnenglu.com/daly88/archive/2010/05/02/114150.html#Feedback1http://www.shnenglu.com/daly88/comments/commentRss/114150.htmlhttp://www.shnenglu.com/daly88/services/trackbacks/114150.html阅读全文

Daly 2010-05-02 00:02 发表评论
]]>
˾þþƷ| ھƷþþþþ99| þþþþþþ| þþþ޾Ʒվ| þþžžƷ99Ʒ| 99þۺϾƷ| ҹƷþþþþ˳ | ھƷþþþþ99| þۺ¶þü| Ʒþøһ| þþþֻоƷ| þþһƷ99þþƷ66| þ޹Ʒ| Ʒþ| þۺϺݺۺϾþۺ88| þþþAVվ| 99þù뾫Ʒ| 99þùƷһ| þþƷĻһ| þó˾ƷƵ| AVþüįٸ| ۺϾþҹAV | þþƷҹɫA| þþþѾƷ| þóۺɫۺ| 2021ƷþþƷ| ޾Ʒ˾þþ| þۺ97ɫֱ| þ99ۺϾƷҳ| 91޹˾þþƷַ| 99þó˹Ʒ| þùƷӰԺ| þüۺɫۺϰҲȥ| þպƬ| ŷþþþƷӰԺ| Ʒþ¶| ŷѹۿþ| þúݺݰۺӰԺ| 97Ʒ˾þþô߽97| þ޾ƷAV| 996þùƷ߹ۿ|