首页 > 解决方案 > 在 AWS 上运行的 Node.JS 应用程序性能问题

问题描述

一段时间以来,我一直在使用带有 MYSQL 应用程序的 NodeJS 遇到模棱两可的性能问题,简而言之,某些请求需要很长时间才能向浏览器返回响应。 在某些情况下长达 20 秒

使用 chrome devtools 监控时间,下面 Time 列中的数据显示了对同一端点的响应时间之间的显着差异。

在此处输入图像描述

为了进一步调查此问题,我将以下代码设置为端点处理程序之一以监视控制台中的延迟,在此示例中,我在本地 PC 上运行应用程序,并将其连接到服务器上的远程生产数据库.

async function getSomething(param) {
  const start = new Date().getTime();
  const something = await Model.where({ field: param }).fetch();
  const end = new Date().getTime();
  console.log('delay: ', end - start, 'ms');
  return something;
}

我对一个端点执行了十个请求,下面的数据显示了记录到控制台的延迟 VS 将数据返回到浏览器所需的时间。

数字以毫秒为单位 在此处输入图像描述

如第二行和最后一行所示,一些响应以几乎没有或非常小的延迟返回浏览器,而其他一些请求显示从数据库中获取数据所需的时间和它需要的时间之间存在重大差异发送到浏览器。这在大多数情况下都会发生。在其他一些情况下,仅从数据库中获取数据需要很长时间,如第 3 行所示。

差异对我来说是任意的,这使得很难找到问题的模式。


这是来自我的亚马逊控制台的应用程序实例指标的屏幕截图,它可能会帮助某人发现可能有帮助的东西。

在此处输入图像描述


此外,我正在使用 PM2 进程管理器来管理服务器上的应用程序,这是应用程序指标分析的另一个屏幕截图。

在此处输入图像描述

如果有人能指出我在哪里可以找到并解决问题,我将不胜感激。

提前致谢。

标签: javascriptnode.jsamazon-web-servicesnetworkingpm2

解决方案


我怀疑 nodejs 应用程序正在运行一些长时间的同步操作,这些操作会停止事件循环。这可以从 PM2 截图中比较大的事件循环延迟中看出。

这可能是由于:

  • 该代码正在运行耗时的计算操作,使用
  • 一些用于访问外部资源的同步功能,例如 fs.readFileSync

这可能是在处理与您正在调试的请求无关的其他并行请求或计时器时。

nodejs 应用程序在单个线程中运行,它依赖于所有代码路径快速返回到事件循环,以便它可以处理下一个事件。

我建议分析应用程序(https://nodejs.org/en/docs/guides/simple-profiling/)并寻找运行时间最长的函数,并专注于需要很长时间的函数。


推荐阅读