asub : openlava任务cpu/memory资源自动预设工具

原创
2019/10/22 16:55
阅读数 5.1K

一、asub是什么

简单地说,asub是openlava bsub的一个wrapper脚本。它的作用是利用job历史数据帮助用户自动设定新job的cpu/memory reservation。

asub的需求来源是,很多用户不知道该如何为他们的job设置cpu和memory的资源预占量,从而导致了如下两个问题:

  1. job需要的cpu/memory资源很多,但是user没有申请或者申请很少,从而导致job运行机器资源耗尽,从而影响自己和他人的job正常完成。
  2. job需要的cpu/memory资源很少,但是user申请了过多的资源,从而导致job预占过多资源而不用,浪费资源,且影响别人的job投递(别人的job拿不到资源就跑不起来)。

 

为了解决如上两个问题,尤其是第一个问题,我开发了工具asub,让通过学习历史数据来预估job的cpu和memory资源用量,并在投递job的时候自动为用户设置reservation的值。

asub的github地址为https://github.com/liyanqing1987/openlavaMonitor,它作为openlavaMonitor的一个组件存在(另一个重要组件是bmonitor)。

 

二、asub的工作原理

asub的工作原理如下:

asub的完整流程如下:

  1. 管理员在后台利用专有程序采样(每5分钟)所有job当前的cpu/memory用量,并存储到sqlite数据库中。
  2. job完成后,后台工具自动分析job的cpu/memory的用量峰值和均值,同时将job的CWD/COMMAND信息以及cpu/memory的resource信息保存到sqlite数据库中。(一般CWD&COMMAND信息可以确定一个唯一的任务,COMMAND信息可以确定一类任务)
  3. 当调用asub投递任务的时候,从data base中抓取历史数据,分如下几种情况。
    3.1 如果data base中有和当前任务相同CWD及COMMAND的历史记录,认为是相同任务再次投递,取相同CWD&COMMAND历史记录的cpu均值的最大值和memory峰值的最大值,作为当前任务的资源预设量。
    3.2 如果data base中有和当前任务相同COMMAND的历史记录,但是没有CWD的历史记录,认为是新任务,取相同COMMAND历史记录的cpu均值的平均值和memory峰值的平均值,作为当前任务的资源预设量。
    3.3 如果data base中没有和当前任务相同的的CWD或COMMAND的历史记录,认为是一个新的任务,不自动设置cpu/memory reservation。

当然,如果user在asub的参数中指定了-n NUM或者-R “mem=MEM”,则asub直接使用user指定的值,而不会自动为其设置。

 

三、asub的数据采样及存储

参照openlavaMonitor/doc/batchRun.txt。

Tool "batchRun.py" is used to start tool "jobResourceSample.py"
on all openlava hosts.
Tool "jobResourceSample.py" is used to sample job resource 
(cpu/memory) usage data in real time on specified openlava host.
Tool "jobResourceMonitor.py" is used to analyze job resource
data and save user job resource data.


Suggest to start sampling job resource with crontab, below is an example.
====
# Sample job resource usage on every openlava hosts (Frequency : 5 minutes)
*/5 * * * * [ROOT]/openlavaMonitor/monitor/bin/batchRun.py
# Monitor user job resource usage (Frequency : 5 minutes)
*/5 * * * * [ROOT]/openlavaMonitor/monitor/bin/jobResourceMonitor.py
====

jobResourceSample.py是一个job数据采样程序,它会定期(按照你crontab设置的采样周期)采集当前机器上所有job的cpu和memory数据,并将job生命周期中所有的cpu和memory使用情况保存到sqlite数据库中。

batchRun.py是一个顶层的数据采样程序,需要确保执行它的账户有权限直接免密ssh登录所有的openlava机器。它会自动登录每台openlava机器,然后执行jobResourceSample.py来采样和保存数据。

jobResourceMonitor.py是一个数据分析程序,你也需要用crontab定期启动它,然后它会在job完成后分析job生命周期中cpu和memory的使用均值和峰值,并将之保存到sqlite数据库中。

 

四、例子

下面是一个例子,我们采用asub取代bsub来投递任务,看他如何通过分析和学习历史数据来不断修正任务的cpu/memory资源预设量。

  1. 第一次投递任务。

liberate的case,任务目录如下:

[yanqing.li@nx-end02 case_1]$ cd /ic/work/cad/wa/yanqing.li/test3/case_1
[yanqing.li@nx-end02 case_1]$ ls
environment.sh kflow.cfg kflow.tcl output pre_process rundecks run_liberate.sh run.sh tech utility

 

运行脚本为run.sh:

[yanqing.li@nx-end02 case_1]$ cat run.sh
#!/bin/bash

asub -Is -q kcell "./run_liberate.sh >& run_liberate.log"

 

所以我们可以得到,针对当次任务,job的CWD和COMMAND信息如下:

CWD : /ic/work/cad/wa/yanqing.li/test3/case_1

COMMAND : ./run_liberate.sh >& run_liberate.log

 

我们第一次用asub在这个CWD下面投递这个COMMAND的任务,效果如下。

[yanqing.li@nx-end02 case_1]$ ./run.sh
Notice:
1. asub is a wrapper of bsub.
2. asub only help you set cpu&memory reservation if they are not specified.
You should set other bsub setting by yourself.
3. Job command must be with double quotes "" like below:
bsub *** "COMMAND"

Not find CWD or COMMAND history data on sqlite database.
*Warning*: Not get history cpu data from sqlite database.
*Warning*: Not get history memory data from sqlite database.
*Notice*: Final bsub setting is as below.
bsub -Is -q kcell "./run_liberate.sh >& run_liberate.log"

Job <823078> is submitted to queue <kcell>.
<<Waiting for dispatch ...>>
<<Starting on dm014>>

Warning部分我们可以得知,asub在历史数据库中没有找到当前CWD或COMMAND相关的历史记录,所以它无法为你预设cpu/memory reservation。

 

此时数据库会留下如下记录:

id SAMPLE_TIME JOB STATUS CPU_RESERVED CPU_AVG CPU_PEAK MEM_RESERVED MEM_AVG MEM_PEAK RUN_TIME CWD COMMAND
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

9                     2019-10-17 16:50:03   823078                DONE                  NA                    3.3                   4.0                   NA                    3.037G                3.523G                1081                  /ic/work/cad/wa/yanqing.li/test3/case_1  ./run_liberate.sh >& run_liberate.log

 

2. 同一目录,同一命令,第二次运行。

此次测试更改liberate thread的数目,以改变job的cpu和memory资源用量。

然后第二次用asub丢同一个任务,效果如下:

[yanqing.li@nx-end02 case_1]$ ./run.sh
Notice:
1. asub is a wrapper of bsub.
2. asub only help you set cpu&memory reservation if they are not specified.
You should set other bsub setting by yourself.
3. Job command must be with double quotes "" like below:
bsub *** "COMMAND"

Find CWD and COMMAND history data on sqlite database.
Peak of job CPU_AVG : 4
Peak of job MEM_PEAK : 3523
Add cpu reservation "4" into bsub setting.
Add memory reservation "3523" into bsub setting.
*Notice*: Final bsub setting is as below.
bsub -n 4 -R "span[hosts=1] rusage[mem=3523]" -Is -q kcell "./run_liberate.sh >& run_liberate.log"

Job <823484> is submitted to queue <kcell>.
<<Waiting for dispatch ...>>
<<Starting on dm006>>

 

通过如下信息我们可以得知,数据库中找到了当前路径当前命令的历史记录。

Find CWD and COMMAND history data on sqlite database.
Peak of job CPU_AVG : 4
Peak of job MEM_PEAK : 3523

根据数据库中保留的相同CWD和COMMAND的历史数据(CPU_AVG的峰值为4,MEM_PEAK的峰值为3523Mb)。

根据以上记录,此时asub会直接将这个cpu/memory revervation带入bsub的setting,得到的实际bsub设置如下:

bsub -n 4 -R "span[hosts=1] rusage[mem=3523]" -Is -q kcell "./run_liberate.sh >& run_liberate.log"

 

此时数据库记录如下:

id SAMPLE_TIME JOB STATUS CPU_RESERVED CPU_AVG CPU_PEAK MEM_RESERVED MEM_AVG MEM_PEAK RUN_TIME CWD COMMAND
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

9                     2019-10-17 16:50:03   823078                DONE                  NA                    3.3                   4.0                   NA                    3.037G                3.523G                1081                  /ic/work/cad/wa/yanqing.li/test3/case_1  ./run_liberate.sh >& run_liberate.log

10                    2019-10-17 17:00:03   823484                DONE                  4                     0.6                   1.0                   3.44G                 2.074G                2.536G                541                   /ic/work/cad/wa/yanqing.li/test3/case_1  ./run_liberate.sh >& run_liberate.log

 

3. 不同目录,同一命令,第一次运行。

将测试用例case_1拷贝为case_2,重新运行。

此时CWD发生了改变,但是COMMAND不变,仍可以从数据库中抓取上面两条记录,但是计算resourece reservation的方式发生了改变。

如果data base中有和当前任务相同COMMAND的历史记录,但是没有CWD的历史记录,认为是新任务,取相同COMMAND历史记录的cpu均值的平均值和memory峰值的平均值,作为当前任务的资源预设量。

测试效果如下:

[yanqing.li@nx-end02 case_2]$ ./run.sh
Notice:
1. asub is a wrapper of bsub.
2. asub only help you set cpu&memory reservation if they are not specified.
You should set other bsub setting by yourself.
3. Job command must be with double quotes "" like below:
bsub *** "COMMAND"

Find COMMAND history data on sqlite database.
Average of job CPU_AVG : 2
Average of job MEM_PEAK : 3029
Add cpu reservation "2" into bsub setting.
Add memory reservation "3029" into bsub setting.
*Notice*: Final bsub setting is as below.
bsub -n 2 -R "span[hosts=1] rusage[mem=3029]" -Is -q kcell "./run_liberate.sh >& run_liberate.log"

Job <823892> is submitted to queue <kcell>.
<<Waiting for dispatch ...>>
<<Starting on dm003>>

 

根据数据库中的历史记录,cpu和memory的计算方法如下:

cpu = int((3.3+0.6)/2) = 2

mem = int((3523+2536)/2) = 3029

最终得到的bsub指令如下:

bsub -n 2 -R "span[hosts=1] rusage[mem=3029]" -Is -q kcell "./run_liberate.sh >& run_liberate.log"

 

五、总结

  1. asub的算法倾向如下:
    1.1 如果在同一个路径下运行同一个命令,asub倾向于设置较大的cpu和memory预占量。
    1.2 如果在不同目录下运行同一个命令,asub倾向于设置平均的cpu和memory预占量。
  2. asub主要基于历史数据做推算,不适用于新的极端的运行情况。如果user知道新的任务会占极小或者极大地资源用量,还是手工预设更合适。
展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
2 评论
0 收藏
0
分享
返回顶部
顶部