LAMP和MEAN堆栈中没有特定的读取性能差异

时间:2015-07-18 10:42:30

标签: mysql node.js mongodb lamp mean-stack

这些是Iam在AWS T2.medium 2核心/ 4GB实例上运行的代码。使用相同的配置不同的实例,相同的子网到基准。基准测试结果显示两个堆栈的相同吞吐量和响应时间。我使用Jmeter进行性能指标评估。结果显示MEAN比LAMP慢。经测试最多600个并发请求,MEAN的吞吐量约为35req / sec,LAMP的吞吐量为37req / sec。为什么Iam得到如此低的吞吐量以及为什么MEAN在阅读时表现最差 LAMP堆栈代码:

<?php

 $con = mysql_connect("localhost", "root", "root");

 if(!$con) die('connection failed');

 $db = mysql_select_db("mms-php", $con);

 $result = mysql_query("SELECT * FROM comments LIMIT 10", $con);

 $rows = array();

 while( $row = mysql_fetch_assoc($result) ) {
    array_push($rows, $row);
 }


 header("Content-type:application/json");
 echo json_encode($rows);

 //print_r($rows);

 //$result = mysql_query("INSERT INTO msgs (msg) VALUES ('" . rand() .         time() . "')", $con);
 mysql_close($con);

 ?>

mysql有一个包含1000个条目的表注释。类似地,MongoDB有一个包含1000个条目的集合。 MEAN堆栈代码:

var MongoClient = require('mongodb').MongoClient
, assert = require('assert');
var http = require('http');

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
   // Fork workers.
   for (var i = 0; i < numCPUs; i++) {
       cluster.fork();
   }

cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
} else {

      // Connection URL
      var url = 'mongodb://localhost:27017/test';
      // Use connect method to connect to the Server
      MongoClient.connect(url, function(err, db) {
          console.log("Connected correctly to server");
          http.globalAgent.maxSockets = 10;
          http.createServer(function (req, res) {
              //process.nextTick(function(){
              res.writeHead(200, {'Content-Type': 'text/plain'});
              db.collection('comments').find({},function(err, docs) {
                    if(err) {
                              console.log(err);
                              res.write('an error occurred');
                              res.end();
                    } else {
                           //   console.log(docs);
                           docs.each(function(err, doc){
                                if(doc)
                                       res.write(JSON.stringify(doc));
                                else
                                       res.end();
                                     //console.log(JSON.stringify(doc));
                            });
                    }
               });
              //    });
          }).listen(1337, '0.0.0.0');
      });

}

1 个答案:

答案 0 :(得分:0)

总之,综合基准主要用于营销。对于只读工作(分析和搜索,其中写入步骤通常每天一次/一夜)我已经使用MySQL将所有数据放在60Gb + squashfs RAM-disk(LAMP)和Elasticsearch(JavaScript&amp; Linux上的PHP客户端)。后者是实时/近期更新(我喜欢Elasticsearch,尽管存在Java偏见)的可行选项,它与事务部分的MySQL数据库(以及允许以后使用ETL进行分析的规范化模型)耦合。

我猜你并不完全对应用程序的MEAN vs LAMP实现进行基准测试。我猜你更有可能对启动,打印(JSON编码)数千行进行基准测试,以及拆除成本(建立进程/线程实例,建立与数据库的连接等)而不是数据库事务成本合适。我建议就是这样:一个非常小的数据库(1000个元素)将被缓存;你不是要求数据库做任何事情而不是返回游标&amp;整个表/表等价;然后只是将它回流到输出流(没有转换 - 除非你的客户端意味着这样做)。最后,正如其他人提示的那样,您并未控制执行比较的平台。你可以运行LAMP&amp;在最微薄的计算机上,您可以更加确定公平的比较。

您的基准测试也很容易被Apache配置(与大多数其他堆栈一样)用于缓存结果。

您是否尝试过各种客户来实施这两种实施? Apache ab是微不足道的,但对于我曾参与历史的应用程序而言毫无意义。非常适合发现系统在饱和状态下的行为,但不像我httperf那样提供信息,我已经成功地用于扩展应用程序服务和数据库层(它赢得了所有适合RAM的内容)我可以制作适合实际场景的分发频率。)