xypriss 1.2.4 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -3
- package/dist/cjs/mods/security/src/components/cache/index.js +1 -1
- package/dist/cjs/shared/logger/Logger.js +2 -0
- package/dist/cjs/shared/logger/Logger.js.map +1 -1
- package/dist/cjs/src/cluster/bun-cluster-manager.js +1567 -0
- package/dist/cjs/src/cluster/bun-cluster-manager.js.map +1 -0
- package/dist/cjs/src/cluster/cluster-manager.js +1 -1
- package/dist/cjs/src/cluster/cluster-manager.js.map +1 -1
- package/dist/cjs/src/cluster/index.js +25 -6
- package/dist/cjs/src/cluster/index.js.map +1 -1
- package/dist/cjs/src/cluster/memory-manager.js +486 -0
- package/dist/cjs/src/cluster/memory-manager.js.map +1 -0
- package/dist/cjs/src/cluster/modules/BunIPCManager.js +603 -0
- package/dist/cjs/src/cluster/modules/BunIPCManager.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ClusterFactory.js +22 -1
- package/dist/cjs/src/cluster/modules/ClusterFactory.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CpuMonitor.js +658 -0
- package/dist/cjs/src/cluster/modules/CpuMonitor.js.map +1 -0
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +257 -0
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -0
- package/dist/cjs/src/cluster/modules/ProcessMonitor.js +513 -0
- package/dist/cjs/src/cluster/modules/ProcessMonitor.js.map +1 -0
- package/dist/cjs/src/plugins/server-maintenance-plugin.js +79 -14
- package/dist/cjs/src/plugins/server-maintenance-plugin.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +64 -43
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
- package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/cjs/src/server/const/Cluster.config.js +174 -31
- package/dist/cjs/src/server/const/Cluster.config.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +11 -2
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/utils/PortManager.js +26 -15
- package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +1 -1
- package/dist/esm/shared/logger/Logger.js +2 -0
- package/dist/esm/shared/logger/Logger.js.map +1 -1
- package/dist/esm/src/cluster/bun-cluster-manager.js +1565 -0
- package/dist/esm/src/cluster/bun-cluster-manager.js.map +1 -0
- package/dist/esm/src/cluster/cluster-manager.js +1 -1
- package/dist/esm/src/cluster/cluster-manager.js.map +1 -1
- package/dist/esm/src/cluster/index.js +25 -6
- package/dist/esm/src/cluster/index.js.map +1 -1
- package/dist/esm/src/cluster/memory-manager.js +484 -0
- package/dist/esm/src/cluster/memory-manager.js.map +1 -0
- package/dist/esm/src/cluster/modules/BunIPCManager.js +601 -0
- package/dist/esm/src/cluster/modules/BunIPCManager.js.map +1 -0
- package/dist/esm/src/cluster/modules/ClusterFactory.js +22 -1
- package/dist/esm/src/cluster/modules/ClusterFactory.js.map +1 -1
- package/dist/esm/src/cluster/modules/CpuMonitor.js +656 -0
- package/dist/esm/src/cluster/modules/CpuMonitor.js.map +1 -0
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +255 -0
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -0
- package/dist/esm/src/cluster/modules/ProcessMonitor.js +511 -0
- package/dist/esm/src/cluster/modules/ProcessMonitor.js.map +1 -0
- package/dist/esm/src/plugins/server-maintenance-plugin.js +79 -14
- package/dist/esm/src/plugins/server-maintenance-plugin.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +64 -43
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +226 -10
- package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js.map +1 -1
- package/dist/esm/src/server/const/Cluster.config.js +174 -31
- package/dist/esm/src/server/const/Cluster.config.js.map +1 -1
- package/dist/esm/src/server/const/default.js +11 -2
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/utils/PortManager.js +26 -15
- package/dist/esm/src/server/utils/PortManager.js.map +1 -1
- package/dist/index.d.ts +90 -2
- package/package.json +6 -1
- package/dist/cjs/src/plugins/modules/network/index.js +0 -120
- package/dist/cjs/src/plugins/modules/network/index.js.map +0 -1
- package/dist/cjs/src/server/plugins/PluginEngine.js +0 -378
- package/dist/cjs/src/server/plugins/PluginEngine.js.map +0 -1
- package/dist/cjs/src/server/plugins/PluginRegistry.js +0 -339
- package/dist/cjs/src/server/plugins/PluginRegistry.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js +0 -591
- package/dist/cjs/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js +0 -413
- package/dist/cjs/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js +0 -843
- package/dist/cjs/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/CachePlugin.js +0 -1975
- package/dist/cjs/src/server/plugins/core/CachePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/PerformancePlugin.js +0 -894
- package/dist/cjs/src/server/plugins/core/PerformancePlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/core/SecurityPlugin.js +0 -799
- package/dist/cjs/src/server/plugins/core/SecurityPlugin.js.map +0 -1
- package/dist/cjs/src/server/plugins/types/PluginTypes.js +0 -47
- package/dist/cjs/src/server/plugins/types/PluginTypes.js.map +0 -1
- package/dist/esm/src/plugins/modules/network/index.js +0 -109
- package/dist/esm/src/plugins/modules/network/index.js.map +0 -1
- package/dist/esm/src/server/plugins/PluginEngine.js +0 -376
- package/dist/esm/src/server/plugins/PluginEngine.js.map +0 -1
- package/dist/esm/src/server/plugins/PluginRegistry.js +0 -337
- package/dist/esm/src/server/plugins/PluginRegistry.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js +0 -589
- package/dist/esm/src/server/plugins/builtin/JWTAuthPlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js +0 -411
- package/dist/esm/src/server/plugins/builtin/ResponseTimePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js +0 -841
- package/dist/esm/src/server/plugins/builtin/SmartCachePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/CachePlugin.js +0 -1973
- package/dist/esm/src/server/plugins/core/CachePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/PerformancePlugin.js +0 -872
- package/dist/esm/src/server/plugins/core/PerformancePlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/core/SecurityPlugin.js +0 -797
- package/dist/esm/src/server/plugins/core/SecurityPlugin.js.map +0 -1
- package/dist/esm/src/server/plugins/types/PluginTypes.js +0 -47
- package/dist/esm/src/server/plugins/types/PluginTypes.js.map +0 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var events = require('events');
|
|
4
|
+
var Logger = require('../../shared/logger/Logger.js');
|
|
5
|
+
var ProcessMonitor = require('./modules/ProcessMonitor.js');
|
|
6
|
+
var CrossPlatformMemory = require('./modules/CrossPlatformMemory.js');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Memory management utilities for cluster operations
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Advanced memory management for cluster operations using ProcessMonitor
|
|
13
|
+
*/
|
|
14
|
+
class MemoryManager extends events.EventEmitter {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
super();
|
|
17
|
+
this.memoryHistory = new Map();
|
|
18
|
+
this.lastGCHint = new Map();
|
|
19
|
+
this.isLowMemoryMode = false;
|
|
20
|
+
this.config = config || {};
|
|
21
|
+
this.processMonitor = new ProcessMonitor.ProcessMonitor();
|
|
22
|
+
this.crossPlatformMemory = new CrossPlatformMemory.CrossPlatformMemory(true); // Enable fallback
|
|
23
|
+
this.isLowMemoryMode =
|
|
24
|
+
config?.performanceOptimization?.lowMemoryMode || false;
|
|
25
|
+
// Log which memory detection method is being used
|
|
26
|
+
if (this.crossPlatformMemory.isCliAvailable()) {
|
|
27
|
+
Logger.logger.info("cluster", "MemoryManager initialized with CrossPlatformMemory CLI");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
Logger.logger.info("cluster", "MemoryManager initialized with ProcessMonitor fallback");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start memory monitoring
|
|
35
|
+
*/
|
|
36
|
+
startMonitoring() {
|
|
37
|
+
const interval = this.config?.memoryManagement?.memoryCheckInterval || 30000;
|
|
38
|
+
Logger.logger.info("cluster", `Starting memory monitoring (interval: ${interval}ms)`);
|
|
39
|
+
this.monitoringInterval = setInterval(async () => {
|
|
40
|
+
await this.checkMemoryUsage();
|
|
41
|
+
}, interval);
|
|
42
|
+
// Initial check
|
|
43
|
+
this.checkMemoryUsage();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop memory monitoring
|
|
47
|
+
*/
|
|
48
|
+
stopMonitoring() {
|
|
49
|
+
if (this.monitoringInterval) {
|
|
50
|
+
clearInterval(this.monitoringInterval);
|
|
51
|
+
this.monitoringInterval = undefined;
|
|
52
|
+
Logger.logger.info("cluster", "Memory monitoring stopped");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get system memory statistics using CrossPlatformMemory CLI with ProcessMonitor fallback
|
|
57
|
+
*/
|
|
58
|
+
async getSystemMemoryStats() {
|
|
59
|
+
try {
|
|
60
|
+
// Try CrossPlatformMemory CLI first for most accurate results
|
|
61
|
+
if (this.crossPlatformMemory.isCliAvailable()) {
|
|
62
|
+
const memInfo = await this.crossPlatformMemory.getMemoryInfo();
|
|
63
|
+
return {
|
|
64
|
+
totalMemory: memInfo.totalMemory,
|
|
65
|
+
usedMemory: memInfo.usedMemory,
|
|
66
|
+
freeMemory: memInfo.availableMemory, // Use available memory for applications
|
|
67
|
+
usagePercentage: memInfo.usagePercentage,
|
|
68
|
+
swapUsed: memInfo.swapUsed,
|
|
69
|
+
swapTotal: memInfo.swapTotal,
|
|
70
|
+
swapPercentage: memInfo.swapTotal > 0
|
|
71
|
+
? (memInfo.swapUsed / memInfo.swapTotal) * 100
|
|
72
|
+
: 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Fallback to ProcessMonitor
|
|
76
|
+
this.systemStats = await this.processMonitor.getSystemStats();
|
|
77
|
+
const { memory, swap } = this.systemStats;
|
|
78
|
+
return {
|
|
79
|
+
totalMemory: memory.total,
|
|
80
|
+
usedMemory: memory.used,
|
|
81
|
+
freeMemory: memory.available || memory.free, // Use available memory when possible
|
|
82
|
+
usagePercentage: memory.usagePercentage,
|
|
83
|
+
swapUsed: swap.used,
|
|
84
|
+
swapTotal: swap.total,
|
|
85
|
+
swapPercentage: swap.usagePercentage,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
Logger.logger.error("cluster", "Failed to get system memory stats from both CLI and ProcessMonitor:", error);
|
|
90
|
+
// Final fallback to basic OS stats
|
|
91
|
+
const os = require("os");
|
|
92
|
+
const totalMemory = os.totalmem();
|
|
93
|
+
const freeMemory = os.freemem();
|
|
94
|
+
const usedMemory = totalMemory - freeMemory;
|
|
95
|
+
const usagePercentage = (usedMemory / totalMemory) * 100;
|
|
96
|
+
return {
|
|
97
|
+
totalMemory,
|
|
98
|
+
usedMemory,
|
|
99
|
+
freeMemory,
|
|
100
|
+
usagePercentage,
|
|
101
|
+
swapUsed: 0,
|
|
102
|
+
swapTotal: 0,
|
|
103
|
+
swapPercentage: 0,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get swap memory information using platform-specific methods
|
|
109
|
+
*/
|
|
110
|
+
getSwapMemoryInfo() {
|
|
111
|
+
try {
|
|
112
|
+
if (process.platform === "linux") {
|
|
113
|
+
return this.getLinuxSwapInfo();
|
|
114
|
+
}
|
|
115
|
+
else if (process.platform === "darwin") {
|
|
116
|
+
return this.getMacOSSwapInfo();
|
|
117
|
+
}
|
|
118
|
+
else if (process.platform === "win32") {
|
|
119
|
+
return this.getWindowsSwapInfo();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
return { swapUsed: 0, swapTotal: 0, swapPercentage: 0 };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
Logger.logger.warn("cluster", "Failed to get swap memory info:", error);
|
|
127
|
+
return { swapUsed: 0, swapTotal: 0, swapPercentage: 0 };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get swap information on Linux
|
|
132
|
+
*/
|
|
133
|
+
getLinuxSwapInfo() {
|
|
134
|
+
try {
|
|
135
|
+
const fs = require("fs");
|
|
136
|
+
const meminfo = fs.readFileSync("/proc/meminfo", "utf8");
|
|
137
|
+
const swapTotalMatch = meminfo.match(/SwapTotal:\s+(\d+)\s+kB/);
|
|
138
|
+
const swapFreeMatch = meminfo.match(/SwapFree:\s+(\d+)\s+kB/);
|
|
139
|
+
const swapTotal = swapTotalMatch
|
|
140
|
+
? parseInt(swapTotalMatch[1]) * 1024
|
|
141
|
+
: 0;
|
|
142
|
+
const swapFree = swapFreeMatch
|
|
143
|
+
? parseInt(swapFreeMatch[1]) * 1024
|
|
144
|
+
: 0;
|
|
145
|
+
const swapUsed = swapTotal - swapFree;
|
|
146
|
+
const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
|
|
147
|
+
return { swapUsed, swapTotal, swapPercentage };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
throw new Error(`Failed to get Linux swap info: ${error}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get swap information on macOS
|
|
155
|
+
*/
|
|
156
|
+
getMacOSSwapInfo() {
|
|
157
|
+
try {
|
|
158
|
+
const { execSync } = require("child_process");
|
|
159
|
+
const swapUsage = execSync("sysctl vm.swapusage", {
|
|
160
|
+
encoding: "utf8",
|
|
161
|
+
});
|
|
162
|
+
// Parse output like: vm.swapusage: total = 2048.00M used = 617.75M free = 1430.25M (encrypted)
|
|
163
|
+
const totalMatch = swapUsage.match(/total = ([\d.]+)([MG])/);
|
|
164
|
+
const usedMatch = swapUsage.match(/used = ([\d.]+)([MG])/);
|
|
165
|
+
let swapTotal = 0;
|
|
166
|
+
let swapUsed = 0;
|
|
167
|
+
if (totalMatch) {
|
|
168
|
+
const value = parseFloat(totalMatch[1]);
|
|
169
|
+
const unit = totalMatch[2];
|
|
170
|
+
swapTotal =
|
|
171
|
+
unit === "G"
|
|
172
|
+
? value * 1024 * 1024 * 1024
|
|
173
|
+
: value * 1024 * 1024;
|
|
174
|
+
}
|
|
175
|
+
if (usedMatch) {
|
|
176
|
+
const value = parseFloat(usedMatch[1]);
|
|
177
|
+
const unit = usedMatch[2];
|
|
178
|
+
swapUsed =
|
|
179
|
+
unit === "G"
|
|
180
|
+
? value * 1024 * 1024 * 1024
|
|
181
|
+
: value * 1024 * 1024;
|
|
182
|
+
}
|
|
183
|
+
const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
|
|
184
|
+
return { swapUsed, swapTotal, swapPercentage };
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
throw new Error(`Failed to get macOS swap info: ${error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get swap information on Windows
|
|
192
|
+
*/
|
|
193
|
+
getWindowsSwapInfo() {
|
|
194
|
+
try {
|
|
195
|
+
const { execSync } = require("child_process");
|
|
196
|
+
// Use wmic to get page file information
|
|
197
|
+
const pageFileInfo = execSync("wmic pagefile get Size,Usage /format:csv", { encoding: "utf8" });
|
|
198
|
+
const lines = pageFileInfo
|
|
199
|
+
.split("\n")
|
|
200
|
+
.filter((line) => line.trim() && !line.includes("Node"));
|
|
201
|
+
let totalSize = 0;
|
|
202
|
+
let totalUsage = 0;
|
|
203
|
+
for (const line of lines) {
|
|
204
|
+
const parts = line.split(",");
|
|
205
|
+
if (parts.length >= 3) {
|
|
206
|
+
const size = parseInt(parts[1]) || 0;
|
|
207
|
+
const usage = parseInt(parts[2]) || 0;
|
|
208
|
+
totalSize += size;
|
|
209
|
+
totalUsage += usage;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const swapTotal = totalSize * 1024 * 1024; // Convert MB to bytes
|
|
213
|
+
const swapUsed = totalUsage * 1024 * 1024;
|
|
214
|
+
const swapPercentage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
|
|
215
|
+
return { swapUsed, swapTotal, swapPercentage };
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw new Error(`Failed to get Windows swap info: ${error}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get worker memory statistics using actual process monitoring
|
|
223
|
+
*/
|
|
224
|
+
async getWorkerMemoryStats(workerId, pid) {
|
|
225
|
+
try {
|
|
226
|
+
const processStats = await this.processMonitor.getProcessStats(pid);
|
|
227
|
+
return {
|
|
228
|
+
workerId,
|
|
229
|
+
pid,
|
|
230
|
+
memoryUsage: {
|
|
231
|
+
rss: processStats.memory.rss,
|
|
232
|
+
heapTotal: processStats.memory.heapTotal,
|
|
233
|
+
heapUsed: processStats.memory.heapUsed,
|
|
234
|
+
external: processStats.memory.external,
|
|
235
|
+
arrayBuffers: processStats.memory.arrayBuffers,
|
|
236
|
+
},
|
|
237
|
+
cpuUsage: processStats.cpu.usage,
|
|
238
|
+
uptime: processStats.uptime,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
Logger.logger.error("cluster", `Failed to get memory stats for worker ${workerId} (PID: ${pid}):`, error);
|
|
243
|
+
// Return minimal stats on error
|
|
244
|
+
return {
|
|
245
|
+
workerId,
|
|
246
|
+
pid,
|
|
247
|
+
memoryUsage: {
|
|
248
|
+
rss: 0,
|
|
249
|
+
heapTotal: 0,
|
|
250
|
+
heapUsed: 0,
|
|
251
|
+
external: 0,
|
|
252
|
+
arrayBuffers: 0,
|
|
253
|
+
},
|
|
254
|
+
cpuUsage: 0,
|
|
255
|
+
uptime: 0,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Check if memory usage is within limits
|
|
261
|
+
*/
|
|
262
|
+
checkMemoryLimits(workerId, memoryUsage) {
|
|
263
|
+
const maxMemory = this.parseMemoryString(this.config?.maxMemoryPerWorker || "1GB");
|
|
264
|
+
const warningThreshold = this.config?.memoryManagement?.memoryWarningThreshold || 80;
|
|
265
|
+
const criticalThreshold = this.config?.memoryManagement?.memoryCriticalThreshold || 95;
|
|
266
|
+
const usagePercentage = (memoryUsage / maxMemory) * 100;
|
|
267
|
+
if (usagePercentage >= criticalThreshold) {
|
|
268
|
+
return {
|
|
269
|
+
withinLimits: false,
|
|
270
|
+
action: this.config?.enforcement?.enforceHardLimits
|
|
271
|
+
? "restart"
|
|
272
|
+
: "scale_down",
|
|
273
|
+
message: `Worker ${workerId} memory usage critical: ${usagePercentage.toFixed(1)}%`,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
if (usagePercentage >= warningThreshold) {
|
|
277
|
+
return {
|
|
278
|
+
withinLimits: true,
|
|
279
|
+
action: "warning",
|
|
280
|
+
message: `Worker ${workerId} memory usage high: ${usagePercentage.toFixed(1)}%`,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
withinLimits: true,
|
|
285
|
+
action: "none",
|
|
286
|
+
message: `Worker ${workerId} memory usage normal: ${usagePercentage.toFixed(1)}%`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Detect memory leaks in workers
|
|
291
|
+
*/
|
|
292
|
+
detectMemoryLeak(workerId, memoryUsage) {
|
|
293
|
+
if (!this.config?.memoryManagement?.memoryLeakDetection) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
const history = this.memoryHistory.get(workerId) || [];
|
|
297
|
+
history.push(memoryUsage);
|
|
298
|
+
// Keep only last 10 measurements
|
|
299
|
+
if (history.length > 10) {
|
|
300
|
+
history.shift();
|
|
301
|
+
}
|
|
302
|
+
this.memoryHistory.set(workerId, history);
|
|
303
|
+
// Detect consistent memory growth
|
|
304
|
+
if (history.length >= 5) {
|
|
305
|
+
const trend = this.calculateMemoryTrend(history);
|
|
306
|
+
const leakThreshold = 0.1; // 10% consistent growth
|
|
307
|
+
if (trend > leakThreshold) {
|
|
308
|
+
Logger.logger.warn("cluster", `Memory leak detected in worker ${workerId}`);
|
|
309
|
+
this.emitMemoryAlert({
|
|
310
|
+
type: "leak_detected",
|
|
311
|
+
workerId,
|
|
312
|
+
message: `Memory leak detected in worker ${workerId}`,
|
|
313
|
+
memoryUsage,
|
|
314
|
+
threshold: leakThreshold,
|
|
315
|
+
timestamp: Date.now(),
|
|
316
|
+
action: "restart_worker",
|
|
317
|
+
});
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Suggest garbage collection for worker
|
|
325
|
+
*/
|
|
326
|
+
suggestGarbageCollection(workerId) {
|
|
327
|
+
if (!this.config?.memoryManagement?.garbageCollectionHint) {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
const lastGC = this.lastGCHint.get(workerId) || 0;
|
|
331
|
+
const gcCooldown = 60000; // 1 minute cooldown
|
|
332
|
+
if (Date.now() - lastGC > gcCooldown) {
|
|
333
|
+
this.lastGCHint.set(workerId, Date.now());
|
|
334
|
+
Logger.logger.debug("cluster", `Suggesting garbage collection for worker ${workerId}`);
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get memory optimization recommendations
|
|
341
|
+
*/
|
|
342
|
+
async getMemoryOptimizationRecommendations() {
|
|
343
|
+
const systemStats = await this.getSystemMemoryStats();
|
|
344
|
+
const recommendations = [];
|
|
345
|
+
if (systemStats.usagePercentage > 85) {
|
|
346
|
+
recommendations.push("System memory usage is high (>85%). Consider reducing worker count.");
|
|
347
|
+
}
|
|
348
|
+
if (systemStats.usagePercentage > 95) {
|
|
349
|
+
recommendations.push("Critical memory usage! Enable low memory mode immediately.");
|
|
350
|
+
}
|
|
351
|
+
if (!this.config?.performanceOptimization?.lowMemoryMode &&
|
|
352
|
+
systemStats.usagePercentage > 70) {
|
|
353
|
+
recommendations.push("Consider enabling low memory mode for better resource utilization.");
|
|
354
|
+
}
|
|
355
|
+
if (!this.config?.memoryManagement?.memoryLeakDetection) {
|
|
356
|
+
recommendations.push("Enable memory leak detection for better stability.");
|
|
357
|
+
}
|
|
358
|
+
const maxWorkers = await this.calculateOptimalWorkerCount(systemStats);
|
|
359
|
+
return {
|
|
360
|
+
recommendations,
|
|
361
|
+
canEnableLowMemoryMode: systemStats.usagePercentage > 70,
|
|
362
|
+
suggestedWorkerCount: maxWorkers,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Calculate optimal worker count based on available memory
|
|
367
|
+
*/
|
|
368
|
+
async calculateOptimalWorkerCount(systemStats) {
|
|
369
|
+
const stats = systemStats || (await this.getSystemMemoryStats());
|
|
370
|
+
const maxMemoryPerWorker = this.parseMemoryString(this.config?.maxMemoryPerWorker || "512MB");
|
|
371
|
+
const reservedMemory = this.parseMemoryString(this.config?.memoryManagement?.memoryReservation || "1GB");
|
|
372
|
+
const availableMemory = stats.totalMemory - reservedMemory;
|
|
373
|
+
const maxWorkers = Math.floor(availableMemory / maxMemoryPerWorker);
|
|
374
|
+
// Ensure at least 1 worker, but respect system limits
|
|
375
|
+
return Math.max(1, Math.min(maxWorkers, require("os").cpus().length));
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Enable low memory mode
|
|
379
|
+
*/
|
|
380
|
+
enableLowMemoryMode() {
|
|
381
|
+
this.isLowMemoryMode = true;
|
|
382
|
+
Logger.logger.info("cluster", "Low memory mode enabled");
|
|
383
|
+
this.emit("low_memory_mode_enabled", {
|
|
384
|
+
timestamp: Date.now(),
|
|
385
|
+
systemStats: this.getSystemMemoryStats(),
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Disable low memory mode
|
|
390
|
+
*/
|
|
391
|
+
disableLowMemoryMode() {
|
|
392
|
+
this.isLowMemoryMode = false;
|
|
393
|
+
Logger.logger.info("cluster", "Low memory mode disabled");
|
|
394
|
+
this.emit("low_memory_mode_disabled", {
|
|
395
|
+
timestamp: Date.now(),
|
|
396
|
+
systemStats: this.getSystemMemoryStats(),
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Check current memory usage and emit alerts if needed
|
|
401
|
+
*/
|
|
402
|
+
async checkMemoryUsage() {
|
|
403
|
+
const systemStats = await this.getSystemMemoryStats();
|
|
404
|
+
const warningThreshold = this.config?.memoryManagement?.memoryWarningThreshold || 80;
|
|
405
|
+
const criticalThreshold = this.config?.memoryManagement?.memoryCriticalThreshold || 95;
|
|
406
|
+
if (systemStats.usagePercentage >= criticalThreshold) {
|
|
407
|
+
this.emitMemoryAlert({
|
|
408
|
+
type: "critical",
|
|
409
|
+
message: `Critical system memory usage: ${systemStats.usagePercentage.toFixed(1)}%`,
|
|
410
|
+
memoryUsage: systemStats.usedMemory,
|
|
411
|
+
threshold: criticalThreshold,
|
|
412
|
+
timestamp: Date.now(),
|
|
413
|
+
action: "scale_down",
|
|
414
|
+
});
|
|
415
|
+
if (!this.isLowMemoryMode) {
|
|
416
|
+
this.enableLowMemoryMode();
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else if (systemStats.usagePercentage >= warningThreshold) {
|
|
420
|
+
this.emitMemoryAlert({
|
|
421
|
+
type: "warning",
|
|
422
|
+
message: `High system memory usage: ${systemStats.usagePercentage.toFixed(1)}%`,
|
|
423
|
+
memoryUsage: systemStats.usedMemory,
|
|
424
|
+
threshold: warningThreshold,
|
|
425
|
+
timestamp: Date.now(),
|
|
426
|
+
action: "alert_only",
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
else if (this.isLowMemoryMode &&
|
|
430
|
+
systemStats.usagePercentage < warningThreshold - 10) {
|
|
431
|
+
// Exit low memory mode if usage drops significantly
|
|
432
|
+
this.disableLowMemoryMode();
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Parse memory string to bytes
|
|
437
|
+
*/
|
|
438
|
+
parseMemoryString(memoryStr) {
|
|
439
|
+
const units = {
|
|
440
|
+
B: 1,
|
|
441
|
+
KB: 1024,
|
|
442
|
+
MB: 1024 * 1024,
|
|
443
|
+
GB: 1024 * 1024 * 1024,
|
|
444
|
+
TB: 1024 * 1024 * 1024 * 1024,
|
|
445
|
+
};
|
|
446
|
+
const match = memoryStr.match(/^(\d+(?:\.\d+)?)\s*([KMGT]?B)$/i);
|
|
447
|
+
if (!match) {
|
|
448
|
+
throw new Error(`Invalid memory format: ${memoryStr}`);
|
|
449
|
+
}
|
|
450
|
+
const value = parseFloat(match[1]);
|
|
451
|
+
const unit = match[2].toUpperCase();
|
|
452
|
+
return value * (units[unit] || 1);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Calculate memory trend from history
|
|
456
|
+
*/
|
|
457
|
+
calculateMemoryTrend(history) {
|
|
458
|
+
if (history.length < 2)
|
|
459
|
+
return 0;
|
|
460
|
+
const first = history[0];
|
|
461
|
+
const last = history[history.length - 1];
|
|
462
|
+
return (last - first) / first;
|
|
463
|
+
}
|
|
464
|
+
// Removed - using ProcessMonitor module instead
|
|
465
|
+
/**
|
|
466
|
+
* Emit memory alert
|
|
467
|
+
*/
|
|
468
|
+
emitMemoryAlert(alert) {
|
|
469
|
+
Logger.logger.warn("cluster", `Memory Alert: ${alert.message}`);
|
|
470
|
+
this.emit("memory_alert", alert);
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Clean up resources and stop monitoring
|
|
474
|
+
*/
|
|
475
|
+
destroy() {
|
|
476
|
+
this.stopMonitoring();
|
|
477
|
+
this.processMonitor.destroy();
|
|
478
|
+
this.memoryHistory.clear();
|
|
479
|
+
this.lastGCHint.clear();
|
|
480
|
+
this.removeAllListeners();
|
|
481
|
+
Logger.logger.info("cluster", "MemoryManager destroyed");
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
exports.MemoryManager = MemoryManager;
|
|
486
|
+
//# sourceMappingURL=memory-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-manager.js","sources":["../../../../src/cluster/memory-manager.ts"],"sourcesContent":[null],"names":["EventEmitter","ProcessMonitor","CrossPlatformMemory","logger"],"mappings":"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"}
|