Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php node.js MySQL性能_Php_Database_Node.js_Benchmarking - Fatal编程技术网

Php node.js MySQL性能

Php node.js MySQL性能,php,database,node.js,benchmarking,Php,Database,Node.js,Benchmarking,我正在比较node.js和PHP对MySQL数据库的写入性能。我正在虚拟机中使用Apache基准测试、linux Mint、最新的mysql服务器(5.5.43)和用于mysql的驱动程序node.js。 我使用的代码是 server.js var http = require('http'); var mysql = require('mysql'); var server = http.createServer(function (req, res) { var connection =

我正在比较node.js和PHP对MySQL数据库的写入性能。我正在虚拟机中使用Apache基准测试、linux Mint、最新的mysql服务器(5.5.43)和用于mysql的驱动程序node.js。 我使用的代码是

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/');
$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";
?>
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";
?>
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
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
server.js文件中node.js服务器的Apache基准测试

ab -n 1000 -c 100 http://localhost:1337/
node.js 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
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
我的印象是node.js在I/O数据库操作方面优于PHP。因此,无论我尝试哪种SQL语句(也尝试了从Persons中选择*),node.js的结果都会更糟,这让我感到惊讶

不仅如此,而且当cuncurrency level为100时,节点会记录大量“执行查询时出错”消息。发送到控制台的消息以及1000个请求中只有约500个被写入数据库。mysql节点驱动程序就是那么糟糕,还是我在这里做错了什么?我非常感谢您的帮助:)


谢谢

首先,您没有完成server.js代码。有一个错误,打开的数据库连接太多。为了解决这个问题,我使用了connectionPool。第二,Apache使用workers并行运行同一脚本的多个副本

现在,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/');
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
正如你所看到的,结果非常接近。但这是针对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、node 0.10.37、mysql 5.5.44

您首先运行哪个测试?节点还是php?您应该在每次测试后重置DB以获得一致的结果,或者在每次测试后使用两个不同的DB,使用相同的模式化重置DB,结果相同:(你不能这样衡量。你在一台机器上运行所有东西,包括基准测试程序。你刚刚测试的是每个程序处理并发连接的能力。此外,写操作完全属于MySQL。这是将数据填充到磁盘的主要权限。PHP和node都不是我有什么要说的。我建议使用更好的工具进行基准测试,同时使用不同的机器,这样你就不会不必要地占用内核或hdd I/O并运行程序的CLI版本。你只是在那里测试了http并发性。那么,与PHP相比,node.js为什么在当前MySQL queryes方面如此糟糕呢?我发现node.js是much在当前读取/写入硬盘上的文件时速度更快,为什么MySQL数据库没有出现这种行为?当您写入磁盘上的文件时,您并没有强制驱动器真正写入数据。操作系统和硬盘缓存正在排队等待写入操作,写入发生在稍后阶段,即有更多数据要写入时一次写入操作。当您发布数据库更新或插入时,数据库会强制磁盘和操作系统避免这种排队机制,并真正写入数据-这是
ACID
-耐久性的
D
。这就是为什么NoSQL比关系数据库显示得更快-它们延迟写入。Node的工作方式相同。我使用的是FX 6300,仅使用一个节点进程,我得到:`并发级别:100次测试时间:1.045秒完成请求:1000次失败请求:0次总传输:112000字节HTML传输:11000字节每秒请求:956.94[#/sec](平均)每个请求的时间:104.500[ms](平均)每个请求的时间:1.045[ms](平均值,在所有并发请求中传输速率:104.66[Kbytes/sec]接收到'my innodb is
innodb\u flush\u log\u at\u trx\u commit=0 innodb\u thread\u concurrency=8 innodb\u log\u buffer\u size=32MB
,我每秒收到的请求数:1392.73[#/sec](平均值)每个请求的时间:71.801[ms](平均值)每个请求的时间:0.718[ms](所有传输速率的平均值:152.33[Kbytes/sec]接收到我看不出这个答案中的PHP引用是从哪里来的?我在上面看到的PHP性能结果是每秒752个请求。但是这个答案显示的是每秒133个请求。为什么存在差异?我遗漏了什么吗?