AgentGym icon indicating copy to clipboard operation
AgentGym copied to clipboard

WebShop Server内存耗尽导致Online-RL训练崩溃

Open HappynessI opened this issue 1 month ago • 2 comments

WebShop Server内存耗尽导致Online-RL训练崩溃

环境信息

  • 操作系统: Debian GNU/Linux 12 (bookworm)
  • 硬件: 503GB RAM, 256 cores
  • JRE版本: OpenJDK 11.0.29
  • 训练时长: 约2.5小时后崩溃

问题描述

在进行WebShop Online-RL训练时,WebShop Server进程(JVM)因内存不足而崩溃,导致训练中断并报ConnectionError

错误日志

JVM崩溃日志 (hs_err_pid1554723.log):

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 16384 bytes for committing reserved memory.
...
Threads class SMR info:
_java_thread_list=0x00007f933c1f3e80, length=1764, elements={
...

训练日志片段:

(WorkerDict pid=1601514) 404
(WorkerDict pid=1601514) {'env_idx': 36043776}
(WorkerDict pid=1601514) Error during closing env

根因分析

经排查发现以下问题:

1. 环境实例未被正确清理(代码Bug)

位置: agentenv-webshop/agentenv_webshop/environment.py:100

def __del__(self):
    for idx in self.ls:
        self.env[idx].close  #  应该是缺少括号,方法未被调用
        print(f"-------Env {idx} closed--------")

2. 资源泄漏

由于close()未被调用,导致:

  • 环境实例从不释放
  • 关联的Java线程累积(崩溃时达到1764个线程)
  • Lucene搜索引擎相关资源无法回收
  • JVM堆和本地内存持续增长

复现步骤

  1. 启动WebShop Server: webshop --port 36001
  2. 运行Online-RL训练脚本(如verl的PPO训练)
  3. 训练配置: train_batch_size=16, rollout_sample_num=4
  4. 等待约2-3小时,Server崩溃

建议修复

  1. 修复close()调用: 在environment.py:100添加括号
  2. 添加主动清理机制: 在Server端添加/close接口,让客户端主动释放环境
  3. 限制JVM内存上限: 启动时设置-Xmx参数防止无限增长
  4. 改进环境池管理: 当达到sz=8000上限时,拒绝创建新环境而非复用(第31-35行的复用逻辑可能导致状态混乱)

影响范围

该问题影响所有使用WebShop进行Online-RL训练的场景,特别是长时间训练任务。


感谢维护者的辛勤工作!如需更多日志或复现信息,请告知。

HappynessI avatar Nov 11 '25 12:11 HappynessI

我加了()还是会卡住,请问你还改了啥吗?

SHIFTTTTTTTT avatar Nov 26 '25 08:11 SHIFTTTTTTTT

我之前会遇到Java虚拟机内存不足的问题,不妨试试增加分配给Java虚拟机的内存:

export JAVA_OPTS="-Xmx4g -Xms2g"  # 最大4GB,初始2GB

webshop --host 0.0.0.0 --port 36001

HappynessI avatar Nov 28 '25 15:11 HappynessI