MongoDB查询从Heroku的Node.js应用程序花费2-3秒

时间:2018-08-23 21:25:00

标签: node.js mongodb koa mongodb-atlas

我在MongoDB上遇到主要的性能问题。在少于100个文档的数据库中,简单的find()查询有时需要2,000-3,000毫秒才能完成。

我在MongoDB Atlas M10实例和我在Digital Ocean上具有4GB RAM的VM上设置的群集中都看到了这一点。当我在Heroku上重新启动Node.js应用程序时,查询在10到15分钟内表现良好(不到100毫秒),但是随后变慢了。

我是错误地连接到MongoDB还是从Node.js错误地查询?请在下面查看我的应用程序代码。还是在共享VM环境中缺少硬件资源?

任何帮助将不胜感激。我已经使用Explain查询和Mongo Shell完成了我所知道的所有疑难解答。

class MyException(Exception):
    pass

class A(object):
    def foo(self):
       """This class does foo

       Returns:
           Int: The number of foo.

       Raises:
            MyException - In case something happen
       """
       if True:
           raise MyException
       return 0

class B(object):
    def __init__(self):
        self._a = A()

    def bar(self):
        """This class does bar
        Returns:
            Int: number of bar
        Raises:
             MyException ????? Should this be here?
        """

        return self._a.foo()

更新

我正在使用MongoDB更改流和标准的“服务器已发送事件”为应用程序UI提供实时更新。我关闭了这些功能,现在MongoDB似乎再次表现良好。

是否已知MongoDB Change Streams会影响读/写性能?

2 个答案:

答案 0 :(得分:4)

变更流确实会影响服务器的性能。如this SO question中所述。

accepted answer中所述,

  

MongoDB的Node.js客户端中的default connection pool size为5。由于每个更改流游标都会打开一个新连接,因此连接池至少必须与该数目相同游标。

const mongoConnection = await MongoClient.connect(URL, {poolSize: 100});
     

(感谢MongoDB Inc.调查this issue。)

您需要增加池大小以恢复正常性能。

答案 1 :(得分:0)

我建议您做更多的日志工作。重新启动一段时间后,缓慢的查询可能会比您想象的要糟糕。

对于在普通计算机上运行的现代数据库/ Web应用程序,如果操作正确,则很难遇到性能问题。可能存在内存泄漏或其他未释放的资源,或者网络拥塞。

恕我直言,您可能想首先确定这是否是网络问题,然后通过在MongoDB上启用慢速查询日志并在查询开始和结束的地方登录代码,就可以实现此目的。

如果网络完全正常,而您没有看到MongoDB慢查询,则意味着您自己的应用程序出了点问题。详细的日志记录可能真正有助于查询变慢的地方。

希望这会有所帮助。