功能介绍
在生产环境中,Agent 的超时和资源管理直接关系到系统稳定性和成本控制。OpenClaw 提供了全面的超时控制、内存管理、并发限制和资源配额机制,确保 Agent 在可控的范围内高效运行。
核心原则
每个操作都应有超时限制,每个 Agent 都应有资源配额。没有限制的 Agent 等于一颗定时炸弹。
每个操作都应有超时限制,每个 Agent 都应有资源配额。没有限制的 Agent 等于一颗定时炸弹。
超时管理策略
分级超时控制
// OpenClaw 超时配置层级
const timeoutConfig = {
// 全局超时
global: {
maxExecutionTime: 300000, // 单次任务最大执行时间 5分钟
idleTimeout: 60000, // 空闲超时 1分钟
shutdownTimeout: 10000 // 优雅关闭超时 10秒
},
// 工具调用超时
tools: {
default: 30000, // 默认工具超时 30秒
webFetch: 15000, // 网页抓取 15秒
webSearch: 10000, // 搜索 10秒
fileOperations: 5000, // 文件操作 5秒
database: 20000, // 数据库操作 20秒
aiModel: 120000 // AI 模型调用 2分钟
},
// 子 Agent 超时
subAgents: {
spawnTimeout: 5000, // 创建超时 5秒
executionTimeout: 120000, // 执行超时 2分钟
resultTimeout: 10000 // 结果收集超时 10秒
}
};
实现超时管理器
// OpenClaw 超时管理器
class TimeoutManager {
constructor(config) {
this.config = config;
this.activeTimers = new Map();
this.timeoutHistory = [];
}
// 带超时的执行
async executeWithTimeout(operation, timeoutMs, context = {}) {
const timerId = Symbol(context.name || 'operation');
const timeoutPromise = new Promise((_, reject) => {
const timer = setTimeout(() => {
this.activeTimers.delete(timerId);
reject(new TimeoutError(context.name, timeoutMs));
}, timeoutMs);
this.activeTimers.set(timerId, timer);
});
try {
const result = await Promise.race([operation(), timeoutPromise]);
this.clearTimeout(timerId);
return result;
} catch (error) {
this.clearTimeout(timerId);
this.recordTimeout(error, context);
throw error;
}
}
// 分级超时包装
wrapWithTimeouts(fn, context) {
return async (...args) => {
const toolType = context.toolType || 'default';
const timeout = this.config.tools[toolType] || this.config.tools.default;
return this.executeWithTimeout(() => fn(...args), timeout, context);
};
}
clearTimeout(id) {
if (this.activeTimers.has(id)) {
clearTimeout(this.activeTimers.get(id));
this.activeTimers.delete(id);
}
}
// 紧急停止所有操作
emergencyStop() {
for (const [id, timer] of this.activeTimers) {
clearTimeout(timer);
}
this.activeTimers.clear();
}
}
资源管理策略
内存管理
// OpenClaw 内存管理器
class MemoryManager {
constructor(config) {
this.maxMemoryMB = config.maxMemoryMB || 512;
this.warningThreshold = 0.8;
this.monitorInterval = config.monitorInterval || 5000;
}
// 监控内存使用
startMonitoring() {
this.monitorTimer = setInterval(() => {
const usage = process.memoryUsage();
const heapUsedMB = usage.heapUsed / 1024 / 1024;
const ratio = heapUsedMB / this.maxMemoryMB;
if (ratio > this.warningThreshold) {
this.triggerMemoryWarning(ratio);
}
if (ratio > 0.95) {
this.triggerEmergencyCleanup();
}
}, this.monitorInterval);
}
// 主动内存回收
async triggerEmergencyCleanup() {
// 清理缓存
if (global.gc) global.gc();
// 释放大对象
this.releaseLargeObjects();
// 压缩上下文
await this.compressContexts();
}
}
并发控制
// OpenClaw 并发控制器
class ConcurrencyController {
constructor(config) {
this.maxConcurrent = config.maxConcurrent || 10;
this.maxPerAgent = config.maxPerAgent || 3;
this.runningTasks = new Map();
this.agentTaskCounts = new Map();
}
async acquire(agentId) {
// 检查总并发数
if (this.runningTasks.size >= this.maxConcurrent) {
throw new Error('Maximum concurrent tasks reached');
}
// 检查单 Agent 并发数
const agentCount = this.agentTaskCounts.get(agentId) || 0;
if (agentCount >= this.maxPerAgent) {
throw new Error(`Agent ${agentId} reached max concurrent tasks`);
}
const taskId = Symbol();
this.runningTasks.set(taskId, { agentId, startTime: Date.now() });
this.agentTaskCounts.set(agentId, agentCount + 1);
return taskId;
}
release(taskId) {
const task = this.runningTasks.get(taskId);
if (task) {
const count = (this.agentTaskCounts.get(task.agentId) || 1) - 1;
this.agentTaskCounts.set(task.agentId, count);
this.runningTasks.delete(taskId);
}
}
}
最佳实践
- 分级设置超时:不同操作类型使用不同的超时值
- 监控资源使用:实时监控并设置告警阈值
- 优雅降级:资源不足时优先保证核心功能
- 资源配额:为每个 Agent 设置资源使用上限
- 定期清理:定时清理过期缓存和闲置资源
子 Agent 资源隔离
每个子 Agent 应有独立的资源配额,防止单个 Agent 耗尽系统资源。
每个子 Agent 应有独立的资源配额,防止单个 Agent 耗尽系统资源。