11ho 发表于 2015-11-11 10:29:32

node.js mongodb数据库驱动性能测试

  众所周知,node.js的特点是单线程、事件驱动、异步IO,适合开发运行在分布式设备上的实时性较强的数据密集型应用。今天做了一个性能测试,相同的场景下,拿java和node对比测试,数据库是mongodb。Node是非阻塞IO,Node是非阻塞IO,Java是阻塞I0,理论上,Java在IO操作上性能不会高于node,cpu使用率上node也应该会远超java,但通过插入和查询的测试结果来看恰好相反。不知道什么原因,我还做了一个测试,抛开数据库IO操作,如果只是简单的静态页面请求,node还是强于javaservlet的。个人怀疑目前node官方mongodb驱动在性能上存在一些问题,或者说就这个性能了,或者是我代码写的有问题,大家有没有这方面经验,请专家给指点下。

  

  压测工具:apache ab

  测试内容:1、数据插入。java和node插入mongodb数据100W条。
                     2、数据查询。node和java各查询两个集合数据(各200W条)并将其返回。

  系统配置:操作系统:win7、系统内存:8G、cpu:4核、node版本:0.10
  数据库:mongodb
  数据格式:{ "_id" : ObjectId("54ce9a5452fba9ead1b4a62b"), "name" : "jerry37704030", "age": 8, "status" : "YHOO0", "groups" : [ "news", "sports" ] }
  线程:java、node均采用单进程单线程方式测试
  java mongodb驱动:官方提供
  node mongodb驱动:来自npm mongodb,也是官方提供的

1、数据插入
1、1 java+mongodb
  插入UserJava集合100W条记录
  代码:

  耗时:144.73秒
  cpu负载:


1、2 node+mongodb
  插入UserNode集合100W条记录

  代码:

  耗时:312.95秒
  cpu负载:
  

  插入总结:
  java和node分别插入100W条记录格式相同的数据,java用时144.73秒,node用时312.95秒。cpu负载一致。插入效率上java占优,用时为node一半。
2、数据查询
  数据:UserJava 200W,UserNode 200W

  从两个集合中取出数据合并返回。
2、1 java servlet+tomcat
  代码:

  压力测试:
  ab -c 500 -n 50000 http://127.0.0.1:8080/mongodb/mt

  cpu负载:


2、2 node+express
  代码:


  
  压力测试:
  ab -c 500 -n 50000 http://127.0.0.1:3000/

  cpu负载:
  

  查询总结:
  java并发1107次/秒,node并发867次/秒。cpu使用率,java 68%,node40%,内存上java和node出入不大。
分析:
  插入方面:java和node分别插入100W条记录格式相同的数据,java用时144.73秒,node用时312.95秒。cpu负载一致。
  查询方面:java并发1107次/秒,node并发867次/秒。cpu负载,java 68%,node40%,内存上java和node出入不大。

疑问:
  Node是非阻塞IO,Java是阻塞I0,理论上,Java在IO操作上性能不会高于node,cpu使用率上node也应该会远超java,但通过插入和查询的测试结果来看恰好相反。不知道什么原因,我还做了一个测试,抛开数据库IO操作,如果只是简单的静态页面请求,node还是强于javaservlet的,个人怀疑目前node官方mongodb驱动在性能上存在一些问题,或者说就这个性能了,或者是我代码写的有问题,大家有没有这方面经验,请专家给指点下。
  

         版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: node.js mongodb数据库驱动性能测试