ecFlow学习笔记:V5.0版本前瞻

目录

2020.03 更新版

数值预报中心从去年开始使用 ECMWF 开发的 ecFlow 运行业务系统,目前使用 4.11.0 版本。 最近 ECMWF 召开用户大会,浏览了部分 PPT,发现在支撑工具方面ECMWF有明确的发展目标。

ecFlow 官网已开源 V5.X 系列版本,目前最新版是 5.5。 在意大利的数据中心投入使用后,原有的 4.X 版本不再维护。

本文简要介绍官网上列出的 5.0版特性

为什么要 5.0 版

除了新增特性外,5.0 版最大的变动在于对底层的修改。

4.X 版本依赖 boost serialisation 库实现客户端和服务器的交互,这就需要依赖固定版本的 boost 库,以满足 ecFlow 不同版本之间的兼容性。 从而使得扩展现有类的能力受到限制。 例如编译 ecFlow 4.X 版本时,一般采用 boost 1.53.0 版本。

ecFlow 5.X 在客户端服务器通信中放弃对 boost 的依赖,现在使用 JSON 作为通讯数据。 因此未来的 ecFlow 5.X 可以使用不同版本的 boost 库。

5.X 版本还缩短了客户端与服务器的通信延迟。

为了支持创建 RPM 包而使用旧版本编译器,5.X 版本已放弃该功能。 ecFlow 需要至少支持 C++14 的编译器。

现在 ecFlow 使用新版的 C++ 编译器和特性,提高软件的性能。

下面简单介绍 5.X 版本的一些改动。

编译

注:本节为历史版本,ecFlow 官网中已删除

ecflow 5 系列只能使用 C++ 14 或更高版本的编译器来构建,例如 gcc 6.3 或 clang 6.0。

ecmwf 目前使用 gcc 7.3 和 clang 7.0

此外,它将使用最新的 Boost 版本Boost 1.71

在 ecflow 5 系列的将来版本中,不必使用相同的 boost 版本构建 ecflow 的客户端/服务器版本。

这是因为 ecflow 5 现在使用 JSON 进行客户端/服务器通信。

此外,GUI 将仅使用 QT5。

放弃的特性

注:本节为历史版本,ecFlow 官网中已删除

ecFlowview

因为许多 Linux 发行版已不再支持 MOTIF,所以 5.X 的界面不再包含 ecFlowview。

笔者注:将有效缩小软件包并缩短编译时间。

QT4

同时维护 QT4 和 QT5 太困难,诸如 QtCharts 的特性只有 QT5 中可用,所以不再支持 QT4。

inlimit

Suite/Family limit

Limit 提供简单的复杂均衡功能,限制某个 ecflow server 同时提交的作业数。 例如下面的 suite 中只有 2 个任务能同时运行。

suite test
 limit l1 2
 family f5
     inlimit l1
     task t1
     task t2
     task t3
     task t4
     task t5
     task t6
     task t7
     task t8
     task t9
 endfamily
endsuite

ecflow 5 系列将 limit 扩展到 Family。

当 family 被限制时,child 任务没有限制。 下面代码中,只有 2 个 family 可以同时运行。 每个 family 中的 task 可以同时运行。

suite test
 limit fam 2
 family f1
     inlimit -n fam
     task t1
     task t2
 endfamily
 family f2
     inlimit -n fam
     task t1
     task t2
 endfamily
 family f3
     inlimit -n fam
     task t1
     task t2
 endfamily
endsuite

下面示例中,我们想限制 family,也想约束 task,所以活动的 family 中只有一个 task 可以运行。

suite test
 limit fam 1
 limit T
 inlimit T
 family f1
     inlimit -n fam
     task t1
     task t2
 endfamily
 family f2
     inlimit -n fam
     task t1
     task t2
 endfamily
 family f3
     inlimit -n fam
     task t1
     task t2
 endfamily
endsuite

提交限制

limit 虽然提供简单的复杂均衡能力,但仍可能同时提交上百个作业,会带来一些问题:

  • 作业生成过程中磁盘/IO过多
  • 作业生成过程中服务器繁忙,GUI 响应延迟
  • 使类似 PBS / SLURM 等队列系统过载

我们需要可以限制 提交 任务数的负载管理功能。 当作业运行时,limit 令牌会被释放。

suite test_limit_on_submission
    limit disk 2
    family anon   
        inlimit -s disk   # Inlimit submission
        task t1
        task t2
        task t3
        task t4
        task t5
        task t6
        task t7
        task t8
        task t9
        task t10
        task t11
        task t12
    endfamily
endsuite

上面的系统中可以同时有超过 2 个的 active 状态作业,因为只限制同时处于 submitted 状态的作业数。

如果移除 -s 参数,则同时只能有两个 active 状态作业。

这将允许系统维护人员根据磁盘/io和队列系统可以承受的负载能力配置 suite。

注:NWPC 曾使用多种方法避免同时提交过多作业,该项功能将有助于降低系统的复杂度。

query 命令

提供一个新的 query 命令,用于查询 ecFlow 信息。 对于一些简单的查询任务,可以不用再使用 ecFlow 的 Python API。

# return node state to standard out
ecflow_client --query state /path/to/node

# state that can includes suspended
ecflow_client --query dstate /path/to/node

# return the current value as a string
ecflow_client --query repeat /path/to/node

# return the previous value as a string, does not modify real repeat
ecflow_client --query repeat /path/to/node   prev

# return the next value as a string, does not modify real repeat
ecflow_client --query repeat /path/to/node   next

# return set | clear to standard out
ecflow_client --query event /path/to/task/with/event:event_name

# returns the current value of the meter to standard out
ecflow_client --query meter /path/to/task/with/meter:meter_name

# returns the variable value to standard out
ecflow_client --query variable /path/to/task/with/var:var_name

# return true if expression evaluates false otherwise
ecflow_client --query trigger /path/to/node/with/trigger \"/suite/task == complete\"

时间调度

ecFlow 服务异常终止,或者其他原因可能会导致应该在某时间的运行的任务错过了启动时间而没有运行。

ecFlow 5 版本会尝试解决这个问题。

服务重新启动时,会读取 checkpoint 时间点。 我们会判断 suite 的时间与实际时间的过时程度,如果在一个小时内,suite 和时间属性会跟上真实时间。

因此:

  • 过去一个小时中的计划任务会执行
  • 过期的 auto-cancelled 节点会被移除
  • 过期的 auto-archived 节点会被归档
  • 任务超过 late 限定会被标记

脚本生成

作业脚本生成时间较长时,ecFlow 服务会在日志文件中写入一条消息。 但大部分情况都会被用户忽略,直到发生一些其他问题。

ecFlow 5.X 版本会通知 GUI 某个任务脚本的生成时间超过规定的限额,界面上会显示一个新的图标。 这有助于提早发现问题。

内部重构

序列化

上面提到过,5.X 版本中使用 JSON 代替 boost 序列化库。

checkpoint与缓存

ecFlow 服务在 checkpoint 时,会将所有的 definition 写入磁盘。 5.X 版本在写入文件前会在缓存中保存 definition 的字符串,当用户请求所有的 definitio n时,ecFlow 服务会快速地返回缓存的字符串。

auto sync

在 4.X 版本中,每当 GUI 中执行一个操作,会向服务器发送两个请求:

  • 执行命令
  • 执行sync命令,从服务器同步状态变化

在 5.X 版本中,我们支持 auto sync,将上述两个命令有效地组合为一条命令,减少 GUI 和 Python 客户端的延迟,提高响应速度。