Files
DLE/backend/utils/memoryMonitor.js
2026-03-01 22:03:48 +03:00

100 lines
3.3 KiB
JavaScript

/**
* Copyright (c) 2024-2026 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
const logger = require('./logger');
class MemoryMonitor {
constructor() {
this.monitoring = false;
this.interval = null;
this.lastMemoryUsage = null;
}
start(intervalMs = 60000) { // По умолчанию каждую минуту
if (this.monitoring) {
logger.warn('[MemoryMonitor] Мониторинг уже запущен');
return;
}
this.monitoring = true;
this.interval = setInterval(() => {
this.checkMemoryUsage();
}, intervalMs);
logger.info('[MemoryMonitor] Мониторинг памяти запущен');
}
stop() {
if (this.interval) {
clearInterval(this.interval);
this.interval = null;
}
this.monitoring = false;
logger.info('[MemoryMonitor] Мониторинг памяти остановлен');
}
checkMemoryUsage() {
const memUsage = process.memoryUsage();
const memUsageMB = {
rss: Math.round(memUsage.rss / 1024 / 1024),
heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),
heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
external: Math.round(memUsage.external / 1024 / 1024),
arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024)
};
// Проверяем рост памяти
if (this.lastMemoryUsage) {
const growth = {
rss: memUsageMB.rss - this.lastMemoryUsage.rss,
heapUsed: memUsageMB.heapUsed - this.lastMemoryUsage.heapUsed
};
// Логируем если есть значительный рост
if (growth.rss > 50 || growth.heapUsed > 20) {
logger.warn('[MemoryMonitor] Обнаружен рост памяти:', {
current: memUsageMB,
growth: growth
});
}
}
this.lastMemoryUsage = memUsageMB;
// Логируем только при значительном росте памяти
// logger.info('[MemoryMonitor] Использование памяти:', memUsageMB); // Убрано избыточное логирование
}
getMemoryUsage() {
const memUsage = process.memoryUsage();
return {
rss: Math.round(memUsage.rss / 1024 / 1024),
heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),
heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
external: Math.round(memUsage.external / 1024 / 1024),
arrayBuffers: Math.round(memUsage.arrayBuffers / 1024 / 1024)
};
}
// Проверка утечек в EventEmitter
checkEventEmitterLeaks() {
const eventEmitter = require('events');
const defaultMaxListeners = eventEmitter.defaultMaxListeners;
// logger.info('[MemoryMonitor] EventEmitter defaultMaxListeners:', defaultMaxListeners); // Убрано избыточное логирование
// Можно добавить дополнительную логику для проверки конкретных EventEmitter'ов
}
}
module.exports = new MemoryMonitor();