I am comparing node.js versus PHP in terms of write performance to MySQL database. I am using Apache Benchmark, linux Mint in virtual machine, newest mysql-server(5.5.43) an
First of all you didn't finish server.js code. There is a bug with too many connections opened to DB. To fix this I used connectionPool. And second of all Apache use workers to run many copies of same script in parallel.
Now the result for Apache + PHP + MySQL (XAMP) as a reference point:
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
Now to equal the chances I fixed 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/');
And results of Node + 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
As you can see the results are very close. But this is one node process against 11 Apache workers. What happens if I add clusters to the equation? Here is the modified code:
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);
}
Four node workers results:
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
For curiosity I add results for node with 10 workers:
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
My laptop is Core2Duo T6600, Ubuntu 14.04.3, php 5.5.9, node 0.10.37, mysql 5.5.44