poolSize达到指定的大小,这将导致应用程序急剧减速

时间:2019-01-28 16:49:05

标签: node.js mongodb express mongoose

我有3个正在运行的副本集,并且我还在使用集群模块分叉3个其他进程(创建的副本集数量,与派生的进程数量无关)。在猫鼬connect方法中,我设置了以下选项

"use strict";

const mongoose = require("mongoose");
const config   = require("../config.js");
// Set up mongoose connection

mongoose.connect( config.mongoURI, {

    useNewUrlParser: true,

    // silent deprecation warning
    useCreateIndex: true,

    // auto reconnect to db
    autoReconnect: true,

    // turn off buffering, and fail immidiately mongodb disconnects
    bufferMaxEntries: 0,
    bufferCommands: false,

    keepAlive: true, 
    keepAliveInitialDelay: 450000,

    // number of socket connection to keep open
    poolSize: 1000
}, error => {
    if (error) {
        console.log(error);
    }
});


module.exports = mongoose.connection;

以上代码位于名为db.js的文件中。在启动快速应用程序的server.js中,我需要db.js

每当我多次重新加载网页时,都达到了某个目的,即应用程序的加载速度大大降低了(所有这些都在我决定使用副本集时开始发生)。我通过mongo shell连接到mongdb并在每次重新加载页面db.serverStatus().connections时都运行current(这是每次对mongodb进行新连接时都期望的值),但是问题是每当当前字段到达指定的poolSize时,应用程序需要花费很多时间来加载。每当尝试在db.disconnect()表达对象上发出end事件时,我都尝试调用req,它将与mongodb断开连接(这按预期工作,但是由于我使用流,因此上述解决方案将关闭打开的连接将引发MongoError: Topology was destroyed。引发的错误不是问题,问题在于如果当前打开的连接达到指定的poolSize,则阻止应用程序急剧降低速度。

我还尝试在mongodb连接字符串中设置maxIdleTimeMS,但它不起作用(也许mongoose不支持它)

注意::每当我运行db.currentOps()时,所有活动连接都设置为false

1 个答案:

答案 0 :(得分:0)

我实际上已经找到了造成此问题的原因。由于我在应用程序中大量使用更改流,因此创建的更改流数量越多,所需的poolSize数量也就越高。在mongodb jira平台的CORE SERVER板上也已经报告了此问题

DOCS-11270

NODE-1305

Severe Performance Drop with Mongodb change streams