LSF 配置NUMA Affinity

首先要给节点启用NUMA Affinity,在lsb.hosts的Host节中添加AFFINITY列,值为Y,如:

Begin Host
HOST_NAME MXJ   r1m     pg    ls    tmp  DISPATCH_WINDOW  AFFINITY 
......
default    !    ()      ()    ()     ()     ()            (Y)      
End Host

启用后用bhost -l -aff可以看到Affinity已经Enable

提交作业时-R参数添加affinity字段如affinity[core:membind=localprefer:distribute=pack]

通过作业调度系统进行系统维护

HPC集群中一些系统维护工作不需要立刻执行,而希望在不影响用户正常使用的情况下见缝插针的进行,这个时候可以将这些维护工作做成作业,通过作业调度系统来调度完成。下面以通过LSF作业调度系统升级Infiniband卡固件和驱动为例:

  1. 允许root用户提交作业
    1. 修改lsf.conf,添加一行
      LSF_ROOT_REX=local
    2. 重启相关服务让修改生效
      $ badmin mbdrestart
      $ lsadmin resrestart all
  2. 编写升级脚本
    cd /root/mellanox/ #进入目录
    unzip fw-ConnectX3Pro-rel-2_35_5100.zip
    mstflint -d 08:00.0 -i ./fw-ConnectX3Pro-rel-2_35_5100-FlexBoot-3.4.648-CLP-8025-UEFI-14.8.43.bin b #升级固件
    tar xf MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64.tgz
    cd MLNX_OFED_LINUX-3.1-1.0.3-rhel6.7-x86_64
    yum install perl pciutils python gcc-gfortran libxml2-python tcsh libnl.i686 libnl expat glib2 tcl libstdc++ bc tk gtk2 atk cairo numactl pkgconfig -y
    ./mlnxofedinstall --all --enable-affinity --enable-mlnx_tune <<< "y\n" #安装新版驱动
    sed -i s/HWADDR=/#HWADDR=/ /etc/sysconfig/network-scripts/ifcfg-ib0
    cd
    rm -rf /root/mellanox #删除升级目录
    reboot #重启
  3. 将升级所需文件复制到所有节点
    pscp -r mellanox node:/root/
  4. 编写作业提交脚本
    如果队列之间有抢占,系统维护作业需要提交到低优先级队列,提交到高优先级队列会造成重启时还有被抢占挂起的作业
    首先关闭节点,再进行维护作业,完成后再打开节点

    #!/bin/bash
    for i in `cat nodelist` #nodelist文件中是所有需要升级节点的主机名列表
    do
    	bsub -q e52680v3ib -n 24 -m $i -o $i "badmin hclose $i;/root/mellanox/up.sh;badmin hopen $i" 
    done
    

Platform LSF ELIM

LSF可以让用户自定义一些资源,其中动态资源可以通过ELIM向LSF汇报,下面以本地磁盘(一个机械盘一个SSD)负载为例:

在$LSF_ENVDIR/lsf.shared的Begin Resource中增加

diskut   Numeric    60    Y    (Percentage of CPU time during which I/O requests were issued to local disk)
ssdut   Numeric    60    Y    (Percentage of CPU time during which I/O requests were issued to local SSD disk)

在$LSF_ENVDIR/lsf.cluster.的Begin ResourceMap中增加一行

diskut              [default]
ssdut               [default]

在$LSF_SERVERDIR/下新建一个文件elim.disk内容如下并且chmod +x elim.disk

#!/bin/sh

declare -a util
while true; do
	util=(`sar -d 60 1|grep Average|grep dev8|awk '{print $10}'`)
	case "${#util[@]}" in
		1)
			echo 1 diskut ${util[0]}
			;;
		2)
			echo 2 diskut ${util[0]} ssdut ${util[1]}
			;;
	esac
done

所有节点需要lsadmin limrestart,然后用lsload -l就可以看到多出来两列了

bsub时可以使用这些参数
-R “order[diskut]” 优先选择disk负载最轻的
-R “select[diskut < 10]” 要求disk负载小于10%
-R “rusage[diskut=10]” 为这个任务预留10%的disk负载。rusage不影响lsload的显示,但是会叠加到lsload显示的实际值上面从而影响order select的结果,除非lsf确定预留的资源被这个job所使用了(比如mem)。

Platform LSF Compute Units 调度策略

Compute Units(CU)可以对一个队列中的机器在调度时进行分组,可以控制作业在这些组中的分配。

假设有三个cu,每个cu空闲的job slots如下:

cu name free job slots
cu1 4
cu2 6
cu3 8

 

cu[pref=minavail]:把cu按照空闲的job slots从小到大排序,按顺序填充分配使用cu。例:-n 4则使用cu1的4个;-n 6则使用cu1的4个和cu2的2个。

cu[pref=maxavail]:把cu按照空闲的job slots从大到小排序,按顺序填充分配使用cu。例:-n 6则使用cu3的6个;-n 10则使用cu3的8个和cu2的2个。
上面的情况下,如果cu中空闲的job slots数量一样,则按照其在lsb.hosts中Begin ComputeUnitvs中的顺序使用

cu[balance]:按照在lsb.hosts中Begin ComputeUnitvs中的顺序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 6则使用cu2的6个;-n 8则使用cu3的8个;-n 10则使用cu2和cu3的各使用5个;-n 12则cu2和cu3个使用6个;-n 14则cu1使用4个、cu2和cu3各使用5个。
cu[balance:pref=minavail]和cu[balance:pref=maxavail]:把cu按照空闲的job slots排序,在尽量少的cu中分配使用且每个cu中使用的job slots尽量平衡。例:-n 4 -R “cu[balance:pref=minavail]”使用cu1,-n 4 -R “cu[balance:pref=maxavail]”使用cu3。

对于HPC来说,​其实更想要一种类似于minavail但是又尽量分布到最少cu上的策略,如果必须跨cu则应尽量不等分减少跨cu通讯。