运行OpenAI Gym的脚本在无显示器远程服务器上出现内存泄漏
内存占用过高问题解决思路
1. 排查pyvirtualdisplay资源泄漏
- 你当前的代码没有在运行结束后停止虚拟显示实例,加上很多老版本pyvirtualdisplay存在后台进程残留的问题,每次启动Display都会新起Xvfb进程不会自动销毁,单次运行或重复运行都可能积累内存占用。
- 修复方法:把虚拟显示的启动销毁放到上下文管理器里,确保用完自动释放:
with Display(visible=0, size=(1400, 900)) as virtual_display: # 把后续创建env、运行episode的代码全部放到这个缩进块里 env = gym.make('CartPole-v1') # ... 其余运行代码 ... # 运行结束后自动调用stop()释放Xvfb资源
- 额外清理:如果之前多次运行过脚本未正常关闭资源,先手动杀服务器上残留的Xvfb进程:
ps aux | grep Xvfb | grep -v grep | awk '{print $2}' | xargs kill -9
2. 修复Monitor的内存缓存问题
- 老版本gym的
wrappers.Monitor默认会把所有帧、元数据全部缓存到内存里直到env关闭,哪怕你只跑10步也会持续累积数据,叠加虚拟显示的渲染缓存就会出现内存暴涨的情况。 - 修复方法:
- 不需要录视频的话直接删掉Monitor包装代码,CartPole不录制视频完全不会触发渲染逻辑,内存占用会降到MB级
- 确实需要录视频的话,给Monitor加参数限制缓存:
env = wrappers.Monitor(env, './videos/' + str(time()) + '/', video_callable=lambda episode_id: episode_id%100==0, force=True),同时每次运行结束必须调用env.close()主动释放缓存资源
- 注意:你当前的代码运行完episode之后没有调用
env.close(),所有录制的帧数据都会一直留在内存里不会释放
3. 排查依赖版本兼容性
- 如果你用的是gym 0.18~0.21之间的版本,和pyvirtualdisplay 2.0以上版本存在已知的内存泄漏bug,要么把gym降到0.17.3,要么把pyvirtualdisplay降到1.3.2即可解决
- 如果你升级到了Gymnasium(原OpenAI Gym的后续维护版本),要改用
gymnasium.wrappers.RecordVideo替代旧的Monitor,旧版Monitor在新环境里本身就会导致内存泄漏
内容的提问来源于stack exchange,提问作者ava_punksmash
相关产品推荐
相关产品推荐

