使用 mysql 池对 Node.js(集群)进行性能基准测试:Lighttpd + PHP?

2023-11-23

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';
  }
?>

这是一个糟糕的基准比较。在 Node.js 中,您选择整个表并将其放入数组中。在 php 中,你只解析第一行。所以你的表越大,节点看起来就越慢。如果你让 php 使用 mysqli_fetch_all ,这将是一个类似的比较。虽然 db-mysql 应该很快,但它的功能不是很全面,并且缺乏进行公平比较的能力。使用不同的node.js模块(例如node-mysql-libmysqlclient)应该允许您仅处理第一行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 mysql 池对 Node.js(集群)进行性能基准测试:Lighttpd + PHP? 的相关文章

随机推荐

  • 安装没有 package.json 文件的 Cordova 插件

    我正在尝试使用 Cordova CLI 7 安装 Cordova 插件 该插件没有 package json 文件 因此将其添加到我的项目时会抛出错误 我尝试使用plugman 转换config xml 文件 它在 Android 上运行良
  • Okhttp 检查文件大小而不下载文件

    okhttp常见的例子涵盖了get和post的场景 但我需要获取带有 url 的文件的文件大小 因为我需要通知用户 并且只有在获得他们的批准后才能下载文件 目前我正在使用这段代码 URL url new URL http server co
  • Netty Channel.write 不写入消息

    我正在尝试使用 Netty 迈出第一步 为此我在 Netty 上编写了简单的服务器 在 oio plain TCP 上编写了简单的客户端 客户端发送随机文本数据包 并且必须收到 Ack 消息 查看处理程序方法 Override public
  • 在调用 save() 之前必须手动分配此类的 ids

    我的休眠有一些问题 OneToMany映射 就像这里一样 Entity Table name albums SequenceGenerator name ALBUMS SEQ sequenceName albums seq allocati
  • 将 Python 内置类型替换为自定义类型

    是否可以用自定义类型替换一些内置的 python 类型 我想创建类似的东西 class MyInt object builtin int MyInt x 5 您似乎在问是否可以覆盖输入时创建的类型literals 答案是不 你不能做到这样x
  • Android 应用程序仅为一项活动启用 NFC

    对于支持 NFC 的应用程序 是否可以仅针对 Android 中的一项活动启用 NFC 我读过这个 仅从特定活动中读取 NFC 标签 但设备仍在扫描应用程序所有活动的标签 EDIT
  • 将指标从 telegraf 发送到 prometheus

    我在跑prometheus and telegraf在同一主机上 我正在使用一些输入插件 输入 cpu 输入 ntpq 我已经配置为prometheus client输出插件将数据发送到prometheus 这是我的配置 outputs p
  • 带有按名称调用参数的函数文字

    如何在 scala 中定义带有按名称调用参数的匿名函数 我尝试了以下方法 val fun x Boolean y gt Int gt if x y else 0 这适用于按值调用 y 但不适用于按名称调用 为什么 这是可以做到的 但方式略有
  • 静态、常量和只读字段的内存分配在哪里?

    我已经在程序中使用了这三个字段 并得到了用法上的差异 但我有点困惑这些字段存储在哪里 是在数据段 堆栈还是堆 还是代码段 static int a const int b 1235 readonly int c 在ILDASM中字段描述如下
  • 什么是顶级 const 限定符?

    什么是constC 中的 顶级 限定符是什么意思 那么其他级别是什么 例如 int const i int const i int const const i 顶级 const 限定符影响对象本身 其他的都只是 与指针和参考文献相关 他们不
  • 如何从 Maven 项目外部链接源?

    在 Maven 中 是否可以从项目文件夹外部链接其他依赖的 java src 以便当我们构建主包时 maven 可以将此类类包含到最终的 jar 中 就像我们可以将任何源文件夹链接到 Eclipse 中的项目并且 Eclipse 将其视为常
  • 读取以 null 结尾的字符串

    我正在从二进制文件读取字符串 每个字符串都以 null 结尾 编码为UTF 8 在 python 中 我只是读取一个字节 检查它是否为 0 将其附加到字节数组 然后继续读取字节 直到看到 0 然后我将字节数组转换为字符串并继续 所有字符串均
  • 如何在 KNPMenuBundle 中将“当前”类更改为“活动”类

    我想知道 将 当前 类更改为 活动 以便 Bootstrap 能够正确使用它的最佳方法是什么 我考虑过复制并覆盖 knp menu html twig 但我认为这不是最好的方法 无论如何 这样做更好吗 要在所有应用程序中应用默认选项 您可以
  • bash 命令是否可以在上一个命令的结果之前继续执行?

    当从 bash 脚本运行命令时 bash 是否总是等待上一个命令完成 还是只是启动命令然后继续执行下一个命令 即 如果从 bash 脚本运行以下两个命令 事情可能会失败吗 cp tmp a tmp b cp tmp b tmp c 是的 如
  • ExecuteReader 需要一个打开且可用的连接。连接的当前状态已关闭

    好吧 我在本周早些时候询问了这个错误 并得到了一些非常有用的答案 毫无疑问 自从我开始遵循这些建议以来 情况已经有了很大的改善 但是 现在我使用 正确 的最佳实践方法来访问数据库 我仍然在某些函数上遇到此错误 并且无法让它在该块中消失 这是
  • 如何在 Java 中将 .js 文件加载到 Rhino 上下文中

    这是我的情况 我可以访问 Java 类中的 Rhino Context 对象 我想读入一堆 js 文件并将它们传递到 Rhino 上下文以对它们进行评估 我对在脚本上下文中使用 js 文件中的函数并不真正感兴趣 而只是对在 js 文件中声明
  • 录音机,将 Blob 文件保存到服务器 - C#,Mvc

    我正在做的一个项目中需要一个录音机 并且录制的声音必须稍后收听 该项目由c 和asp net mvc开发 http demos subinsb com jquery voice 我在上面的链接中使用了录音机系统 当您单击 下载 时 它会为您
  • 如何使用 Jquery $(".something") 在 ExtJS 中选择一个类?

    我正在寻找一种等效的方法来选择类元素 例如 Jquery for ExtJS 中的 className 我知道 Ext get 只接受一个 id 我们将非常感谢您的帮助 干杯 米奇 Edited 让我进一步解释一下 我希望能够在执行 选择
  • 在函数参数中使用后置增量

    当我运行这段代码时 输 出是 11 10 到底为什么会这样 有人可以给我一个解释 希望能启发我吗 Thanks include
  • 使用 mysql 池对 Node.js(集群)进行性能基准测试:Lighttpd + PHP?

    Edit 2 现在使用 db mysql 和 generic pool 模块 错误率大幅下降 徘徊在 13 但吞吐量仍然在 100 req sec 左右 Edit 1 在有人建议 ORDER BY RAND 会导致 MySQL 变慢之后 我