问题描述: 使用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整理发布于博客园

这个问题一直比较困扰,还没有找到好的解决方法,希望大牛来赐教

最新文章

  1. 关于 feature team 的一些内容
  2. SQLServer 2008 R2 对同时含有数字和中文的字段进行排序
  3. css3选择器(一)
  4. 【bzoj4241】 历史研究
  5. java 面向对象编程 --第十二章 JDK常用类
  6. iOS 7 Pushing the Limits Notes - create a layer like notification center's or control center's background
  7. [051] 微信公众平台开发教程第22篇-怎样保证access_token长期有效
  8. javascript 关于一周前一个月前的处理方法
  9. 读书笔记--<<会说话的代码>>
  10. openface 训练数据集
  11. Java集合详解一
  12. Linux学习历程——Centos 7 diff命令
  13. PC能替代服务器吗?
  14. 用itext合并多个pdf文件【转】【补】
  15. C++ 成员初始化列表
  16. [转]OpenVPN官网的HOWTO
  17. 51.webpack vue-cli创建项目
  18. Linux内核分析第二周:操作系统是如何工作的
  19. PyQT5速成教程-3 布局管理
  20. 【swiper轮播插件】解决swiper轮播插件触控屏问题

热门文章

  1. [Bzoj3206][Apio2013]道路费用(kruscal)(缩点)
  2. [转] SQL Server中变量的声明和使用方法
  3. Mysql 性能优化20个原则(2)
  4. BUPT复试专题—树查找(2011)
  5. android studio 使用(一)
  6. POJ 3518 Prime Gap(素数)
  7. hive cli 启动缓慢问题
  8. Cocos2d-x学习资源
  9. 4. 基本TCP套接字编程
  10. SD_WebImage之相同url图片不更新问题