使用MySQL池对node.js(集群)的性能进行基准测试:Lighttpd + PHP? [英] Benchmarking Performance of node.js (cluster) with mysql pools : Lighttpd + PHP?

查看:86
本文介绍了使用MySQL池对node.js(集群)的性能进行基准测试:Lighttpd + PHP?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑(2):现在将db-mysql与通用池模块一起使用.错误率已显着下降并徘徊在13%,但吞吐量仍约为100 req/sec.

Edit(2): Now using db-mysql with generic-pool module. The error rate has dropped significantly and hovers at 13% but the throughput is still around 100 req/sec.

Edit(1):在有人建议ORDER BY RAND()会导致MySQL运行缓慢后,我从查询中删除了该子句.现在,Node.js徘徊在100 req/sec左右,但服务器仍然报告连接错误:连接过多".

Edit(1): After someone suggesting that ORDER BY RAND() would cause MySQL to be slow, I had removed that clause from the query. Node.js now hovers around 100 req/sec but still the server reports 'CONNECTION error: Too many connections'.

您可能已经看到了许多node.js的"Hello World"基准测试……但是"Hello World"测试,即使是每个请求延迟了2秒的测试,甚至都无法接近实际生产环境.我还使用node.js执行了"Hello World"测试的那些变体,并看到了大约800 req/sec的吞吐量和0.01%的错误率.但是,我决定进行一些更实际的测试.

You probably saw many "Hello World" benchmarking of node.js... but "hello world" tests, even those that were delayed by 2 seconds per request, are not even close to real world production usage. I also performed those variations of "Hello World" tests using node.js and saw throughput of about 800 req/sec with 0.01% error rate. However, I decided to some tests that were a bit more realistic.

也许我的测试还没有完成,很可能是关于node.js或我的测试代码的真正错误,因此,如果您是node.js专家,请帮助我编写一些更好的测试.我的结果发表在下面.我使用Apache JMeter进行测试.

Maybe my tests are not complete, most likely something is REALLY wrong about node.js or my test code and so if your a node.js expert, please do help me write some better tests. My results are published below. I used Apache JMeter to do the testing.

测试非常简单. mysql查询用户数是随机排序的.检索并显示第一个用户的用户名. mysql数据库连接是通过unix套接字进行的.操作系统是FreeBSD 8+. 8GB的RAM.英特尔至强四核2.x Ghz处理器.在碰巧遇到node.js之前,我已经对Lighttpd的配置进行了一些调整.

The test is pretty simple. A mysql query for number of users is ordered randomly. The first user's username is retrieved and displayed. The mysql database connection is through a unix socket. The OS is FreeBSD 8+. 8GB of RAM. Intel Xeon Quad Core 2.x Ghz processor. I tuned the Lighttpd configurations a bit before i even came across node.js.

线程数(用户):5000 我相信这是并发连接数

Number of threads (users) : 5000 I believe this is the number of concurrent connections

启动时间(以秒为单位):1

Ramp up period (in seconds) : 1

循环数:10 这是每个用户的请求数


Label                  | # Samples | Average  | Min   | Max      | Std. Dev. | Error % | Throughput | KB/sec | Avg. Bytes

HTTP Requests Lighttpd | 49918     | 2060ms   | 29ms  | 84790ms  | 5524      | 19.47%  | 583.3/sec  | 211.79 | 371.8

HTTP Requests Node.js  | 13767     | 106569ms | 295ms | 292311ms | 91764     | 78.86%  | 44.6/sec   | 79.16  | 1816

结果结论

Node.js太糟糕了,我不得不提早停止测试. [已修复已完全测试]

Result Conclusions

Node.js was so bad i had to stop the test early. [Fixed Tested completely]

Node.js在服务器上报告连接错误:连接过多". [固定]

Node.js reports "CONNECTION error: Too many connections" on the server. [Fixed]

大多数时候,Lighttpd的吞吐量约为1200 req/sec.

Most of the time, Lighttpd had a throughput of about 1200 req/sec.

但是,node.js的吞吐量约为29 req/sec. [已修复,现在为100req/sec]

However, node.js had a throughput of about 29 req/sec. [Fixed Now at 100req/sec]

var cluster = require('cluster'), http = require('http'), mysql = require('db-mysql'), generic_pool = require('generic-pool');

var pool = generic_pool.Pool({
    name: 'mysql',
    max: 10,
    create: function(callback) {
        new mysql.Database({
            socket: "/tmp/mysql.sock",
            user: 'root',
            password: 'password',
            database: 'v3edb2011'
        }).connect(function(err, server) {
            callback(err, this);
        });
    },
        destroy: function(db) {
        db.disconnect();
    }
});

var server = http.createServer(function(request, response) {  
    response.writeHead(200, {"Content-Type": "text/html"});  
    pool.acquire(function(err, db) {
        if (err) {
            return response.end("CONNECTION error: " + err);
        }

        db.query('SELECT * FROM tb_users').execute(function(err, rows, columns) {
            pool.release(db);

            if (err) {
                return response.end("QUERY ERROR: " + err);
            }
            response.write(rows.length + ' ROWS found using node.js<br />');
            response.end(rows[0]["username"]);
        });
    });   
});

cluster(server)
  .set('workers', 5)
  .listen(8080);

这是我用于PHP(Lighttpd + FastCGI)的代码

<?php
  $conn = new mysqli('localhost', 'root', 'password', 'v3edb2011');
  if($conn) {
    $result = $conn->query('SELECT * FROM tb_users ORDER BY RAND()');
    if($result) {
      echo ($result->num_rows).' ROWS found using Lighttpd + PHP (FastCGI)<br />';
      $row = $result->fetch_assoc();
      echo $row['username'];
    } else {
      echo 'Error : DB Query';
    }
  } else {
    echo 'Error : DB Connection';
  }
?>

推荐答案

这是一个糟糕的基准比较.在node.js中,您选择整个表并将其放入数组中.在php中,您仅解析第一行.因此,表越大,节点显示越慢.如果您使php使用mysqli_fetch_all,它将是一个类似的比较.虽然db-mysql应该很快,但是它的功能不是很全,并且缺乏进行公平比较的能力.使用像node-mysql-libmysqlclient这样的不同的node.js模块应该只允许您处理第一行.

This is a bad benchmark comparison. In node.js your selecting the whole table and putting it in an array. In php your only parsing the first row. So the bigger your table is the slower node will look. If you made php use mysqli_fetch_all it would be a similar comparison. While db-mysql is supposed to be fast it's not very full featured and lacks the ability to make this a fair comparison. Using a different node.js module like node-mysql-libmysqlclient should allow you to only process the first row.

这篇关于使用MySQL池对node.js(集群)的性能进行基准测试:Lighttpd + PHP?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆