最近的一些服务器优化

最近在配合压测游戏服务器,遇到一些问题,简单记录一下。

我们在16核32G的Ubuntu实例上部署的游戏服务器进程,用的数据库是4核8G的Mongodb。压测的结果是注册速度没有达到指标,我们设定的指标是100TPS。

在压测注册的时候,发现缓存服的进程CPU利用率异常高。在与同事沟通后,多开了几个缓存进程。再次测试,发现多开的缓存进程的CPU利用率也都变得很高。

C#版的Mongodb驱动默认连接池大小是100,我们游戏设置的并发数是31。我尝试把Mongodb的连接池调大,并发数调大。再次用机器人进行测试,情况不仅没有改善,并且还抛出了队列已满的异常。

查看服务器面板的监控的时候,发现Mongodb没有CPU这个监控,让运维添加上监控后再次测试。发现Mongodb的CPU在80人每秒注册的时候到了100%,说明瓶颈在与数据库的交互中。

Mongodb是NoSQL,谈到NoSQL总会想到Redis,我本以为Mongodb性能会很高和Redis一样,所以在平时代码编写上都把它当做内存数据库用的。

再次检查代码,发现了很多不必要的直接读写数据库的操作。并且玩家的账户信息没有对uid建立索引,在注册步骤的查询时会导致全表扫描。:(

优化

所有玩家的功能逻辑都不直接操作数据库,玩家的数据在整合后发送到缓存服,缓存服定时将玩家的脏数据同步到数据库,当然如果是充值这些特殊功能,可以视情况而定。Mongodb有批量操作的功能,各个玩家的同一个表可以进行批处理,减少对数据库的访问。

在启动服务器的时候将必须数据,比如账户信息等,从数据库中加载到内存中。活跃玩家的数据则可以直接加载到内存中。

在关服的时候,需要注意把缓存进程的数据同步到数据库。并且需要加入兜底机制。

返回顶部