+-
性能问题(Nginx,NodeJs,Mysql)

我有以下问题。使用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
投票

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

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

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

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

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

如果你每秒开始大约7,那么一些资源将会被淘汰,但每个请求都会很快(可能不到一秒) 如果你一次性开始300,他们会绊倒对方,其中一些可能需要几分钟才能完成。

有两个有趣的指标:

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

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