###游戏服务器代码:java
http://git.oschina.net/liyonghelpme/GameServerCsharppython
###游戏服务器优化主要考虑如下几个问题:git
CPU 运算;性能优化
水平扩展能力;服务器
内存使用;网络
网络IO数据流量;工具
硬盘使用;性能
###性能分析优化
任何性能优化以前须要首先对性能进行分析,一般使用Profile 工具,对于C#来说一般Profile 可使用:网站
VS 自带有性能分析工具;也可使用 redgate ant 或者 和resharper 结合紧密的 dottrace;
VS自带性能分析工具能够分析程序运行时候的 CPU使用复杂;
也能够分析程序内存使用较多的部分代码;
对于网络IO须要须要本身定制性能监控工具:
###内存
VS 内存分析工具,能够分析出程序运行时间中总的内存消耗,以及内存消耗热点代码;
对于个人网络游戏服务器程序,主要是生成报文的时候,以及对象状态更新的时候,有大量的内存分配;
优化方案:复用生成的报文,这样就能够只分配一次byte数值,使用内存池来管理这些报文内存;
对于protobuff的序列化,须要消耗大量内存,这里仍然是使用对象池,建立一个能够复用的stream对象,将protobuff 序列化到这个建立的protobuff对象中,我使用的是protobuf-net ,这个库参考java的pb库实现,主要注意这个类 codedoutstream 的内存使用状况。
对于游戏PlayerActor 状态更新时候的大量内存分配,是由于以前采用复制的方式来存储多帧玩家的数据,这里修改成 采用修改更新的方式,而不是复制的方式,更新玩家上一帧数据,这样就能避免内存分配了。
###网络IO
网络须要定制工具统计:
一段时间例如10s,0.5s一次间隔内的网络状态;
包括,每一个间隔中发送的报文数据量,接受的报文数据量;
发送的报文数量,接受的报文数量;
平均发送的报文大小,接受的报文大小;
这里首先在服务器内部统计每一个Agent的接受发送报文数据,能够将这个数据打印到log中, 再服务器内部嵌入一个 http 服务器,这样就能够实时查看一些内部状态了。
接着实现一个python 程序按期查询这个 http服务器,采样状态,接着将采样的状态 以matlibplot 绘制为线图,这样就能直观的查看程序状态了。
同时能够分析log日志,统计每种类型报文每帧的数量,平均大小;这样就能更精细化的监控状态了。
对于程序的监控能够 参考 newrelic 这个网站。
网络流量的计算:
监控平均一个玩家,服务器发送和接受的数据量,根据这个数据量,能够简单乘以玩家的数量,获得总的数据量;
例如一个玩家 2KB/s的网络数据,500玩家就是 500*2KB = 1MB/s的网络数据
固然玩家人数越多数据不必定是线性增长的,能够参考下面论文。
客户端还须要作一个自动脚本,用于开启多个客户端,每一个客户端不断移动和操做,这样能比较好的模拟真实状况。
###参考资料:
http://publications.lib.chalmers.se/records/fulltext/147114.pdf