我正在将node.js与PHP相比,就写入性能与mySQL数据库进行比较。我正在使用Node.js使用Apache Benchmark,Virtual Machine中的Linux Mint,最新的MySQL-Server(5.5.43)和驱动程序。我使用的代码是
server.js
var http = require('http');
var mysql = require('mysql');
var server = http.createServer(function (req, res) {
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'testDB'
});
connection.connect();
connection.query("INSERT INTO Persons (LastName, FirstName, Address, City) VALUES ('Futterkiste', 'Alfreds', 'Obere Str. 57', 'Berlin')", function(err, rows, fields) {
if (!err)
console.log('The solution is: ', rows);
else
console.log('Error while performing Query.');
});
connection.end();
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
});
server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
index.php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "testDB";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO Persons (LastName, FirstName, Address, City) VALUES ('Futterkiste', 'Alfreds', 'Obere Str. 57', 'Berlin')";
// use exec() because no results are returned
$conn->exec($sql);
echo "New record created successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
echo "Hello world";
?>
Apache基准标准使用index.php文件
ab -n 1000 -c 100 http://localhost/
php mysql写作
Concurrency Level: 100
Time taken for tests: 1.328 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 230000 bytes
HTML transferred: 43000 bytes
Requests per second: 752.99 [#/sec] (mean)
Time per request: 132.804 [ms] (mean)
Time per request: 1.328 [ms] (mean, across all concurrent requests)
Transfer rate: 169.13 [Kbytes/sec] received
apache Benchmark至node.js server in server.js file
ab -n 1000 -c 100 http://localhost:1337/
node.js mysql写绩效
Concurrency Level: 100
Time taken for tests: 3.896 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 113000 bytes
HTML transferred: 12000 bytes
Requests per second: 256.68 [#/sec] (mean)
Time per request: 389.585 [ms] (mean)
Time per request: 3.896 [ms] (mean, across all concurrent requests)
Transfer rate: 28.33 [Kbytes/sec] received
i的印象是Node.js在I/O数据库操作中的表现优于PHP。因此,让我感到惊讶的是,无论我尝试哪种SQL语句(也尝试从人中选择 *)node.js结果更糟。
不仅如此,而且当cuncurrency级别为100时,节点还会记录大量的"执行查询时错误"。给控制台的消息,1000个请求中只有约500个被写入数据库。MySQL节点驱动程序只是很糟糕,还是我在这里做错了什么?我真的很感谢您的帮助:)
谢谢
首先您未完成server.js代码。有一个错误,与DB打开了太多连接。为了解决此问题,我使用了ConnectionPool。第二个Apache使用工人并行运行许多同一脚本的副本。
现在,Apache PHP MySQL(XAMP)作为参考点的结果:
Concurrency Level: 100
Time taken for tests: 7.476 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 230000 bytes
HTML transferred: 42000 bytes
Requests per second: 133.77 [#/sec] (mean)
Time per request: 747.557 [ms] (mean)
Time per request: 7.476 [ms] (mean, across all concurrent requests)
Transfer rate: 30.05 [Kbytes/sec] received
现在要等于我修复了server.js
的机会var http = require('http');
var mysql = require('mysql');
var connection = mysql.createPool({
connectionLimit: 10,
host : 'localhost',
user : 'test',
password : 'test',
database : 'testDB'
});
var server = http.createServer(function (req, res) {
connection.query("INSERT INTO Persons (LastName, FirstName, Address, City) VALUES ('Futterkiste', 'Alfreds', 'Obere Str. 57', 'Berlin')", function(err, rows, fields) {
if (!err)
console.log('The solution is: ', rows);
else {
console.log('Error while performing Query.');
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
});
});
server.listen(1337, '127.0.0.1');
server.on('close', function() {
connection.end();
})
console.log('Server running at http://127.0.0.1:1337/');
和节点 mysql的结果:
Concurrency Level: 100
Time taken for tests: 7.289 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 112000 bytes
HTML transferred: 11000 bytes
Requests per second: 137.19 [#/sec] (mean)
Time per request: 728.899 [ms] (mean)
Time per request: 7.289 [ms] (mean, across all concurrent requests)
Transfer rate: 15.01 [Kbytes/sec] received
您可以看到结果非常接近。但这是针对11名Apache工人的一个节点过程。如果我将簇添加到方程式中会怎样?这是修改的代码:
var http = require('http');
var mysql = require('mysql');
var cluster = require('cluster');
if (cluster.isMaster) {
cluster.fork();
cluster.fork();
cluster.fork();
cluster.fork();
} else {
var connection = mysql.createPool({
connectionLimit: 10,
host : 'localhost',
user : 'test',
password : 'test',
database : 'testDB'
});
var server = http.createServer(function (req, res) {
connection.query("INSERT INTO Persons (LastName, FirstName, Address, City) VALUES ('Futterkiste', 'Alfreds', 'Obere Str. 57', 'Berlin')", function(err, rows, fields) {
if (!err)
console.log('The solution is: ', rows);
else {
console.log('Error while performing Query.');
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
});
});
server.listen(1337, '127.0.0.1');
server.on('close', function() {
connection.end();
})
console.log('Server running at http://127.0.0.1:1337/ worker:' + cluster.worker.id);
}
四个节点工人结果:
Concurrency Level: 100
Time taken for tests: 2.782 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 112000 bytes
HTML transferred: 11000 bytes
Requests per second: 359.48 [#/sec] (mean)
Time per request: 278.179 [ms] (mean)
Time per request: 2.782 [ms] (mean, across all concurrent requests)
Transfer rate: 39.32 [Kbytes/sec] received
对于好奇心,我添加了10名工人的节点的结果:
Concurrency Level: 100
Time taken for tests: 2.647 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 112000 bytes
HTML transferred: 11000 bytes
Requests per second: 377.84 [#/sec] (mean)
Time per request: 264.665 [ms] (mean)
Time per request: 2.647 [ms] (mean, across all concurrent requests)
Transfer rate: 41.33 [Kbytes/sec] received
我的笔记本电脑是core2duo t6600,ubuntu 14.04.3,php 5.5.9,节点0.10.37,mySQL 5.5.44