C++游戏服务器的性能优化(持续更正更新。。。)

大方向

对于服务器性能分析,要从内存分配多线程两个方面入手。

修改内存分配策略不但能降低内存,还能减少碎片,最终势必会提高游戏性能(分配阻塞导致性能低)。

使用多线程,将复杂的逻辑异步到不同的线程去计算,减少了主逻辑的等待,也必然提高了流畅性。

 

针对问题提出的优化策略:

1.内存分配方法

对于已有的内存池策略:

  • 是否可在程序启动时,直接分配固定的内存数(比如3000,可根据在线人数确定)。占用一定内存开销,提高运行时效率。需要数据验证可行性。
  • 每次增长的数(目前32)是否可优化为更大,或者修改为梯形增长方式,或者以每次2倍的速度增长?需要数据验证可行性。

彻底的接管内存分配

  • 使用gperftools的tcmalloc组件彻底接管内存分配。配置很方便,编译时增加一个链接选项即可。(https://my.oschina.net/u/877348/blog/272066)

  初步测试,接入tcmalloc后,内存占用由原来的107448降为67108,提高大约40%,可验证对在线的影响。

2.并行计算

  • 修改完成端口启动的线程数目,提高CPU 使用率,可有效提高网络通信的吞吐量。目前为3,一般设置为CPU数*2。
  • 目前所有玩家的逻辑都在一个线程处理,考虑使用多线程的可行性。

 

以上是在不改变当前单服的状态下,可做出的优化。毕竟单服总有上限,如果以上的优化都不能达到想要的效果,就要拆分服务器了。

  • 增加LoginServer

Gate和Master之间增加LoginServer,或者Gate本身增加LoginServer的功能。

负责:登陆验证、创角、角色列表、删角、 封禁IP过滤等处理,其它逻辑交给Master。

  • 增加LogServer

增加LogServer,监听Master传送的消息,专门负责和logDB的交互。

  • 其它

上述修改完成后,如果在线依然无法满足,可根据统计数据,逐步拆分出GameGate,GMGate,ChatServer,TaskServer,DBServer。

参考 https://blog.csdn.net/cmdos/article/details/63252809

 

 

一些细节

1. 对齐原则。比如64位总线,每次寻址读取8B。编程时注意变量地址,尽量消耗总线最少的寻址次数。堆内存申请时,系统严格按照对齐原则分配,故而使用时候也尽量不要跨寻址边界。

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值