node.js MySQL performance

后端 未结 1 1668
礼貌的吻别
礼貌的吻别 2020-12-08 16:35

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

相关标签:
1条回答
  • 2020-12-08 17:26

    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

    0 讨论(0)
提交回复
热议问题