【问题标题】:Perfomance issue (Nginx, NodeJs, Mysql)性能问题(Nginx、NodeJs、Mysql)
【发布时间】:2018-04-05 21:14:47
【问题描述】:

我有以下问题。 使用 REST,我通过 NodeJS Express 应用程序从 MySql 数据库获取二进制内容 (BLOB)。 一切正常,但我在扩展解决方案时遇到问题。

我将 NodeJS 实例的数量增加到 3 个:它们运行端口 4000,4001,4002。 在同一台机器上,我安装并配置了 Nginx,以在我的 3 个实例之间进行负载平衡。 我正在使用 Apache Bench 进行一些性能测试。 请看附图。

假设我有一个虚拟 GET REST 进入数据库,读取 blob(大小约为 600KB)并将其返回(全部为 http),我将同时进行 300 次调用。我原以为使用 nginx 分发请求会使其更快,但事实并非如此。

为什么会这样? 我假设它与MySql有关? 我的 NodeJs 应用程序正在使用一个限制设置为 100 个连接的连接池。这个值和Mysql中的最大连接值应该是什么关系?如果我将连接池增加到更多的连接数,我会得到更糟糕的结果。

关于如何扩展的任何建议?

谢谢!

【问题讨论】:

  • 这台机器有多少 CPU 内核?你在同一个机器上运行 MySQL 吗?
  • i7-6700, 4 cores : 此服务器托管 nodeJS 应用程序 (3) + nginx。 MySQL 服务器在不同的盒子上。
  • 然而,我能够改进查询 - 现在我能够看到一些改进。大约 600 个请求在大约 90 秒内完成(直接调用一个到 NodeJs)。如果我通过 nginx(带有 3 个 NodeJs 应用程序),大约 600 个请求在大约 60 秒内完成。所以,它看起来更好。

标签: mysql node.js performance nginx performance-testing


【解决方案1】:

“300 同时”是愚蠢的。没有人(今天)有足够的资源来有效地做几十件以上的事情。

  • 4 个 CPU 内核 -- 如果您超过 4 个线程,它们将在每个线程都在尝试获取 CPU 时间时遇到困难。
  • 1 网络 -- 您是否检查过您的大 blob 是否正在使用所有带宽,从而成为瓶颈?
  • 1 I/O 通道 -- 同样,大量数据可能会填满到磁盘的路径。

(这个数学不太正确,但它说明了一点......)你不能有效地跑得比你从 4+1+1“同时”连接中获得的速度更快。 (实际上,您可能可以,但不是 300!)

典型的基准测试试图找出有多少“连接”(或其他)导致系统崩溃。那些难以阅读的屏幕截图表明,每秒大约是 7 个。

我也对“同时”这个词提出了质疑。唯一接近“同时”(在您的系统中)的是能够“同时”使用 4 个内核。其他所有指标都涉及资源共享。根据你的说法,...

  • 如果您每秒大约 7 次启动,一些资源会被用完,但每个请求会很快(可能不到一秒)
  • 如果您同时开始 300 个,他们会互相绊倒,其中一些可能需要 分钟 才能完成。

有两个有趣的指标:

  • 您可以每秒维持多少次。 (可能 7 次/秒)
  • 平均(可能还有 95% 的百分位数)需要多长时间。

尝试 10 个“同时”连接并返回报告。试试 7。试试其他一些类似的小数字。

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2012-11-07
    • 2019-04-13
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多