一段时间以来,我一直在使用带有MYSQL应用程序的NodeJS遇到模棱两可的性能问题,
简而言之,某些请求需要很长时间才能将响应返回给浏览器。
在某些情况下长达20秒
使用chrome devtools监视时序,下面的“时间”列中的数据显示了对同一端点的响应时间之间的显着差异。
为了进一步研究该问题,我在端点处理程序之一中设置了以下代码,以监视控制台中的延迟。在此示例中,我在本地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流程管理器来管理服务器上的应用程序,这是应用程序指标分析的另一个屏幕截图。
如果有人可以指出我还能在哪里找到并解决该问题,我将不胜感激。
提前致谢。
最佳答案
我怀疑nodejs应用程序正在运行一些长时间的同步操作,从而使事件循环停止。这可以从PM2屏幕截图中相对较大的事件循环延迟中看出。
发生这种情况的原因可能是:
该代码使用以下命令运行耗时的计算操作
一些用于访问外部资源的同步功能,例如fs.readFileSync
这可能是在处理其他并行请求或与您要调试的请求无关的计时器时。
一个nodejs应用程序在一个线程中运行,它依赖于所有代码路径快速返回到事件循环,以便它可以处理下一个事件。
我建议对应用程序(https://nodejs.org/en/docs/guides/simple-profiling/)进行性能分析并寻找运行时间最长的功能,并专注于耗时较长的功能。
关于javascript - 针对AWS性能问题运行的Node.JS应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58146306/