调度器动态配置参数#

SkyForm AIP调度器的部分参数可以动态修改。动态修改这些配置参数不会重启调度器,在调度器内存中的作业数据不会受到影响。参数调整后,调度器会自动更新或生成新的配置文件。 这些配置文件都保存在/opt/skyformai/etc中。原有的文件会被修改成 文件名.时间戳

只有root或AIP集群管理员可以修改调度器参数。AIP集群管理员定义在 cb.yaml 的cluster:adminnistrators里。

配置修改的命令为 aip

修改主机组#

命令:aip hostgroup|hg

当参数修改成功后,cb.yaml文件中的hostgroups段落会被删除,所有主机组配置存放在/opt/skyformai/etc/hg.yaml中。

新增主机组#

命令:aip hostgroup|hg create|c 主机组名 主机名 主机名 …

例子:

aip hg c research1 node10 node13
cmgroup research1
GROUP_NAME    HOSTS
research1     node10 node13

条件:主机组里的主机名必须是集群中合法的主机名。

删除主机组#

命令:aip hostgroup|hg delete|d 主机组名

例子:

aip hg d research1
cmgroup research1
research1: No such user group or host group

条件:主机组名存在于调度器中,并且没有被配置到队列(queues)或limits中。

添加主机组成员#

命令:aip hostgroup|hg addmembers|am 主机组名 主机名 主机名 …

例子:

aip hg am research1 node14 node16
cmgroup research1
GROUP_NAME    HOSTS
research1     node10 node13 node14 node16

条件:主机组必须已经建立,添加的主机名必须是集群中合法的主机名,而且这些主机上没有运行的作业

减少主机组成员#

命令:aip hostgroup|hg delmembers|dm 主机组名 主机名 主机名 …

例子:

aip hg dm research1 node10 node13
cmgroup research1
GROUP_NAME    HOSTS
research1     node14 node16

条件:主机组必须已经建立,减少的主机名必须是集群中合法的主机名,而且这些主机上没有运行的作业

修改用户组#

命令:aip usergroup|ug

当参数修改成功后,cb.yaml文件中的usergroups段落会被删除,所有用户组配置存放在/opt/skyformai/etc/ug.yaml中。

备注

除了新增和删除用户组需要集群管理员的权限,用户组管理员有权限修改用户组其他参数,包括:增删组员和各种上限。用户管理员也可修改组管理员, 修改后自己就失去了该组的管理员权限。

新增用户组#

命令:aip usergroup|ug create|c [JSON用户组定义文件 | JSON用户组定义字串]

用户组定义的JSON格式如下:

{
  # 用户组名,值不能为空、与已有的用户同名,或者与系统中任何一个用户同名
  "Group": "组名",

  # 组员,值不能为空,可含多个用户、或已有的其他组名。
  # 如果成员名只有一个值为:@system,表示组名与操作系统中(如LDAP)的一个组同名,
  # 成员为系统中改组的成员。调度器每小时从系统中同步一次。同步间隔可以用cb.yaml里的
  # egroup_update_interval调整
  "Members": ["用户1", "用户2", "用户组2"],

  # 组管理员。可选填。用户必须是操作系统中已有的用户
  "Admin": "",

  # Fairshare串,选填,一般为空
  "UserShares": "",

  # 用户组总运行作业槽上限,选填,缺省为-1,即无限
  "MaxSlots": -1,

  # 每个组成员用户运行作业槽上限,选填,缺省为-1,即无限
  "UserJobLimit": -1,

  # 用户组总运行作业数上限,选填,缺省为-1,即无限
  "MaxJobs": -1,

  # 用户组总GPU卡数上限,选填,缺省为-1,即无限
  "MaxGpus": -1
}

添加后可以用命令aip ug icugroup 查看结果。

条件:用户名必须是集群操作系统中合法的用户名。

删除用户组#

命令:aip usergroup|ug delete|d 用户组名

例子:

aip ug d 我的组

条件:用户组名存在于调度器中,并且没有被配置到队列(queues)或limits中。

添加用户组成员#

命令:aip usergroup|ug addmembers|am 用户组名 用户名 用户名 …

例子:

aip ug am 我的组 u003 u004

条件:用户组必须已经建立,添加的用户名必须是集群操作系统中合法的用户名。

减少用户组成员#

命令:aip usergroup|ug delmembers|dm 用户组名 用户名 用户名 …

例子:

aip ug dm 我的组 u001 u002

条件:用户组必须已经建立,减少的用户名必须是集群操作系统中合法的用户名。

修改用户组管理员#

命令:aip usergroup|ug admin|a 用户组名 管理员用户名

用户组的管理员可以观察和管理组成员的作业、以及修改组成员、修改用户组资源上限、并修改用户组管理员(修改后自己就失去了管理员权限)。

备注

用户组管理不一定必须是该用户组的成员。

例子:

aip ug a 我的组 cadmin

修改用户组资源限制#

命令:aip usergroup|ug grouplimit|gl 组作业槽上限(MaxSlots) [组作业数上限(MaxJobs) [组GPU卡上限(MaxGpus)]]

每一项的值:

  • “-1”:无限

  • “-2”:原有的值不变

  • 任何0或其他正整数:修改的值

例子1,修改组作业槽上限到100:

aip ug gl 我的组 100

例子2,修改组作业数上限到20:

aip ug gl 我的组 -2 20

例子3,修改组GPU卡上限到10:

aip ug gl 我的组 -2 -2 20

例子4,去掉所有上限:

aip ug gl 我的组 -1 -1 -1

例子5,修改作业槽上限到100,修改组GPU卡上限到5:

aip ug gl 我的组 100 -2 5

修改用户组成员作业槽上限#

命令:aip usergroup|ug userlimit|ul 组员作业槽上限(UserJobLimit)

修改的值:

  • “-1”:无限

  • 任何0或其他正整数:修改的值

例子1,修改组成员作业槽上限到20:

aip ug ul 我的组 20

例子1,去掉组成员作业槽上限:

aip ug ul 我的组 -1

修改用户作业上限#

命令:aip user|u

当参数修改成功后,cb.yaml文件中的users段落会被删除,所有用户作业上限配置存放在/opt/skyformai/etc/u.yaml中。

修改用户运行作业槽上限#

命令:aip user|u limit|l 用户名 运行作业槽上限

例子1,修改用户u001的运行作业槽上限到64:

aip u l u001 64
cusers u001
USER/GROUP         MAXPEND    MAX  NJOBS   PEND    RUN  SSUSP  USUSP    RSV
u001                    -     64      0      0      0      0      0      0

例子2,去除用户u001的运行作业槽上限:

aip u l u001 -1
cusers u001
USER/GROUP         MAXPEND    MAX  NJOBS   PEND    RUN  SSUSP  USUSP    RSV
u001                    -      -      0      0      0      0      0      0

修改用户最多等待的作业数#

命令:aip user|u pendlimit|pl 用户名 等待作业数上限

例子1,修改用户u001的等待作业数上限到1000:

aip u pl u001 1000
cusers u001
USER/GROUP         MAXPEND    MAX  NJOBS   PEND    RUN  SSUSP  USUSP    RSV
u001                 1000      -      0      0      0      0      0      0

例子2,去除用户u001的运行作业槽上限:

aip u l u001 -1

修改队列#

命令:aip queue|q

当参数修改成功后,cb.yaml文件中的queues段落会被删除,所有队列配置存放在/opt/skyformai/etc/queue.yaml中。

备注

只有集群管理员才可以修改队列。

新增队列#

命令:aip queue create|c [JSON队列定义文件 | JSON队列定义字串]

队列定义的JSON格式如下:

{
  # 队列名,值不能为空、与已有的队列同名
  "Name": "队列名",

  # 优先级,值不能为空。可以是任意正整数,数字越大,优先级越高
  "Priority": 3,

  # 说明。可选填
  "Description": "",

  # 主机,选填,多个主机或主机组名用空格隔开。如果为空,表示队列可用集群所有主机
  "Hosts": "主机1 主机组2",

  # 用户,选填,多个用户名或用户组名用空格隔开。如果为空,表示所有用户都可已用该队列
  "Users": "",

  # 队列运行作业槽上限,选填,缺省为-1,即无限
  "Maxslots": -1,

  # 每个用户在这个队列中运行作业槽上限,选填,缺省为-1,即无限
  "Usermaxslots": -1,

  # 是否为专属队列,选填,缺省为“no”
  "Dedicated": "no",

  # 缺省资源需求,选填,缺省为无
  "Resreq": "",

  # 队列管理员用户名,多个用户名可用空格隔开,可以管理队列中其他用户的作业,选填,缺省为无
  "Administrators": ""
}

备注

队列的其他参数可以后继通过编辑文件和重启调度器生效。

添加后可以用命令aip q icqueues 查看结果。

删除队列#

命令:aip queue|q delete|d 队列名

例子:

aip q d queue1

条件:队列名存在于调度器中,不是缺省队列,并且队列中没有作业,队列没有被配置在limits中。

修改队列参数#

命令:aip queue update|u JSON队列参数字串

JSON队列参数字串中Name必须指定,表示所修改的队列。参数只支持以上新增队列中可以指定的参数,其他参数需要通过编辑/opt/skyformai/etc/queue.yaml,并重启调度器生效。

例子,修改队列testqueue的用户和资源需求:

aip q u '{"Name":"testqueue","Users":"u001 u002","Resreq":"order[ut]"}'

修改调度参数#

命令:aip parameter|p update|u ‘参数JSON字串’

警告

由于系统yaml包的兼容性问题,该功能只在x86_64上测试过,在ARM上不能正常工作。

当参数修改成功后,原cb.yaml文件备份至/opt/skyformai/etc/history中,/opt/skyformai/etc/cb.yaml中的general段落会被更新。

以下参数可以放到参数JSON字串里,每个参数的定义参考 cb.yaml 里general的说明。

Memperiod#

general:memperiod参数,已完成作业在调度器内存中存放的时间,单位为秒。

Default_queue#

general:Default_queue参数,缺省队列名,多个名字放到同一字符串的值中,用空格隔开,如”medium vnc”。

Rootcanrun#

general:rootcanrun参数,值为”yes”或”no”。是否允许root用户提交作业。

Idle_action_trigger_duration#

general:idle_action_trigger_duration参数,值为大于1的正整数,单位分钟。定义检测作业CPU利用率不够后多长时间触发配置的脚本。

Elastic_job#

general:Elastic_job参数,值为”yes”或”no”,是否允许弹性作业调度。

Gpu_share_spread#

general:Gpu_share_spread参数,值为”yes”或”no”。在GPU分片或VGPU场景下,调度器是否在每台主机上调度GPU时考虑负载均衡。

Sched_interval#

general:sched_interval参数,值为正整数,单位秒。调度器两次调度作业的间隔。

Jm_interval#

general:jm_interval参数,值为正整数,单位秒。每台主机上的作业管理器(cbjm)定时检查作业状态的间隔。

Max_array_size#

general:max_array_size参数,值为正整数,作业阵列最大单元数。

Job_fail_close_host#

general:job_fail_close_host参数,作业连续失败后关闭主机的配置。具体语法参考 cb.yaml

Max_cbdata_job_num#

general:max_cbdata_job_num参数,最大cb.data文件数。

Max_stream_records#

general:max_stream_records参数,/opt/skyformai/work/data/stream中文件的最多记录(行)数。

Estream_interval#

general:estream_interval参数,cbsched定期把作业、队列、主机等数据写到一个estream_dir下的间隔时间,单位:秒。

Max_periodic_task_interval#

general:max_periodic_task_interval参数,cbsched定期检查、执行非调度任务(如作业清理,cb.data滚动等)的时间间隔,单位:秒。

Max_jobclean#

general:max_jobclean参数,cbsched每次从内存中清理结束的作业时,为了及时响应命令,内次清理的最多作业数。

User_view_alljobs#

general:user_view_alljobs参数,值为”yes”或”no”。是否允许一般用户查看所有用户的作业信息。

警告

这个参数调整后jservice需要手工重配置(csadmin jsreconfig),否则bjobs命令查到的作业数据不受影响。

例子:

aip p u '{"Memperiod":1000,"Max_jobclean":1500}'

以上命令修改Memperiod和Max_jobclean,修改后可用命令”aip p i”查看:

aip p i
{
  "ParamConf": {
    "Memperiod": 1000,
    "Default_queue": "medium",
    "Cgroup": "acct",
    "Idle_action_trigger_duration": 1,
    "Elastic_job": "yes",
    "Sched_interval": 4,
    "Jm_interval": 3,
    "Max_array_size": 10000,
    "Preemption_suspend": "yes",
    "Job_terminate_interval": 10,
    "Mailprog": ":",
    "User_view_alljobs": "yes",
    "Max_cbdata_num": 1024,
    "Max_stream_records": 100000,
    "Max_cbdata_job_num": 100000,
    "Egroup_update_interval": 3600,
    "Dedicated_queue_include_unavail": "yes",
    "Max_jobid": 2147483646,
    "Estream_interval": 30,
    "Max_periodic_task_interval": 300,
    "Estream_dir": "/opt/skyformai/work/data/estream",
    "Max_jobclean": 1500
  },
  "PowerConf": {},
  "ScaleConf": {}
}

修改部分limit参数#

命令:aip limit|l update|u ‘参数JSON字串’

JSON limit参数字串中Name必须指定,表示所修改的limit。当参数修改成功后,cb.yaml文件中的limits段落会被删除,所有limit配置存放在/opt/skyformai/etc/limit.yaml中。

备注

  • limit管理员有权限修改参数。limit管理员也可修改limit管理员用户名,修改后自己就失去了管理该limit的权限。

  • 增删limit或修改limit其他参数可以通过修改cb.yaml或limit.yaml文件,然后重启调度器生效: csasdmin reconfig

以下参数可以放到参数JSON字串里,每个参数的定义参考 cb.yaml 里limit的说明。

Name#

所修改limit的名字,必填。该名字的limit必须已经存在与系统中。

Admin#

limit管理员用户名,可修改。

Slots#

修改slots上限。

Jobs#

修改作业数上限。

ResName#

修改资源上限,定义资源名,如gpu。ResLimit必须同时定义。

ResLimit#

修改资源使用上限。ResName必须同时定义。

例子1,用户u001是limit vnc的管理员:

$ cresources
LIMIT  vnc
ADMIN: u001
APPS     : cubevnc
PER_USER : all
  expand : root u002 u003 cadmin u001
JOBS       : 2

$ aip l u '{"Name":"vnc","Jobs":1}'      #把作业数上限改成1

例子2,修改GPU使用上限:

$ cresources
LIMIT  gpu1
ADMIN  u002
USERS    : test1
  expand : u002 u003
  RESOURCE     : gpu : 1.0

$ aip l u '{"Name":"gpu1","ResName":"gpu","ResLimit":2}'