第 17 讲:性能优化与缓存策略

OpenHands 源码解析 · 第 17 讲

OpenHands 源码解析系列 第 17 讲:性能优化与缓存策略 基于 OpenHands 源码 · 2026-08-13 一、为什么性能优化至关重要 OpenHands 是一个面向企业级部署的 AI Agent 平台,每次会话涉及 LLM 调用、沙箱启动、事件回调、数据库读写等密集操作。在高并发场景下,性能瓶颈直接决定了系统能否支撑多用户同时使用。 本讲深入源码,分析 OpenHands 在以下维度的性能设计: 🔹 数据库连接池与异步引擎管理 🔹 Redis 缓存与分布式锁机制 🔹 HTTP 缓存策略与速率限制中间件 🔹 异步并发控制与资源节流 🔹 函数级缓存与模块导入优化 🔹 日志系统的性能考量 二、数据库连接池:性能的核心基础设施 OpenHands 使用 SQLAlchemy 2.0 的异步引擎配合连接池,是后端性能的第一道防线。 2.1 连接池配置 📄 openhands/app_server/services/db_session_injector.py (第 29-52 行) class DbSessionInjector(BaseModel, Injector[AsyncSession]): persistence_dir: Path host: str | None = None port: int | None = None name: str | None = None user: str | None = None password: SecretStr | None = None echo: bool = False # can be overriden with DB_POOL_SIZE / DB_MAX_OVERFLOW pool_size: int = 25 max_overflow: int = 10 pool_recycle: int = 1800 pool_use_lifo: bool = True gcp_db_instance: str | None = None ... _engine: Engine | None = PrivateAttr(default=None) _async_engine: AsyncEngine | None = PrivateAttr(default=None) _session_maker: sessionmaker | None = PrivateAttr(default=None) _async_session_maker: async_sessionmaker | None = PrivateAttr(default=None) 关键参数解读: 🔹 pool_size = 25 :默认 25 个常驻连接,支撑高并发请求 🔹 max_overflow = 10 :突发流量时最多额外创建 10 个连接(峰值 35) 🔹 pool_recycle = 1800 :连接 30 分钟回收,防止数据库服务端超时断开 🔹 pool_use_lifo = True :后进先出策略,减少连接创建频率(复用最近释放的连接) 🔹 pool_pre_ping = True :取连接前检测存活,避免"连接已断开"异常 2.2 双引擎架构:同步 + 异步 📄 openhands/app_server/services/db_session_injector.py (第 177-222 行) async def get_async_db_engine(self) -> AsyncEngine: async_engine = self._async_engine if async_engine: return async_engine if self.gcp_db_instance: # GCP environments async_engine = await self._create_async_gcp_engine() else: ... async_engine = create_async_engine( url, connect_args=build_asyncpg_connect_args(self.ssl_mode), pool_size=self.pool_size…

阅读全文:OpenHands 源码解析 第 17 讲