部署IBM Spectrum LSF社区版的第一步,就是做好基础环境配置。这部分工作看似简单,但就像盖房子打地基一样,任何疏漏都会导致后续步骤出现问题。我在实际部署中遇到过不少因为环境配置不当引发的"灵异事件",比如节点间通信失败、权限拒绝等,往往都是这些基础工作没做到位。
生产环境中,我们通常需要关闭SELinux和防火墙以确保集群节点间的无障碍通信。执行以下命令永久禁用SELinux:
bash复制sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
然后关闭并禁用firewalld服务:
bash复制systemctl stop firewalld
systemctl disable firewalld
这里有个小技巧:修改完SELinux配置后,建议直接重启系统而不是仅仅设置permissive模式。我遇到过系统在permissive模式下仍然拦截某些操作的情况,导致集群通信异常。
集群中所有节点都需要正确配置主机名和静态解析。首先为每个节点设置主机名:
bash复制hostnamectl set-hostname master # 在主节点执行
hostnamectl set-hostname node01 # 在第一个计算节点执行
hostnamectl set-hostname node02 # 在第二个计算节点执行
然后在所有节点的/etc/hosts文件中添加如下内容:
code复制10.4.7.139 master
10.4.7.140 node01
10.4.7.141 node02
特别注意:在生产环境中,强烈建议使用DNS服务而不是静态hosts文件。但如果是测试环境或小型集群,静态解析更加简单直接。我在一个20节点的集群中就因为hosts文件不同步导致过节点无法识别的问题。
为LSF创建专用管理用户是个好习惯:
bash复制useradd -m lsfadmin
这个用户将用于集群管理和作业提交。在实际项目中,我建议进一步设置用户组和权限,比如创建一个lsfusers组,把需要提交作业的用户都加入这个组。
集群节点间的SSH免密登录是必须的。首先生成SSH密钥:
bash复制ssh-keygen -t rsa -b 4096
然后将公钥复制到所有节点(包括本机):
bash复制ssh-copy-id lsfadmin@master
ssh-copy-id lsfadmin@node01
ssh-copy-id lsfadmin@node02
这里有个常见坑点:确保.ssh目录权限为700,authorized_keys文件权限为600。权限设置不当会导致SSH免密登录失败。
NFS共享目录用于存放LSF的安装文件和配置。在主节点上:
bash复制mkdir /opt/lsf
echo '/opt/lsf 10.4.7.140(rw,async,no_root_squash)
/opt/lsf 10.4.7.141(rw,async,no_root_squash)' >> /etc/exports
exportfs -a
在计算节点上挂载这个共享目录:
bash复制echo "master:/opt/lsf /opt/lsf nfs defaults 0 0" >> /etc/fstab
mount -a
实测中发现,NFS性能对集群整体效率影响很大。对于高性能计算场景,建议考虑使用并行文件系统如Lustre或GPFS替代NFS。
将LSF社区版安装包上传到主节点的/opt/lsf目录并解压:
bash复制tar -zxvf lsfsce10.2.0.6-x86_64.tar.gz
mv lsfsce10.2.0.6-x86_64/lsf/*.tar.Z /opt/lsf
tar -xvf lsf10.1_lsfinstall_linux_x86_64.tar.Z
注意这里有个关键点:只需要解压lsfinstall包,不要解压主安装包。LSF的安装程序会自动处理主安装包。
创建install.config文件是安装的核心步骤。这个文件决定了集群的基本属性:
bash复制cat <<EOF > /opt/lsf/lsf10.1_lsfinstall/install.config
LSF_TOP="/opt/lsf"
LSF_ADMINS="lsfadmin"
LSF_CLUSTER_NAME="MyLSFCluster"
LSF_MASTER_LIST="master"
LSF_TARDIR="/opt/lsf/"
LSF_ADD_SERVERS="node01 node02"
EOF
我在多个项目中发现,集群名称(LSF_CLUSTER_NAME)最好使用有意义的标识,方便后期管理。同时,LSF_ADD_SERVERS可以留空,后续再通过配置添加计算节点。
运行安装脚本:
bash复制cd /opt/lsf/lsf10.1_lsfinstall
./lsfinstall -f install.config
安装过程中会有几个交互提示,通常选择默认选项即可。安装完成后,会在/opt/lsf目录下生成完整的LSF环境。
特别提醒:安装完成后会生成lsf_quick_admin.html文件,这个文件包含了非常有用的管理指南和后续步骤说明,建议仔细阅读。
在所有节点上添加LSF环境变量:
bash复制echo ". /opt/lsf/conf/profile.lsf" >> /etc/profile
source /etc/profile
这个步骤经常被忽视,但非常重要。没有正确设置环境变量会导致各种命令找不到的问题。
默认情况下LSF使用rsh通信,我们需要改为更安全的SSH:
bash复制echo "LSF_RSH=ssh" >> /opt/lsf/conf/lsf.conf
在安全要求高的环境中,还需要进一步配置SSH:使用特定端口、禁用root登录等。我曾经遇到过一个案例,因为SSH配置不当导致集群性能下降50%。
在所有节点上启动LSF服务:
bash复制lsadmin limstartup
lsadmin resstartup
badmin hstartup
这三个命令分别启动了LIM(负载信息管理器)、RES(资源管理器)和作业调度器。启动顺序其实不重要,因为它们之间有自动重试机制。
验证节点状态:
bash复制lshosts
输出应该显示所有配置的节点及其资源信息。如果缺少某个节点,通常是因为该节点上的LIM服务没有正常启动。
切换到lsfadmin用户提交测试作业:
bash复制su - lsfadmin
bsub sleep 120
使用bjobs命令查看作业状态:
bash复制bjobs
健康的集群应该能够将作业分发到不同节点执行。如果作业一直处于PEND状态,可能是资源配置或队列设置有问题。
我在测试时喜欢用一系列不同时长的sleep作业,这样可以直观地看到作业调度情况:
bash复制for i in {1..10}; do bsub sleep $((100+i*10)); done
如果遇到"User permission denied"错误,检查:
对于作业不调度的问题,可以检查:
在所有节点上设置LSF开机自启动:
bash复制/opt/lsf/10.1/install/hostsetup --top="/opt/lsf" --boot="y"
这个命令会自动创建systemd服务单元。在较新版本的Linux上,可能需要手动调整服务文件。
编辑/opt/lsf/conf/lsf.shared文件可以调整节点资源定义。例如:
bash复制Begin Host
HOST_NAME mxj r15m r1m r15s r1s ut pg ls it tmp swp mem
master 1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 10G 2G 2G
node01 1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 10G 2G 16G
node02 1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 10G 2G 16G
End Host
这些参数决定了调度器如何评估和分配资源。建议根据实际硬件配置进行调整。
默认的normal队列可能不能满足生产需求。可以通过编辑/opt/lsf/conf/lsf.cluster.cluster_name文件来定义专用队列。例如为内存密集型作业创建大内存队列:
bash复制Begin Queue
QUEUE_NAME = bigmem
PRIORITY = 30
NICE = 10
DESCRIPTION = For memory intensive jobs
RES_REQ = mem>8G
End Queue
LSF提供了丰富的日志文件,主要位于/opt/lsf/log目录下。重要的日志包括:
建议配置日志轮转,避免日志文件过大。可以使用logrotate工具,或者简单的cron作业:
bash复制0 0 * * * find /opt/lsf/log -name "*.log" -type f -size +100M -exec gzip {} \;
向现有集群添加新节点非常简单。首先在新节点上完成所有前置配置(主机名、用户、SSH、NFS等),然后在主节点上:
bash复制echo "new_node" >> /opt/lsf/conf/lsf.cluster.cluster_name
lsadmin reconfig
badmin reconfig
等待几分钟后,新节点就会加入集群。可以使用lsload命令验证新节点是否可用。
当需要临时下线某个节点时:
bash复制badmin hclose node01 -m "Maintenance"
维护完成后重新启用:
bash复制badmin hopen node01
这个操作会优雅地排空节点上的作业,而不是直接中断运行中的任务。
LSF的配置主要存放在/opt/lsf/conf目录下。建议定期备份这个目录。可以使用简单的tar命令:
bash复制tar -czvf lsf_conf_backup_$(date +%Y%m%d).tar.gz /opt/lsf/conf
对于生产环境,应该建立完整的备份策略,包括配置、作业历史等重要数据。
直接使用bsub虽然简单,但在生产环境中建议使用作业脚本。例如创建一个名为job.sh的脚本:
bash复制#!/bin/bash
#BSUB -J my_job
#BSUB -o output.%J
#BSUB -e error.%J
#BSUB -n 4
#BSUB -R "span[hosts=1]"
#BSUB -q normal
# 实际作业命令
my_program input.dat
然后提交:
bash复制bsub < job.sh
这种方式更易于管理和复用。我通常会为不同类型的作业创建模板脚本。
合理的资源请求可以显著提高集群利用率。一些实用技巧:
例如,请求特定内存和临时空间:
bash复制bsub -R "rusage[mem=4G]" -R "rusage[tmp=10G]" my_program
复杂的工作流可以通过作业依赖来实现:
bash复制job1=$(bsub -J step1 job1.sh | awk '{print $2}' | sed 's/<//;s/>//')
job2=$(bsub -J step2 -w "done($job1)" job2.sh | awk '{print $2}' | sed 's/<//;s/>//')
这样job2只有在job1成功完成后才会开始执行。