以下只是某次项目的一次经历,最终并没有按照这样的方案来优化,但对思路方面确实是一个提高,所以记录在此。

-------------------------------------------------------------------------------------------------------------------

项目D为单机服务器,据说在线达到1500后,会很卡,于是想仔细分析了其中的原因。

整体来说:C++服务器+mysql数据库,多线程。但是是单服。

请教了前同事,在他的一步步询问下,理清了服务器的当前架构。

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

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

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

线程方面:

1 一个socket负责监听所有客户端的session。使用了完成端口的概念,起了3个线程,负责收消息,收到后,将消息放入一个全局的队列revQueue中,这个队列包含所有玩家的所有消息。

2 全局的session管理类,管理所有客户端的session。每个玩家发送消息时,写入自己的发消息队列ownSendQueue中。

3 一个单独的数据库操作队列dbQueue,负责所有对数据库的读取。

4 启动游戏时,开了一个线程,专门负责内部逻辑的刷新。包括各种timer,数据库队列dbQueue的分发,全局收消息队列revQueue的分发(每次轮询到时,会将队列中的所有消息都分发出去),每个session的发消息队列ownSendQueue,其它游戏内的各种update(血量体力等各种恢复)。

内存分配:

1 会频繁使用到标准库的map,vector,string对象。

2 对自定义的类,有内存池的管理策略。当前策略:

  • 每种自定义对象,第一次请求内存时,由内存池多分配32个可保存此类型的地址。
  • 以后每次请求,从预先分配的地址中直接获取。
  • 直到预分配的地址使用完,再重新分配32个,依次循环。
  • 对象销毁时,不真正将对象交还操作系统,而是插入到可用的预分配表中。

 

再来看下服务器当前的配置,在线人比较多的一个区服务器,包括三组服务器:

32G内存+10个CPU,每组在线约300人。cpu使用7%左右,内存使用17%左右。

这一系列的分析出来,问题相对而言就明显了。

内存没有达到有效的使用。

逻辑全在一个线程,应该就是整个瓶颈所在了。

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

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。

-------------------------------------------------------------------------------------------------------------------

再次重复下,以上只是某次项目的一次经历,最终并没有按照这样的方案来优化,但对思路方面确实是一个提高,所以记录在此。

C++游戏服务器的性能优化的更多相关文章

  1. 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑

    一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...

  2. Linux 服务器 常规性能优化设置

    为能使linux服务器能最大化的工作,通常需要对linux的通常设置做适当的更改,而这又往往会依据服务器的类型不同,而有所变化. 对于通常的多连接的服务器其参数设置,可在 /etc/sysctl.co ...

  3. 游戏服务器h2engine架构优化和跨平台设计

    H2engine的GitHub星星不知不觉已经破百了,也没有特意推广过,但是慢慢的关注的人越来越多.因为事情多,好久没有写东西了,前一段时间有了一些想法,把h2engine又更新了一下,感觉h2eng ...

  4. EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)

    -本文由EasyDarwin开源团队成员贡献 一.问题描述 Easydarwin中大量使用gettimeofday来获取系统时间,对系统性能造成了一定的影响.我们来做个测试: While(1) { G ...

  5. 【Unity3D游戏开发】性能优化之spine提高80~90%的效率 (三一)

    Spine效率低 Unity项目加载spine动画,经常会出现卡顿的情况,如游戏中瞬间播放一个动画,打开一个带spine动画的界面.尤其是SkeletonRenderer.Awake时,会瞬间出现大量 ...

  6. 【Unity3D游戏开发】性能优化之缩减打包压缩包大小 (二八)

    unity3d打包的所有文件是会被记录而且被排序的.所以这大大方便了我们分析为何打包文件如此之大,以及怎么减少打包文件. 日志目录一般在:C:\Users\Administrator\AppData\ ...

  7. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  8. 揭秘重度MMORPG手游后台性能优化方案

    本文节选自<2018腾讯移动游戏技术评审标准与实践案例>手册,由腾讯互娱工程师王杰分享<仙剑奇侠传online>项目中游戏后台的优化经验,深度解析寻路算法.视野管理.内存优化. ...

  9. asp.net网站性能优化2则

    摘要:Web服务器的性能优化有很多资料介绍了,多台主机负载均衡,查询结果的多级缓 存,数据库索引优化等都是常见的优化手段.随着后端优化空间越来越小,现在越来越多 的网站更注重前端性能的优化,就是浏览器 ...

随机推荐

  1. --@angularjs-- $location.path('/login')-$location服务用法示例

    $httpProvider interceptor .factory('auth403', ['$rootScope', '$q', '$location', function auth403($ro ...

  2. mysql 使用sqldump来进行数据库还原

    MYSQLdump参数详解 mysqldump备份: 复制代码代码如下: mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –lock-all-tables > ...

  3. 介绍一个开源的在线管理SQLServer的小工具--SQLEntMan

    近来有许多人问起SQL在线管理的问题,遂将以前用过的一个开源SQL 在线管理工具修改了一下,并分享. 看下效果图: 原项目的地址:http://sourceforge.net/projects/asp ...

  4. bootstrap 基本页面元素,代码,列表

    bootstrap 基本页面元素,代码,列表 <!DOCTYPE html> <html> <head> <title></title> & ...

  5. DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构

    http://www.infoq.com/interviews/Technology-Influences-DDD# 要实现DDD(domain drive  design 领域驱动设计)原始意图,必 ...

  6. QML Object Attributes QML对象属性

    QML Object Attributes Every QML object type has a defined set of attributes. Each instance of an obj ...

  7. uml视频系列(二)——uml的概述

    在与uml进行了第一次的接触后,就被uml的博学多才给迷住了,uml居然可以做这么多的东西.才思敏捷的uml是设计软件的好帮手. 你还在为自己的类图不会设计而感到无助吗?你还在为你的对象不好确定而感到 ...

  8. UINavigationController实现全屏滑动返回功能

    说明: UINavigationController默认在push出的控制器中都有边沿滑动返回功能,但是只能从屏幕左边滑才能返回,若从屏幕中间画并没有效果.下面实现全屏滑动功能. 探究: 系统默认能够 ...

  9. 税号输入框 将input框中的输入自动转化成半角大写

    这两天出了这么一个需求,输入税号的时候,需要自动将其转化为半角大写,并且阻止标点符号中文汉字的输入.(下面会有:全半角转换.文本框选中.光标位置判断.设置光标位置 这些内容) 然后我就开始了慢慢查找资 ...

  10. C#用DesignSurface实现一个简单的窗体设计器

    System.ComponentModel.Design.DesignSurface是为设计组件提供一个用户界面,通过它可以实现一个简单的窗体设计器. 在构建之前,我们需要引入System.Desig ...