IBM的Spectrum LSF software是每个芯片工程师或多或少都会接触到的一套软件系统,LSF是Load Sharing Facility的缩写,顾名思义,这套软件是用于管理资源负载的,使资源最大化被各个用户所使用。
LSF主要功能有3点:1. 管理硬件和软件资源;2. 调度和运行jobs;3. 监控jobs的状态。我们从LSF资源和LSF软件讲下。
1. LSF资源
LSF的资源有硬件资源和软件资源,硬件资源有计算机、磁盘、内存等。软件资源有license等。
硬件资源中定义了Cluster(集群)的概念,Cluster是将一组computer(host)打包成一个整体,它们共享算力和资源。Cluster的host可以简化为3类:management host、execution(compute) host和Submission(client) host,三者安装了LSF的完整或部分软件。Management host充当集群的总体协调器、队列管理、作业派发,一般不跑普通用户计算任务。Execution host用于执行任务。Submission host用于提交任务。
User通常在Submission host上提交jobs,Management host根据jobs的类型和资源需求来选择合适的Execution host去执行jobs。根据需求,这些execution host可以使用共享的NFS memory或者使用自己local的memory去执行任务。如果使用local memory,那么execution host和submission host之间需要互相copy的文件会比较多,但是执行jobs的速度可能更快,因为它不需要和其它host去争抢NFS 磁盘的IO读写资源。

用户提交jobs到LSF的常用命令就是bsub,在提交bsub可以指定一系列需求,比如服务器类型、OS类型、memory大小、CPU个数、EDA license数目和host空闲程度等。这么多复杂的需求,就是靠LSF软件系统去维护,它需要定期监控各个软硬件资源的使用情况,然后从jobs队列(queue)中挑出符合的job丢给execution host去执行,并把执行结果返回给user(不管成功与否),而且还要根据user查询类型反馈系统的状态信息。
2. LSF软件
集群中的每台host的角色不一样,因此运行的LSF进程类型和数量也不一样。主要的LSF进程有以下几种。
Daemon Role
mbatchd Job requests and dispatch
mbschd Job scheduling
sbatchd Job execution
res Job execution
lim Host information
pim Job process information
elim Dynamic load indexes
mbatchd (Management batch daemon **)**是运行在management host上的,它负责系统中jobs的整体状态。接收jobs提交和信息查询请求。管理queue中保存的jobs。将jobs分派到由mbschd选择的主机。
mbschd (Management batch scheduler daemon **)**也是运行在management host上的。它mbatchd一块配合工作,它会根据jobs需求、策略和资源可用性做出调度决策。将调度决策发送到mbatchd。
sbatchd (Server batch daemon **)**运行在每个服务器host上,包括management host。从mbatchd接收运行jobs的请求,并管理jobs的本地执行。负责执行本地策略并维护host上的jobs状态。sbatchd为每一个job都创建一个子sbatchd。子sbatchd运行一个res实例来创建job运行的执行环境。当作业完成时,子sbatchd退出。
res (Remote execution server **)**在每个服务器host上运行。接受远程执行请求,为jobs和tasks提供可靠、安全的远程执行。
lim (Load information manager ) 运行在每个服务器host上,它收集host负载和配置信息,并将其转发给运行在management host上的host LIM。当LIM启动或cpu (ncpu)数量发生变化时,将上报静态负载指数**(** static load index )。在management host上运行的LIM(Parent LIMIT)会接收集群中各host上运行的lim的负载信息。并把负载信息转发给mbatchd,后者将此信息转发给mbschd以支持调度决策。如果management host上LIM不可用,则management candidate host上的LIM自动接管。
pim (Process information manager **)**是每个服务器主机上运行的进程信息管理器。由LIM启动,LIM会定期检查PIM并在它死亡时重新启动它。pim收集host上运行的job进程信息,如job占用的CPU和内存等,并将这些信息报告给sbatchd。
elim (External LIM ) 是一个站点可定义的可执行文件,它收集和跟踪自定义的动态负载指数**(** dynamic load index )。ELIM可以是shell脚本或编译的二进制程序,它返回用户定义的动态资源的值。ELIM可执行文件必须命名为ELIM。并位于LSF_SERVERDIR中。
上述这些LSF进程在management host和computer host的分布如下图。

上述这些LSF进程的调用关系如下图:

Static Load Index和Dynamic Load Index的区别:
- Static Load Index(静态负载指数):LIM 启动时读取、硬件 / 配置不变就几乎不动;lshosts查看;
- Dynamic Load Index(动态负载指数):LIM 每~15s 周期性采样、EWMA 平滑;lsload查看;还可以通过 ELIM 自定义额外动态指数;
Static Load Index(内置静态,lshosts)
| 名称 | 含义 | 单位 / 备注 |
|---|---|---|
| ncpus | 检测到的 CPU 数量 | 核数(LSF 用来算归一化 run‑queue) |
| ndisks | 本地磁盘数目 | 块设备数 |
| maxmem | 整机最大可用内存 | MB(物理 RAM 总量) |
| maxswp | 整机最大 Swap 总量 | MB |
| maxtmp | /tmp 文件系统总容量 | MB |
| cpuf | CPU 归一化因子 | 相对速度值(用来跨机型校正 r1m 等) |
| type | 主机类型 | 字符串(OS + 架构) |
| model | 主机型号 | 字符串 |
| server | 是否为 Server host | bool(Yes/No,能否执行作业) |
Dynamic Load Index(内置动态,lsload)
| 名称 | 含义 | 别名 | 说明 & 工程要点 |
|---|---|---|---|
| r15s | 15s 指数平均运行队列长度 | --- | 瞬时尖峰;LSF 已按ncpus/cpuf归一化,≠原生 Linux loadavg |
| r1m | 1min 指数平均运行队列长度 | cpu | 最常用负载指标;loadSched/loadStop 大多配这个 |
| r15m | 15min 指数平均运行队列长度 | --- | 看持续高负载 |
| ut | 1min 平均 CPU 利用率 | --- | 0.0‑1.0;注意超线程时 ut 高不代表 slot 耗尽 |
| pg | 1min 平均换页速率 | --- | pages/sec;不是 swap 已用大小;pg 高 = 内存颠簸风险 |
| io | 1min 平均磁盘 I/O 速率 | --- | KB/s;本地盘吞吐;不直接反映 NFS 压力 |
| ls | 当前登录会话数 | login | 交互式用户数量 |
| it | 主机空闲时间 | idle | 分钟;全部登录会话无操作时长 |
| mem | 当前可用内存 | --- | MB(实时剩余;和maxmem区分) |
| swp | 当前可用 Swap | swap | MB(实时剩余;和maxswp区分) |
| tmp | /tmp 当前剩余空间 | --- | MB(实时剩余;和maxtmp区分) |
PS:External Dynamic Index:管理员用 ELIM 脚本自定义(例如 license 余量、GPU 利用率),也是动态指数,只是不是 LIM 内置。
3. 总结
LSF将众多软硬件组合起来,给用户提供统一接口,用户不需要关系内部资源协调和组织的细节。组成cluster的host中会至少选用一台作为management host,用于协调其它computer host的运行。Management host通过lim机制掌握了各个host的资源使用情况,这些信息也会提供给mbschd去做出调度决策,mbatchd根据这个调度决策把jobs分配到合适的computer host上去运行,computer host上的sbatchd会为每个分配过来的job启动一个子sbatchd,这个子sbatchd会启动一个res实例来创建job运行的执行环境,使得每个job独立、安全的执行。
LSF中提供了众多的命令给用户使用,大致可以分为以下四类:
- 提交jobs
- 查询jobs
- 查询hosts
- 配置命令
