Express/NodeJS + Mongoose App 服务器响应慢

Posted

技术标签:

【中文标题】Express/NodeJS + Mongoose App 服务器响应慢【英文标题】:Express/NodeJS + Mongoose App server response slow 【发布时间】:2019-01-18 23:34:56 【问题描述】:

问题

我有一个 Express (Node.JS) + MongoDB 应用程序,服务器响应加载时间平均为 4 - 7 秒(慢)。

据我了解,google pagespeed tools 的平均服务器响应时间低于 200 毫秒。

此应用程序从 mongoDB 异步获取数据,但到数据库的往返时间非常慢,每次调用平均约为 500 毫秒 - 1 秒。这些调用是简单的 findAll 调用,用于检索少于

上下文

猫鼬版本:4.13.14 数据库服务器的MongoDB版本是3.4.16 DB 服务器托管在 AWS / Oregon (us-west-1) 的 MongoDB Atlas M10 上 Web 服务器托管在 SFO1 (us-west-1) 中的 now.sh 已按照 MongoDB Atlas 的性能顾问的建议执行推荐的索引 在本地环境(本地服务器 + 本地 db)中数据获取非常好,因为在几毫秒内查询数据 可以在gist 中找到受影响页面的 Mongoose 日志

Mongo 服务器配置

蒙古阿特拉斯 M10 2GB 内存 10 GB 存储空间 100 IOPS 加密 自动扩展存储

尝试的解决方案:

我检查了我的数据库指标,它们看起来不错。也没有慢查询。这些是简单的 findAll 查询。 mongo atlas 上的性能顾问报告没有任何异常。

生产应用程序和数据库都托管在同一区域中。

我已经尝试通过运行 .lean() 优化查询的应用层(猫鼬)

问题:

我还应该从哪里改善数据库延迟?一个简单的查询怎么会花这么长时间?否则,为什么我的服务器响应时间在预期大约 200 毫秒时却需要 4 秒?

【问题讨论】:

您的数据库调用是否通过 ORM/驱动程序?例如猫鼬?这是我唯一能想到的 听起来有一些值得关注的领域,数据库为 @James 谢谢!我已经更新了问题 往返时间只有0.5 -> 1s?还有 2-3 秒等待数据库处理? 您可以启用调试模式并在此处发布日志吗?您还尝试过 mongo shell 直接连接到远程数据库吗?尝试 Mongo shell 时的响应时间是多少? 【参考方案1】:

您可以尝试在同一区域托管您的服务器和数据库。我认为在这种情况下网络会产生开销。如果服务器和数据库在同一个区域,它们在同一个网络上,这将大大减少延迟。有一个关于这个的aws图表

【讨论】:

我已经将应用服务器和数据库服务器移动到同一个区域,但没有发现太大的区别,所以这可能不是答案。感谢您的意见!【参考方案2】:

我在硕士学位期间开发的应用程序中添加了一些像您这样的问题。我添加了一个在线运行的 node.js api 以在课堂上展示它。我意识到每次我想在 api 中进行调用时,响应都需要花费大量时间。我意识到问题之一是由于防火墙的学校网络。此外,我放置服务器 heroku.com 的地方也有一些延迟。我所做的是使用 Redis (https://redis.io/) 来提高性能,由于请求是 http 而不是 https,heroku 也给了我一些问题。

在本地主机上运行应用程序和数据进行测试并查看性能。如果您没有任何问题,请尝试检查您的请求是否有任何问题,例如您托管节点服务器的地方。

让我知道这是否有帮助,或者您是否仍有问题,以便我可以尝试更好地帮助您。

【讨论】:

感谢您的意见!我已经检查了支持 Mongo 的防火墙,但最终没有。从我的角度来看,这个问题在不同的连接中仍然存在。我这边的 ssl 协议没有问题。可能不得不探索redis作为最后的手段。但是还是想解决这个核心问题。将尝试您建议的准系统测试。感谢您的意见!【参考方案3】:

我的 nodejs 代码使用相同的开发堆栈(mongodb,nodejs)曾经遇到过同样的问题,我遇到了来自 api 的延迟响应的麻烦,在花了很多时间之后,我发现我的服务器才是真正的罪魁祸首从 heroku 更改为 amazon aws EC2 实例,事情开始运行得很快,而且速度惊人,所以可能 您的网络服务器是罪魁祸首


为了确保 mongodb 不是罪魁祸首,编写一个 api 端点,您可以在其中返回一些 json 响应而不对数据库进行任何查询。

【讨论】:

设置没有进行数据库查询的 API 端点,TTFB 从 3.35 秒下降到 868 毫秒。应该是mongodb吧? 好的,我现在的建议是 - 试试 mlab mongodb link ,检查它是否有影响,因为它效果很好,它从未让我失望过,创建新帐户并免费使用mongodb 实例。还有一个问题,你是在本地运行代码吗?

以上是关于Express/NodeJS + Mongoose App 服务器响应慢的主要内容,如果未能解决你的问题,请参考以下文章

Express/NodeJS + Mongoose App 服务器响应慢

Express nodejs不使用带表单数据的mongoose插入数据

将元素推送到嵌套数组猫鼬 nodejs

TypeError.无法读取未定义的'$__'属性。无法读取未定义的'$__'属性 - Mongoose v5.^。

express + nodeJS上的404错误,在正常路线上

用 Electron 打开一个 Express 应用程序(Nodejs)