@soulcraft/sdk 3.3.4 → 3.3.5
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,8 @@ 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;
|
|
196
215
|
/**
|
|
197
216
|
* @param config - Pool configuration.
|
|
198
217
|
*/
|
|
@@ -277,6 +296,11 @@ export declare class BrainyInstancePool {
|
|
|
277
296
|
* @returns The cached or newly initialized Brainy instance.
|
|
278
297
|
*/
|
|
279
298
|
private _getOrCreate;
|
|
299
|
+
/**
|
|
300
|
+
* Get the least-recently-used cache key. LRUCache iterates in LRU order
|
|
301
|
+
* (least recent first), so the first key is the eviction candidate.
|
|
302
|
+
*/
|
|
303
|
+
private _getLruKey;
|
|
280
304
|
/**
|
|
281
305
|
* Creates and initializes a Brainy instance at the given storage path.
|
|
282
306
|
*
|
|
@@ -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;IAEpC;;OAEG;gBACS,MAAM,EAAE,kBAAkB;IAyCtC;;;;;;;;;;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;IAyCpB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;YACW,WAAW;CA2B1B;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,19 +167,31 @@ 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;
|
|
131
172
|
/**
|
|
132
173
|
* @param config - Pool configuration.
|
|
133
174
|
*/
|
|
134
175
|
constructor(config) {
|
|
135
176
|
const defaultMax = config.strategy === 'per-tenant' ? 50 : 200;
|
|
177
|
+
const memoryAware = config.memoryAware ?? (config.storage === 'mmap-filesystem');
|
|
136
178
|
this.config = {
|
|
137
179
|
storage: config.storage,
|
|
138
180
|
dataPath: config.dataPath,
|
|
139
181
|
strategy: config.strategy,
|
|
140
182
|
scopeKey: config.scopeKey ?? ((userId, workspaceId) => `${userId}:${workspaceId}`),
|
|
141
183
|
maxInstances: config.maxInstances ?? defaultMax,
|
|
184
|
+
memoryAware,
|
|
185
|
+
memoryLimitBytes: config.memoryLimitBytes ?? 0,
|
|
142
186
|
onInit: config.onInit ?? (async () => { }),
|
|
143
187
|
};
|
|
188
|
+
// Compute memory limit: explicit override, or 75% of effective system memory
|
|
189
|
+
if (memoryAware) {
|
|
190
|
+
this.memoryLimit = config.memoryLimitBytes ?? Math.floor(detectEffectiveMemory() * 0.75);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.memoryLimit = 0;
|
|
194
|
+
}
|
|
144
195
|
this.cache = new LRUCache({
|
|
145
196
|
max: this.config.maxInstances,
|
|
146
197
|
dispose: (brain, _key, _reason) => {
|
|
@@ -151,6 +202,10 @@ export class BrainyInstancePool {
|
|
|
151
202
|
});
|
|
152
203
|
},
|
|
153
204
|
});
|
|
205
|
+
if (memoryAware && this.memoryLimit > 0) {
|
|
206
|
+
const limitMB = Math.round(this.memoryLimit / 1024 / 1024);
|
|
207
|
+
console.log(`[SDK/pool] Memory-aware eviction enabled (limit: ${limitMB}MB)`);
|
|
208
|
+
}
|
|
154
209
|
}
|
|
155
210
|
// ── Public API ─────────────────────────────────────────────────────────────
|
|
156
211
|
/**
|
|
@@ -299,6 +354,25 @@ export class BrainyInstancePool {
|
|
|
299
354
|
if (this.pending.has(key)) {
|
|
300
355
|
return this.pending.get(key);
|
|
301
356
|
}
|
|
357
|
+
// Memory-aware eviction: if RSS exceeds limit, evict LRU before creating
|
|
358
|
+
if (this.memoryLimit > 0 && this.cache.size > 0) {
|
|
359
|
+
const rss = process.memoryUsage.rss();
|
|
360
|
+
if (rss > this.memoryLimit) {
|
|
361
|
+
const oldestKey = this._getLruKey();
|
|
362
|
+
if (oldestKey) {
|
|
363
|
+
const evicted = this.cache.get(oldestKey);
|
|
364
|
+
this.cache.delete(oldestKey);
|
|
365
|
+
if (evicted) {
|
|
366
|
+
evicted.close().catch((err) => {
|
|
367
|
+
console.error('[SDK/pool] memory-pressure evict failed:', err);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
const rssMB = Math.round(rss / 1024 / 1024);
|
|
371
|
+
const limitMB = Math.round(this.memoryLimit / 1024 / 1024);
|
|
372
|
+
console.log(`[SDK/pool] Memory pressure (${rssMB}MB/${limitMB}MB) — evicted ${oldestKey}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
302
376
|
const initPromise = this._initBrainy(storagePath).then((brain) => {
|
|
303
377
|
this.cache.set(key, brain);
|
|
304
378
|
this.pending.delete(key);
|
|
@@ -310,6 +384,16 @@ export class BrainyInstancePool {
|
|
|
310
384
|
this.pending.set(key, initPromise);
|
|
311
385
|
return initPromise;
|
|
312
386
|
}
|
|
387
|
+
/**
|
|
388
|
+
* Get the least-recently-used cache key. LRUCache iterates in LRU order
|
|
389
|
+
* (least recent first), so the first key is the eviction candidate.
|
|
390
|
+
*/
|
|
391
|
+
_getLruKey() {
|
|
392
|
+
for (const key of this.cache.keys()) {
|
|
393
|
+
return key;
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
313
397
|
/**
|
|
314
398
|
* Creates and initializes a Brainy instance at the given storage path.
|
|
315
399
|
*
|
|
@@ -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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"}
|