我在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会影响读/写性能?
答案 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慢查询,则意味着您自己的应用程序出了点问题。详细的日志记录可能真正有助于查询变慢的地方。
希望这会有所帮助。