问题描述: 使用nodejs开发了一个游戏服务器,为了尽可能提高服务器的性能,服务器采用多进程的架构,前面处理玩家socket连接的是多个nodejs进程,使用 child_process 模块,服务器启动时fork出来,而处理玩家游戏逻辑的是单独一个nodejs进程(因为玩家之间需要交互,而且玩家都是有状态的,所以无法分成多个进程)这个作为主进程;主进程与子进程之间使用使用child_process模块内建的通讯方式进行通讯;
现在服务器性能出现瓶颈,服务器同时在线去到1500人左右,CPU占用率在40+左右,目标是3000人同时在线;通过CPU Profile分析,唯一无状态的可分离出来而且比较占用CPU的,就是玩家数据读数据库和保存数据库的时候,数据库使用的是mongodb,所以现在想把读写数据库的逻辑独立到一个新的进程中;但是问题来了,由于玩家的数据是一个大的Json结构,最大的大小能达到600+K,而node的child_process模块的内建进程间通讯是通过JSON.stringify和JSON.parse来转换成字符串来进行通讯的,所
以独立出来以后,性能的问题,又指向了child_process模块中的进程之间的通讯的函数,通过实验: JSON.strinify 一个600K+玩家的数据平均需要35ms,JSON.parse 一个600K+玩家的数据平均需要20ms,而且这两个函数都是同步的,会造成阻塞;这也就是说主进程无法把一些包含大数据处理的任务分派到其他进程去做,这也直接限制了主进程的承载量和在线玩家人数;
尝试找过一写解决的方案: 1.异步版的 JSON.stringify 和 JSON.parse ,可惜没有结果,正如这里的讨论:https://github.com/joyent/node/issues/7543 2.为node加入多线程?nodejs有几个多线程的库,但是貌似都不支持共享进程内存,无法操作主进程的内存,只能通过字符串进行交换数据,也就是说轮回到以上进程间的通讯问题;
百牛信息技术bainiu.ltd整理发布于博客园
这个问题一直比较困扰,还没有找到好的解决方法,希望大牛来赐教