@agent-relay/resiliency 2.0.6 → 2.0.7
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/dist/cgroup-manager.d.ts +152 -0
- package/dist/cgroup-manager.d.ts.map +1 -0
- package/dist/cgroup-manager.js +394 -0
- package/dist/cgroup-manager.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CgroupManager - Manage CPU limits for agents using Linux cgroups v2
|
|
3
|
+
*
|
|
4
|
+
* Provides per-agent CPU isolation to prevent one agent (e.g., running npm install)
|
|
5
|
+
* from starving other agents of CPU resources.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Auto-detects cgroups v2 availability
|
|
9
|
+
* - Creates per-agent cgroups with CPU limits
|
|
10
|
+
* - Gracefully degrades when cgroups unavailable
|
|
11
|
+
* - Cleans up cgroups when agents exit
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const manager = getCgroupManager();
|
|
16
|
+
* await manager.createAgentCgroup('worker1', { cpuPercent: 50 });
|
|
17
|
+
* await manager.addProcess('worker1', pid);
|
|
18
|
+
* // ... agent runs with CPU limit ...
|
|
19
|
+
* await manager.removeAgentCgroup('worker1');
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Requirements:
|
|
23
|
+
* - Linux with cgroups v2 (unified hierarchy)
|
|
24
|
+
* - Write access to cgroup directory (delegated or root)
|
|
25
|
+
* - cpu controller enabled in cgroup
|
|
26
|
+
*/
|
|
27
|
+
import { EventEmitter } from 'node:events';
|
|
28
|
+
/**
|
|
29
|
+
* CPU limit configuration for an agent
|
|
30
|
+
*/
|
|
31
|
+
export interface CpuLimitConfig {
|
|
32
|
+
/** CPU percentage limit (1-100 per core, e.g., 200 = 2 full cores). Default: 100 */
|
|
33
|
+
cpuPercent?: number;
|
|
34
|
+
/** CPU period in microseconds. Default: 100000 (100ms) */
|
|
35
|
+
cpuPeriodUs?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Cgroup info for an agent
|
|
39
|
+
*/
|
|
40
|
+
export interface AgentCgroupInfo {
|
|
41
|
+
name: string;
|
|
42
|
+
path: string;
|
|
43
|
+
pids: number[];
|
|
44
|
+
cpuLimit: CpuLimitConfig;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Events emitted by CgroupManager
|
|
49
|
+
*/
|
|
50
|
+
export interface CgroupManagerEvents {
|
|
51
|
+
'cgroup-created': (info: {
|
|
52
|
+
agentName: string;
|
|
53
|
+
path: string;
|
|
54
|
+
cpuPercent: number;
|
|
55
|
+
}) => void;
|
|
56
|
+
'cgroup-removed': (info: {
|
|
57
|
+
agentName: string;
|
|
58
|
+
}) => void;
|
|
59
|
+
'process-added': (info: {
|
|
60
|
+
agentName: string;
|
|
61
|
+
pid: number;
|
|
62
|
+
}) => void;
|
|
63
|
+
'error': (error: Error) => void;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* CgroupManager singleton for managing agent CPU limits
|
|
67
|
+
*/
|
|
68
|
+
export declare class CgroupManager extends EventEmitter {
|
|
69
|
+
private cgroupBase;
|
|
70
|
+
private available;
|
|
71
|
+
private agentCgroups;
|
|
72
|
+
private initialized;
|
|
73
|
+
constructor(cgroupBase?: string);
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the cgroup manager and detect availability
|
|
76
|
+
*/
|
|
77
|
+
initialize(): Promise<boolean>;
|
|
78
|
+
/**
|
|
79
|
+
* Check if cgroups v2 is available and we have write access
|
|
80
|
+
*/
|
|
81
|
+
private detectCgroupsV2;
|
|
82
|
+
/**
|
|
83
|
+
* Ensure base cgroup directory exists with proper controllers
|
|
84
|
+
*/
|
|
85
|
+
private ensureBaseCgroup;
|
|
86
|
+
/**
|
|
87
|
+
* Check if cgroups are available
|
|
88
|
+
*/
|
|
89
|
+
isAvailable(): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Create a cgroup for an agent with CPU limits
|
|
92
|
+
*
|
|
93
|
+
* @param agentName - Unique agent identifier
|
|
94
|
+
* @param config - CPU limit configuration
|
|
95
|
+
* @returns true if cgroup was created, false if not available
|
|
96
|
+
*/
|
|
97
|
+
createAgentCgroup(agentName: string, config?: CpuLimitConfig): Promise<boolean>;
|
|
98
|
+
/**
|
|
99
|
+
* Add a process to an agent's cgroup
|
|
100
|
+
*
|
|
101
|
+
* @param agentName - Agent name
|
|
102
|
+
* @param pid - Process ID to add
|
|
103
|
+
* @returns true if process was added
|
|
104
|
+
*/
|
|
105
|
+
addProcess(agentName: string, pid: number): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Remove an agent's cgroup
|
|
108
|
+
*
|
|
109
|
+
* @param agentName - Agent name
|
|
110
|
+
* @returns true if cgroup was removed
|
|
111
|
+
*/
|
|
112
|
+
removeAgentCgroup(agentName: string): Promise<boolean>;
|
|
113
|
+
/**
|
|
114
|
+
* Update CPU limit for an existing agent cgroup
|
|
115
|
+
*
|
|
116
|
+
* @param agentName - Agent name
|
|
117
|
+
* @param cpuPercent - New CPU percentage limit
|
|
118
|
+
*/
|
|
119
|
+
updateCpuLimit(agentName: string, cpuPercent: number): Promise<boolean>;
|
|
120
|
+
/**
|
|
121
|
+
* Get current CPU usage for an agent (if available)
|
|
122
|
+
*
|
|
123
|
+
* @param agentName - Agent name
|
|
124
|
+
* @returns CPU usage stats or null
|
|
125
|
+
*/
|
|
126
|
+
getCpuStats(agentName: string): {
|
|
127
|
+
usageUsec: number;
|
|
128
|
+
throttledUsec: number;
|
|
129
|
+
periods: number;
|
|
130
|
+
} | null;
|
|
131
|
+
/**
|
|
132
|
+
* Get info about all agent cgroups
|
|
133
|
+
*/
|
|
134
|
+
getAllAgentCgroups(): AgentCgroupInfo[];
|
|
135
|
+
/**
|
|
136
|
+
* Clean up orphaned cgroups (e.g., after crash)
|
|
137
|
+
*/
|
|
138
|
+
cleanupOrphanedCgroups(): Promise<number>;
|
|
139
|
+
/**
|
|
140
|
+
* Shutdown and clean up all cgroups
|
|
141
|
+
*/
|
|
142
|
+
shutdown(): Promise<void>;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the singleton CgroupManager instance
|
|
146
|
+
*/
|
|
147
|
+
export declare function getCgroupManager(cgroupBase?: string): CgroupManager;
|
|
148
|
+
/**
|
|
149
|
+
* Format bytes for display
|
|
150
|
+
*/
|
|
151
|
+
export declare function formatCpuTime(usec: number): string;
|
|
152
|
+
//# sourceMappingURL=cgroup-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cgroup-manager.d.ts","sourceRoot":"","sources":["../src/cgroup-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1F,gBAAgB,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAaD;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,GAAE,MAA4B;IAMpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAqBpC;;OAEG;YACW,eAAe;IAyC7B;;OAEG;YACW,gBAAgB;IAgB9B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;;;OAMG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAuDzF;;;;;;OAMG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BlE;;;;;OAKG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmC5D;;;;;OAKG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B7E;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAmCpG;;OAEG;IACH,kBAAkB,IAAI,eAAe,EAAE;IAIvC;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAgC/C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAKnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CgroupManager - Manage CPU limits for agents using Linux cgroups v2
|
|
3
|
+
*
|
|
4
|
+
* Provides per-agent CPU isolation to prevent one agent (e.g., running npm install)
|
|
5
|
+
* from starving other agents of CPU resources.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Auto-detects cgroups v2 availability
|
|
9
|
+
* - Creates per-agent cgroups with CPU limits
|
|
10
|
+
* - Gracefully degrades when cgroups unavailable
|
|
11
|
+
* - Cleans up cgroups when agents exit
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const manager = getCgroupManager();
|
|
16
|
+
* await manager.createAgentCgroup('worker1', { cpuPercent: 50 });
|
|
17
|
+
* await manager.addProcess('worker1', pid);
|
|
18
|
+
* // ... agent runs with CPU limit ...
|
|
19
|
+
* await manager.removeAgentCgroup('worker1');
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* Requirements:
|
|
23
|
+
* - Linux with cgroups v2 (unified hierarchy)
|
|
24
|
+
* - Write access to cgroup directory (delegated or root)
|
|
25
|
+
* - cpu controller enabled in cgroup
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, rmSync, readdirSync } from 'node:fs';
|
|
28
|
+
import { join } from 'node:path';
|
|
29
|
+
import { EventEmitter } from 'node:events';
|
|
30
|
+
/**
|
|
31
|
+
* Default cgroup base path for agent-relay
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_CGROUP_BASE = '/sys/fs/cgroup/agent-relay';
|
|
34
|
+
/**
|
|
35
|
+
* Default CPU settings
|
|
36
|
+
*/
|
|
37
|
+
const DEFAULT_CPU_PERCENT = 100; // 100% of one core
|
|
38
|
+
const DEFAULT_CPU_PERIOD_US = 100000; // 100ms period
|
|
39
|
+
/**
|
|
40
|
+
* CgroupManager singleton for managing agent CPU limits
|
|
41
|
+
*/
|
|
42
|
+
export class CgroupManager extends EventEmitter {
|
|
43
|
+
cgroupBase;
|
|
44
|
+
available;
|
|
45
|
+
agentCgroups = new Map();
|
|
46
|
+
initialized = false;
|
|
47
|
+
constructor(cgroupBase = DEFAULT_CGROUP_BASE) {
|
|
48
|
+
super();
|
|
49
|
+
this.cgroupBase = cgroupBase;
|
|
50
|
+
this.available = false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Initialize the cgroup manager and detect availability
|
|
54
|
+
*/
|
|
55
|
+
async initialize() {
|
|
56
|
+
if (this.initialized) {
|
|
57
|
+
return this.available;
|
|
58
|
+
}
|
|
59
|
+
this.initialized = true;
|
|
60
|
+
this.available = await this.detectCgroupsV2();
|
|
61
|
+
if (this.available) {
|
|
62
|
+
// Ensure base directory exists
|
|
63
|
+
try {
|
|
64
|
+
await this.ensureBaseCgroup();
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
console.warn(`[cgroup-manager] Failed to create base cgroup: ${err.message}`);
|
|
68
|
+
this.available = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return this.available;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if cgroups v2 is available and we have write access
|
|
75
|
+
*/
|
|
76
|
+
async detectCgroupsV2() {
|
|
77
|
+
// Check for cgroups v2 unified hierarchy
|
|
78
|
+
const cgroupRoot = '/sys/fs/cgroup';
|
|
79
|
+
// Check if cgroup2 is mounted (unified hierarchy)
|
|
80
|
+
if (!existsSync(join(cgroupRoot, 'cgroup.controllers'))) {
|
|
81
|
+
console.info('[cgroup-manager] cgroups v2 not detected (no unified hierarchy)');
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Check if cpu controller is available
|
|
85
|
+
try {
|
|
86
|
+
const controllers = readFileSync(join(cgroupRoot, 'cgroup.controllers'), 'utf-8');
|
|
87
|
+
if (!controllers.includes('cpu')) {
|
|
88
|
+
console.info('[cgroup-manager] CPU controller not available in cgroups');
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.info(`[cgroup-manager] Cannot read cgroup controllers: ${err.message}`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// Check if we can write to cgroup directory
|
|
97
|
+
// In production, agent-relay cgroup should be pre-created with proper delegation
|
|
98
|
+
try {
|
|
99
|
+
const testPath = join(cgroupRoot, 'agent-relay-test-' + process.pid);
|
|
100
|
+
mkdirSync(testPath, { recursive: true });
|
|
101
|
+
rmSync(testPath, { recursive: true, force: true });
|
|
102
|
+
console.info('[cgroup-manager] cgroups v2 available with write access');
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
// Try delegated cgroup path
|
|
107
|
+
if (existsSync(this.cgroupBase)) {
|
|
108
|
+
console.info('[cgroup-manager] Using delegated cgroup at ' + this.cgroupBase);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
console.info(`[cgroup-manager] No write access to cgroups: ${err.message}`);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Ensure base cgroup directory exists with proper controllers
|
|
117
|
+
*/
|
|
118
|
+
async ensureBaseCgroup() {
|
|
119
|
+
if (!existsSync(this.cgroupBase)) {
|
|
120
|
+
mkdirSync(this.cgroupBase, { recursive: true });
|
|
121
|
+
}
|
|
122
|
+
// Enable cpu controller in subtree
|
|
123
|
+
const subtreeControlPath = join(this.cgroupBase, 'cgroup.subtree_control');
|
|
124
|
+
if (existsSync(subtreeControlPath)) {
|
|
125
|
+
try {
|
|
126
|
+
writeFileSync(subtreeControlPath, '+cpu');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Controller might already be enabled or not available
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if cgroups are available
|
|
135
|
+
*/
|
|
136
|
+
isAvailable() {
|
|
137
|
+
return this.available;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a cgroup for an agent with CPU limits
|
|
141
|
+
*
|
|
142
|
+
* @param agentName - Unique agent identifier
|
|
143
|
+
* @param config - CPU limit configuration
|
|
144
|
+
* @returns true if cgroup was created, false if not available
|
|
145
|
+
*/
|
|
146
|
+
async createAgentCgroup(agentName, config = {}) {
|
|
147
|
+
if (!this.initialized) {
|
|
148
|
+
await this.initialize();
|
|
149
|
+
}
|
|
150
|
+
if (!this.available) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
// Validate agent name (no path traversal)
|
|
154
|
+
if (agentName.includes('/') || agentName.includes('..')) {
|
|
155
|
+
throw new Error(`Invalid agent name: ${agentName}`);
|
|
156
|
+
}
|
|
157
|
+
const cgroupPath = join(this.cgroupBase, agentName);
|
|
158
|
+
try {
|
|
159
|
+
// Create cgroup directory
|
|
160
|
+
if (!existsSync(cgroupPath)) {
|
|
161
|
+
mkdirSync(cgroupPath, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
// Configure CPU limit
|
|
164
|
+
const cpuPercent = config.cpuPercent ?? DEFAULT_CPU_PERCENT;
|
|
165
|
+
const cpuPeriodUs = config.cpuPeriodUs ?? DEFAULT_CPU_PERIOD_US;
|
|
166
|
+
// cpu.max format: "$MAX $PERIOD" in microseconds
|
|
167
|
+
// For 50% of one CPU: "50000 100000" (50ms max per 100ms period)
|
|
168
|
+
const cpuMaxUs = Math.floor((cpuPercent / 100) * cpuPeriodUs);
|
|
169
|
+
const cpuMaxValue = `${cpuMaxUs} ${cpuPeriodUs}`;
|
|
170
|
+
writeFileSync(join(cgroupPath, 'cpu.max'), cpuMaxValue);
|
|
171
|
+
// Track the cgroup
|
|
172
|
+
const info = {
|
|
173
|
+
name: agentName,
|
|
174
|
+
path: cgroupPath,
|
|
175
|
+
pids: [],
|
|
176
|
+
cpuLimit: { cpuPercent, cpuPeriodUs },
|
|
177
|
+
createdAt: Date.now(),
|
|
178
|
+
};
|
|
179
|
+
this.agentCgroups.set(agentName, info);
|
|
180
|
+
this.emit('cgroup-created', { agentName, path: cgroupPath, cpuPercent });
|
|
181
|
+
console.info(`[cgroup-manager] Created cgroup for ${agentName} with ${cpuPercent}% CPU limit`);
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const error = new Error(`Failed to create cgroup for ${agentName}: ${err.message}`);
|
|
186
|
+
this.emit('error', error);
|
|
187
|
+
console.warn(`[cgroup-manager] ${error.message}`);
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Add a process to an agent's cgroup
|
|
193
|
+
*
|
|
194
|
+
* @param agentName - Agent name
|
|
195
|
+
* @param pid - Process ID to add
|
|
196
|
+
* @returns true if process was added
|
|
197
|
+
*/
|
|
198
|
+
async addProcess(agentName, pid) {
|
|
199
|
+
if (!this.available) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
const info = this.agentCgroups.get(agentName);
|
|
203
|
+
if (!info) {
|
|
204
|
+
console.warn(`[cgroup-manager] No cgroup found for agent ${agentName}`);
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
// Write PID to cgroup.procs
|
|
209
|
+
writeFileSync(join(info.path, 'cgroup.procs'), String(pid));
|
|
210
|
+
info.pids.push(pid);
|
|
211
|
+
this.emit('process-added', { agentName, pid });
|
|
212
|
+
console.info(`[cgroup-manager] Added process ${pid} to cgroup ${agentName}`);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
console.warn(`[cgroup-manager] Failed to add process ${pid} to cgroup ${agentName}: ${err.message}`);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Remove an agent's cgroup
|
|
222
|
+
*
|
|
223
|
+
* @param agentName - Agent name
|
|
224
|
+
* @returns true if cgroup was removed
|
|
225
|
+
*/
|
|
226
|
+
async removeAgentCgroup(agentName) {
|
|
227
|
+
if (!this.available) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
const info = this.agentCgroups.get(agentName);
|
|
231
|
+
if (!info) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
// Move processes to parent cgroup first (required before removal)
|
|
236
|
+
const parentProcs = join(this.cgroupBase, 'cgroup.procs');
|
|
237
|
+
for (const pid of info.pids) {
|
|
238
|
+
try {
|
|
239
|
+
writeFileSync(parentProcs, String(pid));
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Process might have exited
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Remove the cgroup directory
|
|
246
|
+
rmSync(info.path, { recursive: true, force: true });
|
|
247
|
+
this.agentCgroups.delete(agentName);
|
|
248
|
+
this.emit('cgroup-removed', { agentName });
|
|
249
|
+
console.info(`[cgroup-manager] Removed cgroup for ${agentName}`);
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.warn(`[cgroup-manager] Failed to remove cgroup ${agentName}: ${err.message}`);
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Update CPU limit for an existing agent cgroup
|
|
259
|
+
*
|
|
260
|
+
* @param agentName - Agent name
|
|
261
|
+
* @param cpuPercent - New CPU percentage limit
|
|
262
|
+
*/
|
|
263
|
+
async updateCpuLimit(agentName, cpuPercent) {
|
|
264
|
+
if (!this.available) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
const info = this.agentCgroups.get(agentName);
|
|
268
|
+
if (!info) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const cpuPeriodUs = info.cpuLimit.cpuPeriodUs ?? DEFAULT_CPU_PERIOD_US;
|
|
273
|
+
const cpuMaxUs = Math.floor((cpuPercent / 100) * cpuPeriodUs);
|
|
274
|
+
const cpuMaxValue = `${cpuMaxUs} ${cpuPeriodUs}`;
|
|
275
|
+
writeFileSync(join(info.path, 'cpu.max'), cpuMaxValue);
|
|
276
|
+
info.cpuLimit.cpuPercent = cpuPercent;
|
|
277
|
+
console.info(`[cgroup-manager] Updated CPU limit for ${agentName} to ${cpuPercent}%`);
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
console.warn(`[cgroup-manager] Failed to update CPU limit for ${agentName}: ${err.message}`);
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Get current CPU usage for an agent (if available)
|
|
287
|
+
*
|
|
288
|
+
* @param agentName - Agent name
|
|
289
|
+
* @returns CPU usage stats or null
|
|
290
|
+
*/
|
|
291
|
+
getCpuStats(agentName) {
|
|
292
|
+
if (!this.available) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
const info = this.agentCgroups.get(agentName);
|
|
296
|
+
if (!info) {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
const statPath = join(info.path, 'cpu.stat');
|
|
301
|
+
if (!existsSync(statPath)) {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
const stat = readFileSync(statPath, 'utf-8');
|
|
305
|
+
const lines = stat.trim().split('\n');
|
|
306
|
+
const stats = {};
|
|
307
|
+
for (const line of lines) {
|
|
308
|
+
const [key, value] = line.split(' ');
|
|
309
|
+
stats[key] = parseInt(value, 10);
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
usageUsec: stats['usage_usec'] ?? 0,
|
|
313
|
+
throttledUsec: stats['throttled_usec'] ?? 0,
|
|
314
|
+
periods: stats['nr_periods'] ?? 0,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get info about all agent cgroups
|
|
323
|
+
*/
|
|
324
|
+
getAllAgentCgroups() {
|
|
325
|
+
return Array.from(this.agentCgroups.values());
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Clean up orphaned cgroups (e.g., after crash)
|
|
329
|
+
*/
|
|
330
|
+
async cleanupOrphanedCgroups() {
|
|
331
|
+
if (!this.available || !existsSync(this.cgroupBase)) {
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
334
|
+
let cleaned = 0;
|
|
335
|
+
try {
|
|
336
|
+
const entries = readdirSync(this.cgroupBase, { withFileTypes: true });
|
|
337
|
+
for (const entry of entries) {
|
|
338
|
+
if (!entry.isDirectory())
|
|
339
|
+
continue;
|
|
340
|
+
// Skip if we're tracking this cgroup
|
|
341
|
+
if (this.agentCgroups.has(entry.name))
|
|
342
|
+
continue;
|
|
343
|
+
// Try to remove orphaned cgroup
|
|
344
|
+
try {
|
|
345
|
+
const cgroupPath = join(this.cgroupBase, entry.name);
|
|
346
|
+
rmSync(cgroupPath, { recursive: true, force: true });
|
|
347
|
+
cleaned++;
|
|
348
|
+
console.info(`[cgroup-manager] Cleaned up orphaned cgroup: ${entry.name}`);
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// Might still have processes
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// Ignore errors during cleanup
|
|
357
|
+
}
|
|
358
|
+
return cleaned;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Shutdown and clean up all cgroups
|
|
362
|
+
*/
|
|
363
|
+
async shutdown() {
|
|
364
|
+
for (const [agentName] of this.agentCgroups) {
|
|
365
|
+
await this.removeAgentCgroup(agentName);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Singleton instance
|
|
370
|
+
let cgroupManagerInstance = null;
|
|
371
|
+
/**
|
|
372
|
+
* Get the singleton CgroupManager instance
|
|
373
|
+
*/
|
|
374
|
+
export function getCgroupManager(cgroupBase) {
|
|
375
|
+
if (!cgroupManagerInstance) {
|
|
376
|
+
cgroupManagerInstance = new CgroupManager(cgroupBase);
|
|
377
|
+
}
|
|
378
|
+
return cgroupManagerInstance;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Format bytes for display
|
|
382
|
+
*/
|
|
383
|
+
export function formatCpuTime(usec) {
|
|
384
|
+
if (usec < 1000) {
|
|
385
|
+
return `${usec}µs`;
|
|
386
|
+
}
|
|
387
|
+
else if (usec < 1000000) {
|
|
388
|
+
return `${(usec / 1000).toFixed(2)}ms`;
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
return `${(usec / 1000000).toFixed(2)}s`;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=cgroup-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cgroup-manager.js","sourceRoot":"","sources":["../src/cgroup-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -65,4 +65,5 @@ export { CrashInsightsService, getCrashInsights, type CrashRecord, type CrashAna
|
|
|
65
65
|
export { StatelessLeadCoordinator, createStatelessLead, type BeadsTask, type LeadHeartbeat, type StatelessLeadConfig, } from './stateless-lead.js';
|
|
66
66
|
export { LeaderWatchdog, createLeaderWatchdog, type LeaderWatchdogConfig, type ElectionResult, } from './leader-watchdog.js';
|
|
67
67
|
export { GossipHealthMonitor, createGossipHealth, type GossipHeartbeat, type PeerHealth, type GossipHealthConfig, } from './gossip-health.js';
|
|
68
|
+
export { CgroupManager, getCgroupManager, formatCpuTime, type CpuLimitConfig, type AgentCgroupInfo, } from './cgroup-manager.js';
|
|
68
69
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,YAAY,EACZ,SAAS,IAAI,gBAAgB,EAC7B,OAAO,EACP,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhG,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,WAAW,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,YAAY,EACZ,SAAS,IAAI,gBAAgB,EAC7B,OAAO,EACP,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhG,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,WAAW,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -65,4 +65,5 @@ export { CrashInsightsService, getCrashInsights, } from './crash-insights.js';
|
|
|
65
65
|
export { StatelessLeadCoordinator, createStatelessLead, } from './stateless-lead.js';
|
|
66
66
|
export { LeaderWatchdog, createLeaderWatchdog, } from './leader-watchdog.js';
|
|
67
67
|
export { GossipHealthMonitor, createGossipHealth, } from './gossip-health.js';
|
|
68
|
+
export { CgroupManager, getCgroupManager, formatCpuTime, } from './cgroup-manager.js';
|
|
68
69
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,YAAY,EACZ,SAAS,IAAI,gBAAgB,EAC7B,OAAO,GAIR,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAA2D,MAAM,cAAc,CAAC;AAEhG,OAAO,EACL,eAAe,EACf,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAMtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GAOZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAKjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GAInB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,YAAY,EACZ,SAAS,IAAI,gBAAgB,EAC7B,OAAO,GAIR,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAA2D,MAAM,cAAc,CAAC;AAEhG,OAAO,EACL,eAAe,EACf,aAAa,GAGd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAMtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GAKrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GAOZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAKjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,cAAc,EACd,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,GAGd,MAAM,qBAAqB,CAAC"}
|