diff --git a/js/README.md b/js/README.md new file mode 100644 index 0000000..9aac9bc --- /dev/null +++ b/js/README.md @@ -0,0 +1,11 @@ +Попробовал проверить гипотезу утечки памяти в самой библиотеке при потере коннекта в базе. + +Схема - каждые 30 ms делаем запрос к БД, далее гасим инстанс базы и смотрим что будет по памяти (Mb) + +Результат и сразу после отключения и после полной потери коннекта в течении 3 минут (~6000 циклов): + +``` +RSS/Heap Total/Heap Used - start 59/18/11 | current 59/16/13 | max 109/69/43 +``` + +кажется криминала нет и в самой либе нет проблем с утечкой памяти. diff --git a/js/index.js b/js/index.js index fe85d2c..d3c8f4b 100644 --- a/js/index.js +++ b/js/index.js @@ -1,19 +1,70 @@ +const merge = require('lodash/merge'); const Haz = require('hazelcast-client'); let globalClient = null; -const clientConfig = new Haz.Config.ClientConfig(); +const clientBaseConfig = new Haz.Config.ClientConfig(); // И вот это - единственный корректный способ установки значений в объект // конфигурации, который затем отдается в коннект и корректно работает // добро пожаловать в мир ява-разработчиков от IBM ! -clientConfig.groupConfig.name = 'superadmin'; -clientConfig.groupConfig.password = 'dev-pass'; -clientConfig.networkConfig.addresses.push('127.0.0.1:5701'); -clientConfig.properties['hazelcast.client.invocation.timeout.millis'] = 2000; +// clientConfig.groupConfig.name = 'superadmin'; +// clientConfig.groupConfig.password = 'dev-pass'; +// clientConfig.networkConfig.addresses.push('127.0.0.1:5701'); +// clientConfig.properties['hazelcast.client.invocation.timeout.millis'] = 2000; + +const cfg = { + groupConfig: { + name: 'superadmin', + password: 'dev-pass', + }, + networkConfig: { + addresses: ['127.0.0.1:5701'] + }, + // properties: { + // 'hazelcast.client.heartbeat.interval': 1000, + // 'hazelcast.client.heartbeat.timeout': 10000, + // 'hazelcast.client.invocation.timeout.millis': 2222, + // } +}; + +const clientConfig = merge(clientBaseConfig, cfg); console.log(clientConfig); +const startMem = process.memoryUsage(); + +const us = { + rss: (startMem.rss / 1024 / 1024) | 0, + hTotal: (startMem.heapTotal / 1024 / 1024) | 0, + hUsed: (startMem.heapUsed / 1024 / 1024) | 0 +} + +const max = { + rss: 0, + hTotal: 0, + hUsed: 0 +}; + +function memoryUsage() { + const usage = process.memoryUsage(); + + const uc = { + rss: (usage.rss / 1024 / 1024) | 0, + hTotal: (usage.heapTotal / 1024 / 1024) | 0, + hUsed: (usage.heapUsed / 1024 / 1024) | 0 + } + + // save peak values + if (uc.rss > max.rss) max.rss = uc.rss + if (uc.hTotal > max.hTotal) max.hTotal = uc.hTotal + if (uc.hUsed > max.hUsed) max.hUsed = uc.hUsed + + const time = +Date.now(); + + process.stdout.write(`\r${time} RSS/Heap Total/Heap Used - start ${us.rss}/${us.hTotal}/${us.hUsed} | current ${uc.rss}/${uc.hTotal}/${uc.hUsed} | max ${max.rss}/${max.hTotal}/${max.hUsed}`); +} + Haz.Client.newHazelcastClient(clientConfig).then((client) => { console.log('Success!'); globalClient = client; @@ -26,14 +77,16 @@ Haz.Client.newHazelcastClient(clientConfig).then((client) => { setInterval(async () => { try { - console.log('Client >>>>>>'); + // console.log('Client >>>>>>'); + memoryUsage(); if (globalClient) { const map = await globalClient.getMap('qqz'); - console.log('value: ', await map.put('q', Date.now())); + const prev = await map.put('q', Date.now()); + // console.log('value: ', prev); } } catch (e) { - console.log('>>>>>>>>>>>>>>>>>', e) + // console.log('>>>>>>>>>>>>>>>>>', e) } -}, 5000); +}, 30); diff --git a/js/package.json b/js/package.json index 7ea7831..9fd5efb 100644 --- a/js/package.json +++ b/js/package.json @@ -4,6 +4,7 @@ "main": "index.js", "license": "MIT", "dependencies": { - "hazelcast-client": "3.12.4" + "hazelcast-client": "3.12.4", + "lodash": "latest" } } diff --git a/js/yarn.lock b/js/yarn.lock index e94303e..d993d31 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -16,6 +16,11 @@ hazelcast-client@3.12.4: long "4.0.0" safe-buffer "5.2.1" +lodash@latest: + version "4.17.21" + resolved "http://binary.moscow.alfaintra.net/artifactory/api/npm/npm/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + long@4.0.0: version "4.0.0" resolved "http://binary.moscow.alfaintra.net/artifactory/api/npm/npm/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"