Edit(2):现在使用 db-mysql 和 generic-pool 模块。错误率大幅下降,徘徊在 13%,但吞吐量仍然在 100 req/sec 左右。
Edit(1):在有人建议 ORDER BY RAND() 会导致 MySQL 变慢之后,我从查询中删除了该子句。 Node.js 现在徘徊在 100 个请求/秒左右,但服务器仍然报告“连接错误:连接太多”。
使用 PHP 的 Node.js 或 Lighttpd?
您可能看到了许多 Node.js 的“Hello World”基准测试...但是“hello world”测试,即使是那些每个请求延迟 2 秒的测试,也与现实世界的生产使用情况相距甚远。我还使用 node.js 执行了“Hello World”测试的这些变体,并看到吞吐量约为 800 个请求/秒,错误率为 0.01%。然而,我决定进行一些更现实的测试。
也许我的测试并不完整,很可能node.js或我的测试代码确实有问题,所以如果您是node.js专家,请帮助我编写一些更好的测试。我的结果发布如下。我使用 Apache JMeter 进行测试。
测试用例和系统规格
测试非常简单。 mysql 查询用户数量是随机排序的。检索并显示第一个用户的用户名。 mysql数据库连接是通过unix套接字进行的。操作系统是 FreeBSD 8+。 8GB 内存。英特尔至强四核 2.x Ghz 处理器。在接触 Node.js 之前,我对 Lighttpd 配置进行了一些调整。
Apache JMeter 设置
线程数(用户):5000我相信这是并发连接数
加速周期(以秒为单位):1
循环次数:10这是每个用户的请求数
Apache JMeter 最终结果
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 太糟糕了,我不得不提前停止测试。 [Fixed已完全测试]
Node.js 在服务器上报告“连接错误:连接过多”。 [Fixed]
大多数时候,Lighttpd 的吞吐量约为 1200 请求/秒。
然而,node.js 的吞吐量约为 29 req/sec。 [Fixed现在为 100 请求/秒]
这是我用于node.js的代码(使用MySQL池)
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';
}
?>