GrADS脚本偶发打开grib关联ctl文件报错但重跑成功,是什么原因?
GrADS在SUN Grid Engine环境下偶发无法打开二进制数据文件问题分析
错误信息
opening ctl file /data/myprogram/20211027/gribs/mygribname.grb.ctl Open Error: Can't open binary data file File name = /data/myprogram/20211027/gribs/mygribname.grb
加载ctl文件时自动打开grib文件的原因
GrADS的ctl文件是纯元数据描述文件,本身不存储观测/模式输出的实际数据。当你执行open命令加载ctl文件时,GrADS会自动读取ctl文件中dset配置行指定的二进制数据文件(也就是对应的grib文件)完成数据关联,这是GrADS的内置逻辑,不属于代码逻辑异常。
偶发报错、重跑即可恢复的根因(针对SUN Grid Engine集群环境)
- 分布式存储一致性延迟:绝大多数集群环境下的偶发文件找不到问题都来源于此。如果你的grib、ctl文件是上游作业刚生成的,存储节点的元数据还没同步到GrADS作业被调度到的计算节点,会导致计算节点的共享目录挂载视图中暂时看不到目标文件,重跑时同步完成即可正常读取
- 文件权限竞态条件:如果上游生成文件的流程有「先写文件、再修改读取权限」的逻辑,若GrADS作业刚好在文件写入完成、权限修改完成的间隙启动,会因为没有读取权限报错,重跑时权限配置已生效即可正常执行
- 计算节点存储挂载异常:部分计算节点可能偶发共享存储挂载超时、临时掉挂载的问题,作业刚好调度到异常节点时会无法访问共享目录下的文件,重跑时调度到正常节点即可恢复
- 节点文件句柄耗尽:如果作业被调度到负载极高的计算节点,节点上同时运行的进程耗尽了系统允许的最大打开文件数,会临时无法打开新的文件,后续其他进程释放句柄后重跑即可成功
排查优化建议
- 在GrADS脚本的
open逻辑前增加预校验逻辑,把目标grib文件的存在性、可读性检查结果输出到作业日志中,下次报错时可直接通过日志确认是否为节点侧文件可见性问题:
# 预校验示例 TARGET_GRIB=/data/myprogram/20211027/gribs/mygribname.grb if [ -f ${TARGET_GRIB} ] && [ -r ${TARGET_GRIB} ]; then echo "预校验:目标grib文件存在且可读" else echo "预校验:目标grib文件不存在/无读取权限,当前节点挂载目录文件列表如下:" ls /data/myprogram/20211027/gribs/ fi
- 若确认是存储同步延迟导致的问题,可在预校验通过后、执行GrADS逻辑前增加10~30秒的等待延时,或增加循环重试读取的逻辑
- 提交SGE作业时可增加节点亲和性配置,尽量将GrADS作业和上游生成grib/ctl文件的作业调度到同一计算节点执行,规避跨节点存储同步问题
内容的提问来源于stack exchange,提问作者Prachi
相关产品推荐
相关产品推荐

