APP下载

利用LSF API实现高性能计算机集群的机时统计

2014-05-14盛乐标周庆林

实验科学与技术 2014年2期
关键词:计算中心计算资源计费

盛乐标,周庆林

(南京大学 高性能计算中心,南京 210093)

近年来,由于高性能计算在科学研究、国防建设以及科技发展中的重要作用[1],国内对高性能计算机集群的建设兴趣有增无减。上海、无锡、广州等地纷纷建立了超级计算中心,国家也先后在天津、深圳、长沙、济南等地建立了国家超级计算中心。高校和科研院所也不断地增加高性能计算方面的投入[2-8]。由于各地高性能计算中心或超级计算中心都采取收费政策,因此,准确的计算机时统计信息不仅可以为进行高性能计算的用户提供可靠的计算量数据,也可为超算中心在制定计算服务价格时提供参考。目前,对用户计算机时的统计一般是依赖于LSF、PBS Pro、SGE等作业调度软件提供的计算机时统计功能。然而,这些作业调度软件所提供的计算机时统计功能并不完善,不一定适合高性能计算中心的个性化需求[9-10]。以Platform公司的LSF 7.5为例,其提供的bacct命令只能查询某段时间内用户累计使用的CPU time,而不能提供对应的wall time。因此,若需要以wall time作为计时计费的依据,则会遇到困难,但一些新建的高性能计算中心又的确对这方面有切实的需求。本文将探讨一种利用LSF API实现对用户计算机时(wall time)进行统计的程序设计。

1 机时统计策略

准确可靠的计算机时统计是高性能计算中心实施收费政策的前提。在Linux系统中,有两种较普遍的统计时间的方法:一种是CPU执行程序指令累计所使用的脉冲时间,称之为CPU time;另一种是用计时器(如手表)度量的实际时间,也就是我们日常生活中所使用的时间度量,称之为wallblock time,简称wall time。由此可见,CPU time只代表程序占用CPU的时间,更倾向于反映CPU的使用效率,并不能代表程序真实占用计算资源的时间,因为像进行I/O操作等消耗的时间都不在CPU time的统计范畴。Wall time则反映的是一个程序从开始运行到结束所总共用去的时间。对于通常的作业调度系统策略而言,一旦一个程序占用了一个CPU资源,即使该程序的CPU使用效率接近0 ,该CPU资源也不会释放给其他程序使用。由于计算资源是集群中所有用户共享的,并且计算资源的总量也是有限的。因此,与根据用户程序对CPU的使用效率计费相比,根据用户对计算资源的实际占用时间来计费要显得更加客观和公平。另外,由于作业调度软件自身的局限性,它们对程序CPU time的搜集并不一定准确。比如:对一些嵌套程序就无法统计到CPU time。综上所述,对于一个并行作业,用作业所用的wall time乘以用户占用的计算资源数(通常是CPU数)来计时计费是一种较优的策略。

2 软件设计

由于Platform LSF 7.5的计算机时统计程序bacct本身并不包含对作业wall time的统计,因此,我们必须通过编程手段来实现对用户作业wall time的统计。幸运的是,Platform LSF提供了应用程序接口API,方便我们编程。本文介绍的软件主要由一个C语言程序和一个Shell脚本程序构成。C语言程序负责利用LSF API库函数进行作业wall time和cpu time的统计,是整个软件的核心部分;脚本程序则在调用C语言程序的基础上分析出各个用户在不同时间段所总共占用计算资源的wall time。该软件的框架图见图1。

图1 机时统计软件系统框架图

2.1 LSF API

Platform LSF API包含两种类型的库:一是LSLIB,LSF的基础库,为外部应用使用LSF的基础服务提供支持;另一种是LSBLIB,LSF的批处理库,为外部应用提供作业提交、控制、操作等批量处理的服务接口。由于我们的目的是获取作业运行的wall time,无需LSF基础服务的支持,因此只需用到LSBLIB库。本文介绍的程序主要涉及LSBLIB库中的两个数据结构eventRec、jobFinishLog和一个函数lsb_geteventrec(),另有其他三个数据结构jobNewLog、jobStartLog和jobStatusLog可用作对作业其他信息进行统计的参考。函数lsb_geteventrec()需要读取LSF的lsb.events文件,该文件记录了与用户作业有关的关键信息。

在使用LSF API的LSBLIB库函数前,必须进行LSBLIB的初始化。初始化可以通过调用lsb_init()函数来实现,如果调用成功,返回0;否则,返回-1。一般我们会结合lsb_perror()函数将调用不成功的出错信息显示到标准错误终端。整个初始化的过程如下:

2.2 C语言编程

此部分主要是利用lsb_geteventrec()函数来实现对作业从开始到结束的所用时间进行统计,程序设计时涉及多个 C语言头文件,包括:stdio.h、stdlib.h、string.h、time.h,另外还包括两个 LSF软件所提供的头文件:lsf.h和lsbatch.h。

2.2.1 时间格式转换

由于该程序操作的主要对象就是时间,然而LSF的bacct程序对时间有一定的格式要求,为了程序设计的统一,我们将此C程序所需读入的时间参数格式确定为“年/月/日/小时:分钟”,如“2013/3/15/0:0”。另外,由于历史原因,计算机的计时系统存在一个千年问题,因此也需要在时间格式转换时加以考虑,下面列出了时间格式转换的主要代码。

2.2.2 获取作业wall time

此部分需要实现对某个用户在一段时间内累计使用的wall time和CPU time的统计。这里需要提到的是,有些多线程程序在运行时会占用多个CPU资源,这时可能出现CPU time比wall time还高的情况。在这种情况下,我们取两者中较高的值加入到累计机时中。程序的关键部分如下(省去了参数检查、lsb.events检查等部分):

2.3 编译、调用及后期处理

上述的C语言程序编写好后,需要使用如下命令编译成二进制可执行代码:gcc getwalltime.c-I/lsf-path/include LSF_LIBDIR/libbat.a LSF_LIBDIR/liblsf.a-lm-lnsl-ldl,编译后生成的可执行程序为getwalltime。此程序在运行时需提供三个参数,分别是:开始时间、结束时间和用户名,具体的形式是“getwalltime startTime endTime username”,比如“getwalltime 2013/1/1/0:0 2013/3/15/0:0 user”。外部程序若要调用该程序,方法类似。基于getwalltime程序,我们可以灵活地使用Shell脚本来对各个用户在特定的时间段里的计算机时进行统计,甚至生成具有一定格式的年度、月份统计报表。由于getwalltime除了可以获得作业的wall time之外,也可以获得CPU time,因此,我们可以通过计算CPU time与wall time的比值得到作业的CPU使用效率,一定程度上可以帮助我们了解作业的并行度是否合适,对于提高集群的整体利用效率可以起到一定作用。

3 结束语

利用LSF的API进行C语言编程,结合灵活的Shell脚本语言,可以设计出个性化的集群机时统计软件。在使用过程中我们发现该软件可以准确反映用户作业对计算资源的占用,为高性能计算中心的计费提供了有效可靠的数据,也大大方便了对集群年度、月份统计报表的制作。

[1]周毓麟,沈隆钧.高性能计算的应用及战略地位[J].中国科学院院刊,1999(3):184-187.

[2]严隽琪.上海高性能计算公共服务平台[J].工业工程与管理,2005(1):1-5.

[3]黄建忠,张沪寅,程媛.开放式高性能计算平台的建设与研究[J].计算机教育,2012(22):55-59.

[4]关伟豪,吴汝明,郭清顺,等.中山大学高性能计算服务平台的建设[J].实验技术与管理,2011,28(4):303-306.

[5]林皎,张武生,徐伟平.高性能计算平台开放服务的探索与实践[J].实验技术与管理,2012,29(3):334-336.

[6]林新华.走出高性能计算中心的建设误区[J].中国教育网络,2009(5):42-43.

[7]姚继锋.什么成就了超算中心[J].中国教育网络,2010(6):18-20.

[8]林皎,陈玉洁,张武生,等.高性能计算平台建设的探索与实践[J].实验技术与管理,2012,29(5):217-220.

[9]石京燕,孙功星.基于R-GMA体系结构的Open PBS记账系统[J].计算机工程,2008,34(4):269-271.

[10]陈振娅,杨英,陈丽娟,等.基于OpenPBS的高性能计算平台计费系统[J].山东科学,2009,22(5):98-102.

猜你喜欢

计算中心计算资源计费
中国—东盟人工智能计算中心正式发布
5G网络独立组网中融合计费方案的研究
基于云计算和微服务架构的高速公路计费系统
基于模糊规划理论的云计算资源调度研究
面向反应堆设计的高性能计算中心建设及应用
腾讯云首个5G边缘计算中心正式对外开放
生活中的分段计费
改进快速稀疏算法的云计算资源负载均衡
基于Wi-Fi与Web的云计算资源调度算法研究
耦合分布式系统多任务动态调度算法