性能问题(Nginx、NodeJs、Mysql)

Perfomance issue (Nginx, NodeJs, Mysql)

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

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

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

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

关于如何扩展有什么建议吗?

谢谢!

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

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

(这个数学不是很正确,但它说明了一点......)你不能有效地 运行 比你从 4+ 得到的速度更快1+1 "simultaneous" 连接。 (实际上,你可能可以,但不是 300!)

典型的基准测试试图找出有多少 "connections"(或其他)导致系统崩溃。那些 hard-to-read 屏幕截图说大约每秒 7 是极限。

我也对"simultaneous"这个词嗤之以鼻。唯一接近 "simultaneous"(在您的系统中)的是能够使用 4 个内核 "simultaneously"。其他所有指标都涉及资源共享。根据你所说的,...

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

有两个有趣的指标:

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

尝试 10 "simultaneous" 个连接并返回报告。尝试 7。尝试其他类似的小数字。