Отслеживание утечки памяти, связанной с Meteor и несколькими DDP-соединениями - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть сеть из нескольких «узлов» под управлением Meteor v1.5.4.2 (из-за зависимостей). Предполагается, что каждый из этих узлов может обмениваться данными с другими для получения статистики и т. Д. Это делается с помощью серверной части Meteors ddp-client на узлах, которые должны получать информацию от других.

Это, казалось бы, сработало хорошо, но когда мы начали провоцировать это большим количеством изменений в сети (то есть много подключений приходят и уходят), память постепенно накапливается, пока она не замерзнет и не провалится живот. У меня ограниченный опыт по устранению утечек памяти, но, посмотрев на снимки кучи, я обнаружил, что существует скопление объектов под названием «Соединение» (вставлено ниже). Под строками я также нахожу множество строк, содержащих сертификаты и CRL, используемые в соединении DDP, что заставляет меня поверить, что в моем коде есть проблема, связанная с обработкой соединения. Я попытался перечислить основные моменты, приведенные ниже, удалив множество незначительных логических моментов.

Я немного растерялся, если подойти к этому вопросу дальше, поэтому любые предложения, мысли или идеи будут приветствоваться.

Заранее спасибо.

Вот сжатый анализ того, как он подключен

if(Meteor.isServer) {
    connectionHandler = new DDPConnectionHandler();
    Meteor.setInterval( () => connectionHandler.checkNodeConnections(), 5000);
}
export const DDPConnectionHandler = function() {
    this.connections = [];

    this.checkNodeConnections = () => {
        // Logic to add or remove the node connections in this.connections
        // Looping pr. node to handle
        const node = {...} // Details of the node to add/remove

        // Add new conncetion
        this.connections.push( new DDPConnection(node) );

        // Remove connection
        const index = currentConnections.indexOf(node.id);
        this.connections[index].disconnect();
        this.connections.splice(index, 1);
    };

}
export const DDPConnection = function(node) {
    let self = this;

    // setting up variables to use, pw, user, url ... etc. 

    this.connection = DDP.connect(url, { /* certs etc. for SSL */ });

    this.connection.call("login", {/* login details */}, (error, result) => {
        if( !error ) {
            // Wrap in timeout to space out the stats calls
            Meteor.setTimeout( () => { self.initNodeStats(); }, randomNumber );
        } else { /* No luck */ }
    });

    this.disconnect = () => {
        this.connection.disconnect(); // also tried with .close()
    };

    this.subscribe = (collection) => {
        // function to fetch other data
    };

    // Initialize and start recieving default basis ndoestats from current external nde
    this.initNodeStats = () => { this.getStats(); };

    this.getStats = () => {
        self.connection.call('getStats', {}, (error, result) => {
            if( error ) { /* No luck */
            } else if ( result ) { /* Pass data to handlers */ }
        });
    }

}
Connection
    _stream::ClientStream
    __proto__::Object
    _outstandingMethodBlocks::Array
    __flushBufferedWrites::()
    map::system / Map
    _methodInvokers::Object
    properties::(object properties)[]
    _bufferedWritesFlushAt::system / Oddball
    _bufferedWritesFlushHandle::system / Oddball
    _lastSessionId::system / Oddball
    _retryMigrate::system / Oddball
    _userId::system / Oddball
    _version::system / Oddball
    _versionSuggestion::system / Oddball
    onReconnect::system / Oddball
    _supportedDDPVersions::Array
    _userIdDeps::Tracker.Dependency
    _bufferedWrites::Object
    _documentsWrittenByStub::Object
    _methodHandlers::Object
    _methodsBlockingQuiescence::Object
    _serverDocuments::Object
    _stores::Object
    _subsBeingRevived::Object
    _subscriptions::Object
    _updatesForUnknownStores::Object
    _afterUpdateCallbacks::Array
    _messagesBufferedUntilQuiescence::Array
    _resetStores::system / Oddball

Обновление, после копания некоторыхподробнее.

Кажется, я получаю наращивание «методов» в атрибуте «_outstandingMethodBlocks» на объектах Connection. Что определено в строке 129 здесь: https://github.com/meteor/meteor/blob/release-1.5.4.2/packages/ddp-client/livedata_connection.js#L129

Может быть, есть некоторые настройки тайм-аута, которые я мог бы использовать, чтобы остановить их хранение там?

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