90. 2023-12-10周总结

  1. 内存排查
  2. 批量写入Mongo
  3. 前后端公用数据层代码
  4. 统一选服服务器

1. 内存排查

我们新上线的C#游戏服务器内存出现报警,DAU也就1百来人,按照道理不应该出现出现这个问题。猜测是某个地方缓存了大量数据导致。之前没有C#内存排查经验,通过这次经历记录下排查过程,整个过程按照官方的教程还算比较顺利的。

  1. 首先按照下面命令dump内存

    1
    /root/.dotnet/dotnet dotnet-dump collect -p 4807

    因为我们是CentOS8(不维护了),没法直接通过命令安装dotnet core,整个dotnet core是自己安装的,所以运行dotnet-dump的时候会报找不到dotnet环境,通过命令export DOTNET_ROOT=/root/.dotnet到安装目录这个问题就能解决

  2. 按照下面命令进入内存分析界面

    1
    /root/.dotnet/tools/dotnet-dump analyze core_20231205_093305
  3. 调用dumpheap -stat 查看整体情况

可以看到有个二进制数组占用了1G多内存,这是不太合理的。

  1. 进一步通过命令dumpheap -mt 7fdab7ae9638分析

  2. 然后选取某些地址通过命令gcroot 7fda8ff2cd48查看堆栈,发现都是一样的堆栈

根据堆栈定位到了问题,我们联赛每场比赛的战斗会生成一个战报,这里把联赛的战报缓存起来了,整个战报还是比较占内存的,所以导致内存约占越多,修改战报不用的时候给释放掉,整个问题修复了。

2. 批量写入Mongo

上周出现的Mongo报错,这周通过之前制定的思路写完了,目前跑下来应该没问题,后续上线之后再看看。

3. 前后端公用数据层代码

在写这个新项目的时候,经常遇到的情况是前后端的数据层数据结构以及提供的部分代码都差不多的,导致两边都要写一遍。之前服务端选用C#的考虑就是以后能够前后端公用一份代码,不同的逻辑再通过继承的方式再各自写,这样应该能减轻一些重复工作,也会减少一些bug产生。目前这个新项目正在往这个方向慢慢靠,期待能完整用上的时候。

4. 统一选服服务器

根据之前遇到服务器列表的两个需求,整理了下这个服务器要提供两种功能:

  1. 第一种支持选服的游戏,能够获取服务器列表(服务器列表有大区概念)
  2. 第二种支持客户端无服务器列表的游戏,新用户自动帮选择一个服务器,老用户能获取到之前进入过的游戏

结合我们之前定义的GameId概念(一个ProductId、PublishId、PlatformId、ChannelId确定一个GameId),一个游戏产品会有存在多个GameId,为了让多个GameId能公用一个服务器列表配置,增加了一层服务器组Id,多个GameId可以对应同一个ServerGroupId,方便后期的维护。