Express/NodeJS + Mongoose 应用程序服务器响应缓慢

12

问题

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

根据Google Pagespeed 工具的说法,平均服务器响应时间低于 200ms。

该应用程序异步从 MongoDB 获取数据,但每次调用往返数据库的时间非常慢,每个调用平均约为 500ms - 1s。这些调用是简单的 findAll 调用,以检索少于 100 条记录的数据。

上下文

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

Mongo 服务器配置

  • Mongo Atlas M10
  • 2GB 内存
  • 10 GB 存储
  • 100 IOPS
  • 加密
  • 自动扩展存储

尝试的解决方案:

我已经检查了我的数据库指标,它们看起来很好。也没有慢查询。这些都是简单的findAll查询。在mongo atlas上运行的性能顾问报告没有异常。

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

我已经尝试通过运行.lean()来优化查询的应用程序层(mongoose)

问题:

除此之外,我还应该在哪里寻找提高数据库延迟的方法?为什么一个简单的查询需要如此长的时间? 否则,为什么我的服务器响应时间需要达到4秒左右,而预期只有约200毫秒?


听起来有几个问题需要关注,对于少于100条记录的数据库而言,花费500-1秒的时间相当糟糕,因此您可能需要考虑索引。然而,除此之外,如果没有像托管位置、托管提供商、运行的托管级别(层)、物理硬件以及应用程序的分布等硬性细节,诊断问题就非常困难......等等。 - James
@James 谢谢!我已经更新了问题。 - clodal
1
你能开启调试模式并在这里发布日志吗?此外,您尝试过使用mongo shell直接连接远程数据库吗?当您尝试Mongo shell时响应时间是多少? - manishg
你的服务器配置是什么?[内存、核心、CPU等] - mehta-rohan
考虑到Mongo shell的速度很快,我猜想mongoose在延迟方面也会有类似的表现。您可以通过查看mongoose日志来确认这一点。由于信息不足,很难猜测问题的根本原因。请分享日志或示例代码,以便其他人可以查看。 - manishg
显示剩余9条评论
3个回答

2

嘿,你可以尝试将服务器和数据库托管在同一地区。我认为网络在这种情况下会产生额外的开销。如果服务器和数据库在同一地区,它们就在同一网络上,这将显著降低延迟。AWS 上有一个图表可以说明这个问题。 enter image description here


我已经将应用服务器和数据库服务器迁移到同一地区,但没有注意到太大的差异,所以这可能不是答案。感谢您的意见! - clodal

0
我曾经遇到和你一样的问题,在我的硕士学位项目中开发的一个应用程序中。为了在教室里展示它,我不得不在线运行一个node.js API。然后我意识到每次调用API时响应都需要很长时间。我发现其中一个问题是由于防火墙引起的学校网络问题。此外,我在heroku.com上放置服务器时也存在一些延迟问题。我的解决方案是使用Redis ( https://redis.io/ ) 来提高性能,同时我也发现heroku给我的请求带来了问题,因为它们是http而不是https。
尝试在本地主机上运行应用程序和数据,并检查性能。如果没有问题,请检查您托管节点服务器的位置是否有任何问题。
让我知道这是否有帮助,或者如果您仍然有问题,我会尽力帮助您解决。

谢谢您的回复!我已经检查了支持Mongo的防火墙,但他们那边没有这个问题。从我的端口来看,在不同的连接上问题仍然存在。对于我的端口,SSL协议没有问题。作为最后的选择,可能需要探索Redis。但仍然希望解决这个核心问题。会尝试你建议的基本测试。感谢您的输入! - clodal

0

我曾经在使用相同的开发堆栈(mongodb,nodejs)的nodejs代码中遇到过同样的问题,我遇到了API响应延迟的麻烦,花费了很多时间后我发现我的服务器是真正的罪魁祸首,然后我从Heroku转移到了Amazon AWS EC2实例,事情开始变得快速和惊人地快,所以可能你的Web服务器是罪魁祸首


为了确保 MongoDB 不是罪魁祸首,请编写一个 API 端点,在不对数据库进行任何查询的情况下,您可以返回一些 JSON 响应。


设置API终端点,其中没有进行任何数据库查询,TTFB从3.35秒降至868毫秒。可能是MongoDB吧? - clodal
好的,我现在的建议是尝试使用 mlab mongodb 链接,看看它是否有影响,因为这个工具非常好用,从未让我失望过。创建一个新账户并使用免费的mongodb实例。还有一个问题,你是在本地运行代码吗? - Muhammad Usman Ali Baloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接