poolSize достигает указанного размера, что приводит к резкому замедлению работы приложения - PullRequest
0 голосов
/ 28 января 2019

У меня запущено 3 набора реплик, и я также использую модуль кластера для форка 3 других процессов (количество созданных наборов реплик не имеет никакого отношения к числу разветвленных процессов).В методе mongoose 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.

Всякий раз, когда я перезагружаю веб-страницу несколько раз, доходит до того, что приложение резко замедляет загрузку (все это началось, когда я решил использовать набор реплик).Я подключился к mongdb через оболочку mongo и запускал db.serverStatus().connections каждый раз, когда я перезагружал страницу, поле current увеличивается (что ожидается при каждом новом подключении к mongodb), но проблема заключается в том, что текущее поле достигает указанногоpoolSize приложение загружается много времени.Я пытался вызывать db.disconnect() всякий раз, когда событие end отправляется на экспресс-объект req, который будет отключаться от mongodb (это работало, как и ожидалось, но, поскольку я использую поток, изменил вышеуказанное решение, чтобы закрыть открытые соединения, будет выброшено MongoError: Topology was destroyed. Выданная ошибка - не проблема, проблема в том, что приложение не может резко замедлиться, если текущее открытое соединение достигает указанного значения poolSize.

Я также попытался установить maxIdleTimeMS в строке подключения mongodb,и он не работает (возможно, mongoose не поддерживает его)

Примечание: всякий раз, когда я запускаю db.currentOps(), все активные соединения устанавливаются на false

1 Ответ

0 голосов
/ 28 января 2019

Я действительно выяснил причину этой проблемы.Так как я интенсивно использую потоки изменений в приложении, чем больше число потоков изменений, которые вы создаете, тем больше вам понадобится poolSize.Эта проблема также была обнаружена на плате CORE SERVER на платформе mongodb jira

DOCS-11270

NODE-1305

Сильное снижение производительности с потоками изменений Mongodb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...