工具主要应用场景:
集成电路(IC)行业,LSF用户。
为什么是LSF:
IBM® Platform™ LSF®是集成电路设计行业具有统治地位的集群管理调度系统。同免费开源的openlava和SGE等相比,LSF在功能扩展性和稳定性上具有极大的优势;同流行的slurm及PBS相比,LSF则在EDA兼容方面具有不可替代的地位。
LSF使用困境:
对LSF的用户来说,除了使用bsub这个任务分发命令,他们往往不得不记住如下指令以获取必要的集群、机器及任务信息。
bjobs : 获取任务信息。
bhosts :获取机器静态及动态信息。
lshosts :获取机器静态信息。
lsload :获取机器负载信息。
bqueues :获取队列信息。
同时,用户也常常因为一些更为复杂的应用场景感到困惑。
- 我的job怎么PEND了?(pend reason获取)
- 我的job为什么不动了?(进程追踪及分析)
- 我的job为什么失败了?(job EXIT原因定位)
- 我的job(EDA任务)为什么拿不到license?(EDA liecnse使用信息获取)
- 哪些jobs是违规的? (使用内存和申请内存不匹配)
- job很慢,host是不是过载了? (host的ut过高或者Mem过低)
- … …
解决方案:
IBM本身提供了RTM等额外套件辅助LSF信息获取和监控。
但是RTM价格昂贵且使用略显繁琐,对于LSF的普通用户来说,lsfMonitor则是一个简单易用的替代方案,它是一个免费开源的LSF数据采集和信息展示工具,用以满足用户基本的信息获取需求。
后面我们从如下方面展开介绍一下lsfMonitor。
- 下载、安装和配置
- 数据采集
- 信息展示
一、下载、安装和配置
下载:
您可以从https://github.com/liyanqing1987/lsfMonitor上获得lsfMonitor的源码。
Code -> Download ZIP可以直接下载zip格式的安装包。
安装:
将lsfMonitor源码包拷贝到安装目录,解压缩。(最好采用root账号,下同)
[root@n212-206-236 tools]# cd /ic/software/tools
[root@n212-206-236 tools]#
[root@n212-206-236 tools]# unzip lsfMonitor-master.zip
Archive: lsfMonitor-master.zip
9b3a71b88204bc56365623133ab643895d2eb187
creating: lsfMonitor-master/
inflating: lsfMonitor-master/LICENSE
inflating: lsfMonitor-master/README
creating: lsfMonitor-master/db/
extracting: lsfMonitor-master/db/.gitignore
...
目录更名为lsfMonitor(叫什么名字都可以),进入安装目录,确认安装文件完整。
[root@n212-206-236 tools]# mv lsfMonitor-master/ lsfMonitor
[root@n212-206-236 tools]#
[root@n212-206-236 tools]# ls lsfMonitor/
db docs install.py LICENSE monitor README requirements.txt
确认机器上的python版本为python3。(最好为python3.5版本及以上,极力推荐用anaconda3版本的python,可以省却依赖库的安装)
[root@n212-206-236 tools]# which python
/ic/software/tools/anaconda/Anaconda3-2021.05/python_bin/python
[root@n212-206-236 tools]#
[root@n212-206-236 tools]# python --version
Python 3.8.8
进入lsfMonitor安装目录,采用命令python install.py来安装。
[root@n212-206-236 tools]# cd lsfMonitor/
[root@n212-206-236 lsfMonitor]#
[root@n212-206-236 lsfMonitor]# python install.py
>>> Check python version.
Required python version : (3, 5)
Current python version : (3, 8)
>>> Generate script "/ic/software/tools/lsfMonitor/monitor/bin/bmonitor".
>>> Generate script "/ic/software/tools/lsfMonitor/monitor/bin/bsample".
>>> Generate config file "/ic/software/tools/lsfMonitor/monitor/conf/config.py".
Done, Please enjoy it.
如果当前的python版本不是anaconda3,可能还需要通过pip install -r requirements.txt文件来安装依赖库。(Anaconda3自带完全版本的python库,则不需要安装。)
建议把lsfMonitor安装路径中的lsfMonitor/monitor/bin路径设置到环境变量PATH中,这样就可以直接引用lsfMonitor的核心工具。
lsfMonitor有两个核心程序,bsample和bmonitor。
其中bsample用于进行LSF数据采集,bmonitor用于进行LSF信息展示,建议将bmonitor软链接到LSF bsub工具路径下,这样可以直接调用bmonitor。
执行bmonitor启动lsfMonitor的核心信息展示程序。
[liyanqing.1987@cmp207 ~]$ bmonitor
* Loading LSF basic information, please wait a moment ...
* Loading license basic information, please wait a moment ...
* Loading LSF jobs information, please wait a moment ...
* Loading LSF hosts information, please wait a moment ...
* Loading LSF queue information, please wait a moment ...
bmonitor图形界面启动,lsfMonitor安装成功。
配置:
安装目录下的monitor/conf/config.py是主要的配置文件。
[root@n212-206-236 lsfMonitor]# cat monitor/conf/config.py
# Specify the database directory.
dbPath = "/ic/software/tools/lsfMonitor/db"
# Specify lmstat path, example "/*/*/bin".
lmstatPath = ""
# Specify lmstat bsub command, example "bsub -q normal -Is".
lmstatBsubCommand = ""
dbPath用来配置数据库路径(存放LSF历史数据),可以采用默认值,也可以指定到其它的database路径。
lmstatPath用于LICENSE页,用于指定lmstat工具路径(仅路径,不要把lmstat也写上),而工具lmstat则是用来获取EDA license信息的。如果确保环境中直接可以找到lmstat,不指定也是可以的。
lmstatBsubCommand同样用于LICENSE页。由于IC环境中,登录节点上一般借用EDA port,导致登录节点上执行lsfMonitor时候,无法通过lmstat获取EDA license信息,因此需要将lmstat命令bsub到计算节点上,以确保能够获取EDA license信息,如果lsfMonitor的执行机器上即可执行lmstat,则此处无需配置。
二、数据采集
前面提到,lsfMonitor是一个开源免费的LSF数据采集和信息展示工具,它需要采集一些LSF的历史数据以供信息展示使用,bsample负责数据采集功能。
bsample位于<INSTALL_PATH>/lsfMonitor/monitor/bin下面。其工具手册为<INSTALL_PATH>/lsfMonitor/docs/bsample.txt。
如下是bsample的帮助信息。
usage: bsample [-h] [-j] [-q] [-H] [-l] [-u] [-i INTERVAL]
optional arguments:
-h, --help show this help message and exit
-j, --job Sample running job info with command "bjobs -u all -r -UF".
-q, --queue Sample queue info with command "bqueues".
-H, --host Sample host info with command "bhosts".
-l, --load Sample host load info with command "lsload".
-u, --user Sample user info with command "busers".
-i INTERVAL, --interval INTERVAL
Specify the sampling interval, unit is second.
Sampling only once by default".
它支持采集job/queue/host/load/user五种类型的数据,并将获取的数据保存到sqlite3数据库中。
它支持守护进程模式(即程序一直开启不退出),此时可以用-i指定采样间隔,但是我们更建议采用crontab的方式做周期性数据采集,如下是一个推荐的crontab demo。
(请将变量BSUB_PATH和INSTALL_PATH替换为路径)
# Sampling job/queue/load information for lsfMonitor (Frequency : 5 minutes)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:<BSUB_PATH>
*/5 * * * * <LSFMONITOR_INSTALL_PATH>/monitor/bin/bsample -j
*/5 * * * * <LSFMONITOR_INSTALL_PATH>/monitor/bin/bsample -q
*/5 * * * * <LSFMONITOR_INSTALL_PATH>/monitor/bin/bsample -l
当前bmonitor工具只需要用到job/queue/load的数据,但是bsample.py也可以采集host/user的信息,需要的话也可以启动相关的crontab来采集。
<INSTALL_PATH>/lsfMonitor/monitor/conf/config.py用于配置工具用到的环境变量installPath和dbPath,其中installPath指工具安装路径,安装时会自动设置,不要更改,dbPath指的是数据库存储路径,默认为dpPath = <INSTALL_PATH>/lsfMonitor/db,出于数据分离的目的,也可以把这个路径手工修改为自己创建的数据库路径。
如下是手工执行采样脚本的效果。
采样job数据。(root账号默认不能执行LSF指令,请采用其他账号执行)
[ic_admin@cmp235 bin]$ ./bsample -j
>>> Sampling job info ...
Sampling for job "114" ...
Sampling for job "296" ...
Sampling for job "5387" ...
Sampling for job "683" ...
Sampling for job "1833" ...
Sampling for job "3738" ...
采样queue数据。
[ic_admin@cmp236 bin]$ ./bsample -q
>>> Sampling queue info into /ic/software/tools/lsfMonitor/db/monitor/queue.db ...
Sampling for queue "normal" ...
Sampling for queue "***" ...
Sampling for queue "******" ...
...
采样load数据。
[ic_admin@cmp236 bin]$ ./bsample -l
>>> Sampling host load info into /ic/software/tools/lsfMonitor/db/monitor/load.db ...
Sampling for host "cmp***" ...
Sampling for host "cmp***" ...
Sampling for host "cmp***" ...
...
如果数据采样过程中遇到任何错误(比如权限问题),必须及时解决,以防止数据缺失或错误。
三、信息展示
工具bmonitor负责LSF信息展示功能,它位于<INSTALL_PATH>/lsfMonitor/monitor/bin下面。其工具手册为<INSTALL_PATH>/lsfMonitor/docs/bmonitor.txt。
如下是bmonitor的帮助信息。
usage: bmonitor.py [-h] [-j JOBID] [-u USER] [-f FEATURE] [-t {JOB,JOBS,HOSTS,QUEUES,LOAD,LICENSE}]
optional arguments:
-h, --help show this help message and exit
-j JOBID, --jobid JOBID
Specify the jobid which show it's information on "JOB" tab.
-u USER, --user USER Specify the user show how's job information on "JOBS" tab.
-f FEATURE, --feature FEATURE
Specify license feature which you want to see on "LICENSE" tab.
-t {JOB,JOBS,HOSTS,QUEUES,LOAD,LICENSE}, --tab {JOB,JOBS,HOSTS,QUEUES,LOAD,LICENSE}
Specify the current tab, default is "JOB" tab.
它支持指定jobid并直接展示其任务信息。
bmonitor是一个纯图形界面工具,包含六个页面 JOB/JOBS/HOSTS/QUEUES/LOAD/LICENSE。
JOB : 展示指定job的信息及其内存用量变化曲线。
JOBS : 展示指定条件下的所有job及其基本信息。
HOSTS : 展示指定条件下的所有机器及其基本信息。
QUEUES : 展示所有的队列及队列的基本信息和queue-job数目变化曲线。
LOAD : 展示指定机器的ut/mem变化曲线。
LICENSE : EDA license feature的用量及过期信息。
后面是针对bmonitor图形界面及用法的具体介绍。
3.1 整体界面及菜单栏
执行bmonitor打开的GUI界面首页如下。
其中菜单栏包含File/Setup/Help三项。
File -> Eixt : 退出。
Setup -> Fresh : 刷新JOBS/HOSTS/QUEUES界面(一次)。
Setup -> Periodic Fresh (1 min) : 周期刷新JOBS/HOSTS/QUEUES界面(每分钟)。
Help -> About lsfMonitor : 展示关于lsfMonitor的信息。
其中About信息为lsfMonitor的介绍,可以在<INSTALL_PATH>/lsfMonitor/README中查看其内容。
3.2 JOB页面
JOB页面显示一个JOB的基本信息。
如下是JOB页面的一个示例,在Job输入框输入jobid(job需要正在运行或者运行完毕不久),点击Check按钮,就可以在下方看到job的简略和详细信息,同时可以在右侧看到job生命周期内的memory用量变化曲线。
同时这个曲线是可以放大和移动的,点击放大镜按钮可以查看局部细节,将鼠标移到曲线图上可以查看点的XY坐标,点击小房子按钮可以恢复原状。
job进程追踪:
如果这个job就是lsfMonitor使用者本人的job,点击“Process Tracer”按钮,可以通过process_tracer工具追踪这个job对应的进程关系。
如果所有的进程都长期处于“S”状态,也就是sleep的状态,name程序看上去是“hang”住的,log可能也不再更新。
如果想继续追踪进程的动作,比如想知道如上process_tracer中的144642进程在干什么,可以直接点击PID列对应的pid,process_tracer会调用strace指令来追踪进程动作,如下。
查看job PEND原因:
如果当前job是PEND状态,那么在最下边的job信息栏,可以找到PENDING REASONS:信息,这就是job PEND的原因。
分析job失败原因:
如果一个EDA任务失败了,如何确定是LSF的问题还是EDA工具的问题?可以从job的Status和Exit Code两方面来确认。
如果job的Status是Done,说明LSF执行层面没有问题,且job执行的command退出码为0,应该是command内部其它命令导致的EDA失败。
如果job的Status是EXIT,那么需要进一步查看job信息中的Exited with exit code *信息,如果退出码小于127,一般是job执行的command本身的退出码,说明是command本身执行失败;如果退出码大于128,那么说明job本身遇到其它系统或者集群异常(比如job被kill了)。
3.3 JOBS页面
JOBS页面默认显示所有正在RUN的job及其基本信息。
也可以通过选择User/Status/Queue/Host来得到限定条件下的jobs。
如下是JOBS页面的一些行为:
- 点击Job列的jobid,会跳转到JOB页面,显示选中job的信息。
- 如果job的Mem值大于Rusage值,或者Rusage没有设,则job对应的Mem项会标红。
- 点击表格title,当列会按照数字或者字母排序。
查看job PEND原因:
如果job是PEND状态,点击Status列的PEND单元格,会弹出对话框,标明job PEND的原因。
查看大内存违规任务:
点击“Mem (G)”列标,让job按照内存用量从大到小排序,找到那些Mem用量很大但是没有设置Rusage值的job,或者Mem用量很大但是Rusage值很小的job,这些都是违规job,很容易挤死别人的任务。
3.4 HOSTS页面
HOSTS页面默认显示所有的机器及其基本的静态和动态信息。
也可以通过选择Queue来得到指定队列的hosts。
如下是HOSTS页面的一些行为:
- 点击Host列的机器名或者Njobs列的数字,会跳转到JOBS页面,显示对应机器上的所有jobs。
- 如果机器的Status变为unreach/unavail/closed_LIM,则机器对应的Status项会标红。
- 如果机器的Ut(cpu利用率)的值大于90,则机器对应的Ut项会标红。
- 如果机器的Mem(可用内存)跟Maxmem的比值小于0.1,则机器对应的Mem项会标红。
- 如果机器的Tmp(/tmp空间大小)为0,则机器对应的Tmp项会标红。
- 点击表格title,当列会按照数字或者字母排序。
3.5 QUEUES页面
QUEUES页面显示所有的queues及其基本的队列信息。
如下是QUEUES页面的一些行为:
- 点击QUEUE列的队列名,会显示对应queue的详细信息和历史PEND/RUN slots数目变化曲线。。
- 点击PEND列的数字,会跳转到JOBS页面,显示对应queue的所有PEND jobs。
- 点击RUN列的数字,会跳转到JOBS页面,显示对应queue的所有RUN jobs。
- 如果queue PEND的slots数目大于0,对应的PEND数字会标红。
3.6 LOAD页面
LOAD页面用于展示指定机器的cpu和memory历史用量变化曲线。
查找机器异常时间段:
尤其需要关注机器的ut值和available mem均为0的情况,一般来说这种情况意味着机器异常(宕机或者LSF服务丢失)。
主要关注内存用量,可以放大关键节点得到机器异常的时间点。
3.7 LICENSE页面
LICENSE页面用于展示EDA license的用量和过期信息。
查找指定EDA license信息:
可以按照“License Server”选取license信息,也可以从Show列表中选取“in use”的license信息,还可以在“License Featrure”中按照模糊检索的方式搜索指定的license信息。
备注:
欢迎大家使用lsfMonitor,如果遇到任何bug,或者有好的enhancement需求,可以联系liyanqing1987@163.com。
至于lsf的简易安装教程,则请参考https://my.oschina.net/liyanqing/blog/4694794。