NWPC笔记:获取模式积分任务的执行进度

目录

数值预报模式积分运行时间较长,我们一般会使用 ecFlow 的 meter 标尺功能展示模式积分的进度,该进度也用于触发后续的后处理任务。 虽然大部分后处理任务已与模式积分系统分离,形成单独的后处理系统,但因为 ecFlow 无法提供跨服务的标尺触发功能,所以目前标尺的作用主要是为运维人员提供直观的积分进度信息。

下面介绍几种我们曾经使用和目前正在使用的生成 meter 标尺的方式。

模式程序调用 ecflow_client

在模式代码中直接调用 shell 命令,在 ecFlow 的前任 SMS 时代,我们的模式系统采用的都是这种方法。

GRAPES GFS 2.1.1.1 版中调用 smsmeter 的语句如下所示。每步积分结束后,会打印一行语句到标准输出,并执行shell命令。

IF ( on_monitor() ) THEN
    WRITE ( message , FMT = '("processing for step ",I8)' ) step
    CALL end_timing ( TRIM(message) )
!   add for sms monitor
    WRITE(smscall,' (''smsmeter steps '',I8,''&'') ') step
    CALL SYSTEM(TRIM(smscall))
ENDIF

效果如下图所示:

模式积分过程中执行 smsmeter 系统调用

这种方式最直接,不需要设置额外的任务。 但随着模式分辨率的提高,对模式计算效率的要求越来越高,执行 shell 命令额外耗费时间逐渐成为性能瓶颈。 所以目前我们的业务系统已基本不再使用这种方式更新模式积分进度,而使用下面两种间接的监控方式。

检测输出日志

上面代码中可以看到,每步积分会向标准输出中打印一行带有积分步数和执行时间的语句。 GRAPES GFS的积分输出的 std.out.0000 文件中有类似的内容:

Timing for processing for step     2871:    0.37310 elapsed seconds.

在模式积分进行时,启动额外的任务循环提取类似的行,并获取当前的积分进度。

grep "Timing for processing for step" std.out.0000 > step.txt
tailline=`tail -1 step.txt`
echo "tailline=", $tailline

fcst_step=`echo $tailline | sed "s/.*step \(.*\):.*/\1/g"`
ecflow_client --meter step $fcst_step

效果如下图所示:

检测输出日志文件中的积分步骤

检测数据文件输出

模式积分会在特定的步数输出数据文件,另外一种监控方式则直接按时效检测输出文件,省去从积分步数到积分时效的换算。

typeset -Z3 FFF
for fhour in `seq 0 ${mfcast_len} `
do
   FFF=$fhour
   fileExist=".false."
   while [ $fileExist = ".false." ]
   do
      if [ -s postvar${begintime}${FFF}00 ]; then
         sleep 3
         ecflow_client --meter=fcstHours $fhour
         fileExist=".true."
      else
         sleep 60
      fi
   done
done

效果如下所示:

检测输出的 postvar 文件

这种方式以积分时效作为标尺,显示更加直观,也更容易触发后续的后处理作业。