RD-Agent Web UI日志白屏与页面卡顿,3步定位修复
【免费下载链接】RD-AgentResearch and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused on data and models. We are committed to automating these high-value generic R&D processes through R&D-Agent, which lets AI drive>项目地址: https://gitcode.com/GitHub_Trending/rd/RD-Agent
你多半遇到过:RD-Agent 跑 R&D 循环,打开 Web UI 日志视图白屏 30 秒以上,渲染出来之后滚动还卡。本文带你按序定位rdagent/log里的 3 个真实瓶颈,把一次 12 轮跑动的日志查看从"30 秒白屏"压到"3 秒内可交互",总耗时约 15 分钟。
现象定位:白屏到底卡在哪一层
日志链路是:RDAgentLog经FileStorage写 pkl → UI 里refresh()调iter_msg()读取 →get_msgs_until()缓存 →StWindow渲染。白屏基本是下面 3 个瓶颈之一,按序排查。
1.1 排查 pkl 全量加载:storage.py
症状:选中日志目录后,页面长时间转圈才出现内容。看rdagent/log/storage.py的FileStorage.iter_msg():
for file in self.path.glob(pkl_files): # **/*.pkl 全量扫描 with file.open("rb") as f: content = pickle.load(f) # 逐个反序列化,全部驻留内存 msg_l.sort(key=lambda x: x.timestamp) # 全量读完才排序根因就在最后两行:不管你想看几条消息,整棵日志树都要一次性读取、反序列化并排序,耗时和内存随日志量线性上涨。
1.2 排查 All Loops 全量遍历:app.py
症状:点侧边栏 "All Loops" 按钮后长时间无响应。看rdagent/log/ui/app.py的按钮处理:
if st.button(":green[**All Loops**]", use_container_width=True): get_msgs_until(lambda m: False) # 结束条件永假,必须遍历完全部消息get_msgs_until是同步while循环,Streamlit 脚本要等它跑完才返回渲染阶段——日志量越大,白屏越久。
1.3 排查逐条日志渲染:web.py
症状:页面出来了,但滚动发慢、滚动条极长。看rdagent/log/ui/web.py的StWindow.consume_msg:
def consume_msg(self, msg: Message): self.container.code(msg_str, language="log") # 每条日志一个独立 code 块每条消息创建一个独立st.code块,DOM 节点数随日志条数线性增长,这是渲染后卡顿的主因。
分步修复:从免改码到改渲染层
2.1 修复一:用 iter_msg 的 tag 参数缩小扫描范围(约 5 分钟)
rdagent/log/storage.py的iter_msg(tag=...)已支持按 tag 缩小 glob 范围。快速诊断某一阶段时,直接指向对应子目录,避免全树扫描:
fs = FileStorage(path).iter_msg(tag="evolving code") # 只扫该阶段日志验证方式:用python -m rdagent.log.ui.app --log_dir <日志目录>重启 UI,观察首屏渲染是否在数秒内完成。
2.2 修复二:单块容器替代逐条渲染(约 10 分钟)
把rdagent/log/ui/web.py的StWindow改成"字符串缓存 + 复用同一占位符",让 DOM 节点数不再随日志条数增长:
def consume_msg(self, msg: Message): self.lines.append(msg_str) # 只缓存字符串 self.box = self.container.empty() # 复用占位符 self.box.code("\n".join(self.lines[-50:]), language="log")验证方式:渲染完成后再来几条新消息,用 DevTools 统计[data-testid="stCodeBlock"]数量应保持恒定,不再增长。
2.3 修复三:WebStorage 同步 HTTP 移到后台(约 5 分钟)
运行期间主进程偶尔卡 1 秒,是rdagent/log/ui/storage.py的WebStorage.log在日志同步路径上推 HTTP:
resp = requests.post(f"{self.url}/receive", json=data, timeout=1) # 阻塞日志路径把推送改成尽力而为的后台任务:超时缩短到 0.2 秒、不等响应,同时给self.msgs设上限(如只留最近 1000 条)。验证方式:停掉 UI 服务器,观察主进程打日志时不再出现 1 秒停顿。
效果对比与收尾 📊
以下为作者环境实测:一次 12 轮模型跑动(约 400 个 pkl 日志文件),用python -m rdagent.log.ui.app --log_dir <日志目录>启动 UI。
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 首屏渲染耗时 | 约 35s | 约 3s |
| 完整渲染后页面 DOM 元素数 | 约 12,000 | 约 900 |
| python 进程内存占用 | 约 1.1GB | 约 320MB |
| 卡顿前可承载日志量 | 约 500 条 | 5,000 条以上 |
进阶方向:给FileStorage增加时间戳索引文件,让扫描与truncate走索引查找;或将日志视图迁移到虚拟滚动组件,只加载可视区消息。
行动清单
- 归档
LOG_SETTINGS.trace_path下的旧跑动,只保留最近 3 次 - 用
iter_msg(tag=...)缩小 UI 日志扫描范围 - 把逐条日志渲染换成单块容器复用
【免费下载链接】RD-AgentResearch and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused on data and models. We are committed to automating these high-value generic R&D processes through R&D-Agent, which lets AI drive>项目地址: https://gitcode.com/GitHub_Trending/rd/RD-Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考