У меня есть сеть из нескольких «узлов» под управлением 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
Может быть, есть некоторые настройки тайм-аута, которые я мог бы использовать, чтобы остановить их хранение там?