@soulcraft/sdk 3.3.4 → 3.3.6
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.
|
@@ -123,6 +123,23 @@ export interface InstancePoolConfig {
|
|
|
123
123
|
* Defaults to `200` for per-user, `50` for per-tenant strategies.
|
|
124
124
|
*/
|
|
125
125
|
maxInstances?: number;
|
|
126
|
+
/**
|
|
127
|
+
* Enable memory-aware eviction. When enabled, the pool checks process RSS
|
|
128
|
+
* before creating new instances and evicts the least-recently-used instance
|
|
129
|
+
* if memory usage exceeds the threshold.
|
|
130
|
+
*
|
|
131
|
+
* The threshold is computed automatically from system memory (75% of total
|
|
132
|
+
* or cgroup limit), or can be set manually via `memoryLimitBytes`.
|
|
133
|
+
*
|
|
134
|
+
* @default true when storage is 'mmap-filesystem' (production)
|
|
135
|
+
*/
|
|
136
|
+
memoryAware?: boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Manual memory limit in bytes. When `memoryAware` is enabled, the pool
|
|
139
|
+
* evicts LRU instances when process RSS exceeds this value. If not set,
|
|
140
|
+
* defaults to 75% of system memory (or cgroup limit if in a container).
|
|
141
|
+
*/
|
|
142
|
+
memoryLimitBytes?: number;
|
|
126
143
|
/**
|
|
127
144
|
* Optional async hook called after a new Brainy instance is initialized.
|
|
128
145
|
*
|
|
@@ -193,6 +210,10 @@ export declare class BrainyInstancePool {
|
|
|
193
210
|
private readonly cache;
|
|
194
211
|
/** Deduplicates concurrent init requests for the same scope key. */
|
|
195
212
|
private readonly pending;
|
|
213
|
+
/** Memory limit for RSS-based eviction (0 = disabled) */
|
|
214
|
+
private readonly memoryLimit;
|
|
215
|
+
/** Cortex ResourceManager reference (lazy-resolved from first brainy instance) */
|
|
216
|
+
private resourceManager;
|
|
196
217
|
/**
|
|
197
218
|
* @param config - Pool configuration.
|
|
198
219
|
*/
|
|
@@ -277,6 +298,11 @@ export declare class BrainyInstancePool {
|
|
|
277
298
|
* @returns The cached or newly initialized Brainy instance.
|
|
278
299
|
*/
|
|
279
300
|
private _getOrCreate;
|
|
301
|
+
/**
|
|
302
|
+
* Get the least-recently-used cache key. LRUCache iterates in LRU order
|
|
303
|
+
* (least recent first), so the first key is the eviction candidate.
|
|
304
|
+
*/
|
|
305
|
+
private _getLruKey;
|
|
280
306
|
/**
|
|
281
307
|
* Creates and initializes a Brainy instance at the given storage path.
|
|
282
308
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-pool.d.ts","sourceRoot":"","sources":["../../src/server/instance-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;
|
|
1
|
+
{"version":3,"file":"instance-pool.d.ts","sourceRoot":"","sources":["../../src/server/instance-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAQH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAMnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,OAAO,EAAE,YAAY,GAAG,iBAAiB,CAAA;IAEzC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB,iCAAiC;IACjC,QAAQ,EAAE,gBAAgB,CAAA;IAE1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAA;IAE1D;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/D;AA4CD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,kFAAkF;IAClF,OAAO,CAAC,eAAe,CAAY;IAEnC;;OAEG;gBACS,MAAM,EAAE,kBAAkB;IA6CtC;;;;;;;;;;OAUG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASnE;;;;;;;;OAQG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASpD;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB5E;;;;;;;;;;;;;OAaG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;;OAMG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B;;OAEG;IACH,QAAQ,IAAI,iBAAiB;IAU7B;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IAmDpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;YACW,WAAW;CAuC1B;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -85,11 +85,50 @@
|
|
|
85
85
|
* ```
|
|
86
86
|
*/
|
|
87
87
|
import { createHash } from 'crypto';
|
|
88
|
+
import { readFileSync, existsSync } from 'fs';
|
|
88
89
|
import fs from 'fs/promises';
|
|
90
|
+
import os from 'os';
|
|
89
91
|
import path from 'path';
|
|
90
92
|
import { LRUCache } from 'lru-cache';
|
|
91
93
|
import { Brainy } from '@soulcraft/brainy';
|
|
92
94
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
95
|
+
// Memory detection
|
|
96
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Detect effective memory limit — cgroup-aware for containers, system total for VMs.
|
|
99
|
+
*
|
|
100
|
+
* @returns Effective memory limit in bytes
|
|
101
|
+
*/
|
|
102
|
+
function detectEffectiveMemory() {
|
|
103
|
+
const systemTotal = os.totalmem();
|
|
104
|
+
try {
|
|
105
|
+
// cgroups v2
|
|
106
|
+
const v2Path = '/sys/fs/cgroup/memory.max';
|
|
107
|
+
if (existsSync(v2Path)) {
|
|
108
|
+
const content = readFileSync(v2Path, 'utf8').trim();
|
|
109
|
+
if (content !== 'max') {
|
|
110
|
+
const bytes = parseInt(content, 10);
|
|
111
|
+
if (bytes > 64 * 1024 * 1024 && bytes < systemTotal * 2) {
|
|
112
|
+
return Math.min(bytes, systemTotal);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// cgroups v1
|
|
117
|
+
const v1Path = '/sys/fs/cgroup/memory/memory.limit_in_bytes';
|
|
118
|
+
if (existsSync(v1Path)) {
|
|
119
|
+
const content = readFileSync(v1Path, 'utf8').trim();
|
|
120
|
+
const bytes = parseInt(content, 10);
|
|
121
|
+
if (bytes > 64 * 1024 * 1024 && bytes < systemTotal * 2) {
|
|
122
|
+
return Math.min(bytes, systemTotal);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Not in a cgroup environment
|
|
128
|
+
}
|
|
129
|
+
return systemTotal;
|
|
130
|
+
}
|
|
131
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
93
132
|
// BrainyInstancePool
|
|
94
133
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
95
134
|
/**
|
|
@@ -128,22 +167,40 @@ export class BrainyInstancePool {
|
|
|
128
167
|
cache;
|
|
129
168
|
/** Deduplicates concurrent init requests for the same scope key. */
|
|
130
169
|
pending = new Map();
|
|
170
|
+
/** Memory limit for RSS-based eviction (0 = disabled) */
|
|
171
|
+
memoryLimit;
|
|
172
|
+
/** Cortex ResourceManager reference (lazy-resolved from first brainy instance) */
|
|
173
|
+
resourceManager = null;
|
|
131
174
|
/**
|
|
132
175
|
* @param config - Pool configuration.
|
|
133
176
|
*/
|
|
134
177
|
constructor(config) {
|
|
135
178
|
const defaultMax = config.strategy === 'per-tenant' ? 50 : 200;
|
|
179
|
+
const memoryAware = config.memoryAware ?? (config.storage === 'mmap-filesystem');
|
|
136
180
|
this.config = {
|
|
137
181
|
storage: config.storage,
|
|
138
182
|
dataPath: config.dataPath,
|
|
139
183
|
strategy: config.strategy,
|
|
140
184
|
scopeKey: config.scopeKey ?? ((userId, workspaceId) => `${userId}:${workspaceId}`),
|
|
141
185
|
maxInstances: config.maxInstances ?? defaultMax,
|
|
186
|
+
memoryAware,
|
|
187
|
+
memoryLimitBytes: config.memoryLimitBytes ?? 0,
|
|
142
188
|
onInit: config.onInit ?? (async () => { }),
|
|
143
189
|
};
|
|
190
|
+
// Compute memory limit: explicit override, or 75% of effective system memory
|
|
191
|
+
if (memoryAware) {
|
|
192
|
+
this.memoryLimit = config.memoryLimitBytes ?? Math.floor(detectEffectiveMemory() * 0.75);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
this.memoryLimit = 0;
|
|
196
|
+
}
|
|
144
197
|
this.cache = new LRUCache({
|
|
145
198
|
max: this.config.maxInstances,
|
|
146
|
-
dispose: (brain,
|
|
199
|
+
dispose: (brain, key, _reason) => {
|
|
200
|
+
// Untrack from ResourceManager before closing
|
|
201
|
+
if (this.resourceManager) {
|
|
202
|
+
this.resourceManager.untrackInstance(key);
|
|
203
|
+
}
|
|
147
204
|
// Non-blocking close — eviction is synchronous, close() runs in background.
|
|
148
205
|
// brain.close() flushes deferred HNSW dirty nodes then frees all resources.
|
|
149
206
|
brain.close().catch((err) => {
|
|
@@ -151,6 +208,10 @@ export class BrainyInstancePool {
|
|
|
151
208
|
});
|
|
152
209
|
},
|
|
153
210
|
});
|
|
211
|
+
if (memoryAware && this.memoryLimit > 0) {
|
|
212
|
+
const limitMB = Math.round(this.memoryLimit / 1024 / 1024);
|
|
213
|
+
console.log(`[SDK/pool] Memory-aware eviction enabled (limit: ${limitMB}MB)`);
|
|
214
|
+
}
|
|
154
215
|
}
|
|
155
216
|
// ── Public API ─────────────────────────────────────────────────────────────
|
|
156
217
|
/**
|
|
@@ -294,14 +355,41 @@ export class BrainyInstancePool {
|
|
|
294
355
|
*/
|
|
295
356
|
_getOrCreate(key, storagePath) {
|
|
296
357
|
const cached = this.cache.get(key);
|
|
297
|
-
if (cached)
|
|
358
|
+
if (cached) {
|
|
359
|
+
if (this.resourceManager)
|
|
360
|
+
this.resourceManager.touchInstance(key);
|
|
298
361
|
return Promise.resolve(cached);
|
|
362
|
+
}
|
|
299
363
|
if (this.pending.has(key)) {
|
|
300
364
|
return this.pending.get(key);
|
|
301
365
|
}
|
|
366
|
+
// Memory-aware eviction: if RSS exceeds limit, evict LRU before creating
|
|
367
|
+
if (this.memoryLimit > 0 && this.cache.size > 0) {
|
|
368
|
+
const rss = process.memoryUsage.rss();
|
|
369
|
+
if (rss > this.memoryLimit) {
|
|
370
|
+
const oldestKey = this._getLruKey();
|
|
371
|
+
if (oldestKey) {
|
|
372
|
+
const evicted = this.cache.get(oldestKey);
|
|
373
|
+
this.cache.delete(oldestKey);
|
|
374
|
+
if (evicted) {
|
|
375
|
+
evicted.close().catch((err) => {
|
|
376
|
+
console.error('[SDK/pool] memory-pressure evict failed:', err);
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
const rssMB = Math.round(rss / 1024 / 1024);
|
|
380
|
+
const limitMB = Math.round(this.memoryLimit / 1024 / 1024);
|
|
381
|
+
console.log(`[SDK/pool] Memory pressure (${rssMB}MB/${limitMB}MB) — evicted ${oldestKey}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
302
385
|
const initPromise = this._initBrainy(storagePath).then((brain) => {
|
|
303
386
|
this.cache.set(key, brain);
|
|
304
387
|
this.pending.delete(key);
|
|
388
|
+
// Track instance in ResourceManager for memory budgeting
|
|
389
|
+
if (this.resourceManager) {
|
|
390
|
+
const entityCount = brain.storage?.entityCount?.() ?? 500;
|
|
391
|
+
this.resourceManager.trackInstance(key, entityCount);
|
|
392
|
+
}
|
|
305
393
|
return brain;
|
|
306
394
|
}).catch((err) => {
|
|
307
395
|
this.pending.delete(key);
|
|
@@ -310,6 +398,16 @@ export class BrainyInstancePool {
|
|
|
310
398
|
this.pending.set(key, initPromise);
|
|
311
399
|
return initPromise;
|
|
312
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* Get the least-recently-used cache key. LRUCache iterates in LRU order
|
|
403
|
+
* (least recent first), so the first key is the eviction candidate.
|
|
404
|
+
*/
|
|
405
|
+
_getLruKey() {
|
|
406
|
+
for (const key of this.cache.keys()) {
|
|
407
|
+
return key;
|
|
408
|
+
}
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
313
411
|
/**
|
|
314
412
|
* Creates and initializes a Brainy instance at the given storage path.
|
|
315
413
|
*
|
|
@@ -337,6 +435,18 @@ export class BrainyInstancePool {
|
|
|
337
435
|
if (this.config.onInit) {
|
|
338
436
|
await this.config.onInit(brain, storagePath);
|
|
339
437
|
}
|
|
438
|
+
// Resolve ResourceManager from Cortex plugin (lazy, first time only)
|
|
439
|
+
if (!this.resourceManager) {
|
|
440
|
+
try {
|
|
441
|
+
const rm = brain.pluginRegistry?.getProvider?.('resourceManager');
|
|
442
|
+
if (rm && typeof rm.trackInstance === 'function') {
|
|
443
|
+
this.resourceManager = rm;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
// No Cortex plugin loaded — ResourceManager not available
|
|
448
|
+
}
|
|
449
|
+
}
|
|
340
450
|
const elapsed = Date.now() - initStart;
|
|
341
451
|
console.log(`[SDK/pool] Brainy ready: ${path.basename(storagePath)} (${elapsed}ms) [${this.config.storage}]`);
|
|
342
452
|
return brain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-pool.js","sourceRoot":"","sources":["../../src/server/instance-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,aAAa,CAAA;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"instance-pool.js","sourceRoot":"","sources":["../../src/server/instance-pool.ts"],"names":[],"mappings":"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"}
|