###游戏服务器代码:
http://git.oschina.net/liyonghelpme/GameServerCsharp
###游戏服务器优化主要考虑以下几个问题:
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