性能问题(Nginx,NodeJs,Mysql)

时间:2018-03-31 10:06:56

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

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

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

Perf testing

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

  • 4个CPU核心 - 如果你超过4个线程,他们会因为试图获得CPU时间而绊倒每个核心。
  • 1个网络 - 您是否检查过您的大blob是否正在使用所有带宽,从而成为瓶颈?
  • 1 I / O频道 - 同样,许多数据可能会填满通往磁盘的路径。

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

典型的基准测试试图找出有多少“连接”(或其他)导致系统过度使用。那些难以阅读的截图表示每秒约有7个 是限制。

我也用“同时”这个词狡辩。唯一接近“同步”(在您的系统中)的是“同时”使用4个核心的能力。每个其他指标都涉及资源共享。根据你的说法,......

  • 如果你每秒开始大约7,那么一些资源将会被淘汰,但每个请求都会很快(可能不到一秒)
  • 如果你一次性开始300,他们会偶然发现,其中一些人可能分钟完成。

有两个有趣的指标:

  • 您可以维持每秒多少 。 (也许是7 /秒)
  • 平均值(也许是95%百分位数)需要多长时间。

尝试10个“同时”连接并报告回来。尝试7.尝试其他一些小数字。