ecFlow学习笔记02.4.3 —— Limit
目录
该教程的最新版已发布在GitHub上,请访问ecflow-tutorial-cn
这是 ecFlow 教程的一部分,完整教程请参看《ecFlow学习笔记02 —— 教程》
- *limits 提供简单的负载管理,限制提交到某个 ecflow_server 上的作业数目。
suite 设计者使用两种触发器:
- data dependency trigger:由 trigger 关键词设置
- courtesy trigger:由 limit 关键词设置
trigger 是第一种触发器。第二种用于防止同时运行过多的作业,实际上是一种人工的作业排队方法。因为 ecflow 不区分这两种触发器,不利于后续维护。所以引入 limit。
inlimit
limits 与 inlimit 同时使用。
首先定义limit:{shell}limit NAME N{/shell},通常放在 suite 级
接着将 定义一组想应用该 limit 的 task,将 {shell}inlimit NAME{/shell} 属性添加到节点。添加到 task 中将该 task 加入到 limit 组;添加到 family 将该 family 下的所有任务添加到 limit 组。
limit 的效果是确保该组中同时运行的任务数不超过 N。一个节点可以被多个 limit 限制。
ecf脚本
创建有九个 task 的 family f5。
在 {shell}$HOME/course/test/f5/{/shell} 目录下创建这些 ecf script 脚本,每个内容如下:
%include <head.h> echo "I will now sleep for %SLEEP% seconds" sleep %SLEEP% %include <tail.h>
suite definition
在 suite definition 中添加 limit。
文本方式
# Definition of the suite test.
suite test
edit ECF_INCLUDE "$HOME/course"
edit ECF_HOME "$HOME/course"
limit l1 2
family f5
inlimit l1
edit SLEEP 20
task t1
task t2
task t3
task t4
task t5
task t6
task t7
task t8
task t9
endfamily
endsuite定义语法
limit ::= "limit" >> ( identifier >> unsigned int ) >> +nextline inlimit ::= "inlimit" >>( (nodePath >> ":“ >> identifier) | identifier )) >> ! unsigned int >> +nextline
Python方式
#!/usr/bin/env python2.7
import os
import ecflow
def create_family_f5() :
f5 = ecflow.Family("f5")
f5.add_inlimit("l1")
f5.add_variable("SLEEP", 20)
for i in range(1, 10):
f5.add_task( "t" + str(i) )
return f5
print "Creating suite definition"
defs = ecflow.Defs()
suite = defs.add_suite("test")
suite.add_variable("ECF_INCLUDE", os.path.join(os.getenv("HOME"), "course"))
suite.add_variable("ECF_HOME", os.path.join(os.getenv("HOME"), "course"))
suite.add_limit("l1", 2)
suite.add_family( create_family_f5() )
print defs
print "Checking job creation: .ecf -> .job0"
print defs.check_job_creation()Python API
ecflow.InLimit
创建
InLimit(name, optional, optional)
string name : The name of the referenced Limit
string path : The path to the Limit, if this is left out, then Limit of 'name' must be specified
some where up the parent hierarchy
int value : The usage of the Limit. Each job submission will consume 'value' tokens
from the Limit. defaults to 1 if no value specified.使用
inlimit = InLimit("fast","/x/f", 2)
...
family.add_inlimit(inlimit)ecflow.Limit
创建
Limit(name,value) string name: the name of the limit int value: The value of the limit
使用
limit = Limit("fast", 10)
...
suite.add_limit(limit)任务
- 修改
- 替换 suite definition

- 在 ecflowview 中观察 {shell}limit l1{/shell}
- 打开 l1 的 info 面板

- 修改 limit 的值

- 打开 /test/f5 下某个排队 task 的 Why 面板

词汇表
ecflow_server
trigger
limit
inlimit
suite
task
family
node
ecf script
suite definition
ecflowview
queued
