目前,最新版本的SGE版本是8.1.9版本,其软件较旧,在Rocky 9.2 Linux系统上使用其高版本的GCC进行编译基本不会成功。于是采用特别提供repo源进行安装,即采用某些高人已经编译好的rpm软件进行安装。
1. 设置各节点的主机名
部署SGE前,需要设置好各个节点的主机名,需要修改3个文件。以设置node1主机为例:
echo 'NETWORKING=yes
HOSTNAME=node1' > /etc/sysconfig/network
echo 'node1' > /proc/sys/kernel/hostname
echo 'node1' > /etc/hostname
然后在各节点上设置主机名和其IP映射信息:
echo '10.0.0.1 node1
10.0.0.2 node2
10.0.0.3 node3
10.0.0.4 node4
10.0.0.5 node5
10.0.0.6 node6
10.0.0.7 node7
10.0.0.8 node8' > /etc/hosts
2. 在管理节点上安装SGE软件
首先,开放防火墙端口。
sudo firewall-cmd --add-port=992/udp --permanent
sudo firewall-cmd --add-port=6444/tcp --permanent
sudo firewall-cmd --add-port=6445/tcp --permanent
sudo systemctl restart firewalld.service
然后,安装SGE软件可能依赖的一些系统软件。
sudo dnf -y install csh java-1.8.0-openjdk java-1.8.0-openjdk-devel gcc ant automake hwloc-devel openssl-devel libdb-devel pam-devel libXt-devel motif-devel ncurses-libs ncurses-devel ant-junit junit javacc libdb-utils jemalloc munge-libs
继续,正式安装SGE软件,采用loveshack编译的SGE。
sudo wget https://copr.fedorainfracloud.org/coprs/loveshack/SGE/repo/epel-9/loveshack-SGE-epel-9.repo -P /etc/yum.repos.d
sudo dnf -y install gridengine gridengine-devel gridengine-execd gridengine-drmaa4ruby gridengine-qmon
# 需要强制安装gridengine-qmaster,正常安装保存血少libdb4,而Rocky9默认安装libdb5。
sudo dnf -y download gridengine-qmaster
sudo rpm -ivh --nodeps gridengine-qmaster-8.1.9-6.el9.x86_64.rpm
sudo chown -R chenlianfu:chenlianfu /opt/sge
最后,在管理节点上部署SGE的qmaster服务。
cd /opt/sge
./install_qmaster
# 安装到靠后时,启动了Grid Engine qmasster服务,然后可以提供部署SGE的节点主机名信息,按y和Enter键使用一个文件来提供主机信息,输入文件路径/etc/hosts提供加入到SGE集群系统的主机信息。有利于后续在各计算节点上部署execd服务。
3. 在计算节点上部署SGE软件
首先安装SGE依赖的系统软件,然后部署SGE的execd服务。
sudo dnf -y install csh java-1.8.0-openjdk java-1.8.0-openjdk-devel gcc ant automake hwloc-devel openssl-devel libdb-devel pam-devel libXt-devel motif-devel ncurses-libs ncurses-devel ant-junit junit javacc libdb-utils jemalloc munge-libs
cd /opt/sge
./install_execd
# 全程按Enter键直到完毕即可。
4. 启动SGE软件
部署完毕后,若需要使用SGE软件,则执行如下命令载入SGE的环境变量信息:
source /opt/sge/default/common/settings.sh
或将该信息添加到~/.bashrc从而永久生效:
echo 'source /opt/sge/default/common/settings.sh' >> ~/.bashrc
source ~/.bashrc
启动SGE软件方法:
sudo /opt/sge/default/common/sgemaster restart # 控制节点启动
sudo /opt/sge/default/common/sgeexecd restaart # 计算节点启动
查看SGE软件运行日志文件:
Qmaster: /opt/sge/default/spool/qmaster/messages
Exec daemon: /opt/sge/default/spool/<hostname>/messages
我通过编写一个程序:keep_SGE,使用root用户或无密码sudo权限运行后能自动维持管理节点或计算节点的SGE服务。再继续通过例行任务流程,能使集群中服务器再SGE系统中的稳定性。
sudo mkdir /root/bin
sudo wget http://chenlianfu.com/public/bin/keep_SGE -P /root/bin/
sudo echo -e "1\t*\t*\t*\t*\t/root/bin/keep_SGE" > crontab.txt
sudo crontab crontab.txt
sduo rm crontab.txt
5. 使用SGE软件
部署完毕SGE后,会生成一个默认主机用户组@allhosts,它包含所有的执行节点;生成一个默认的all.q队列名,它包含所有节点所有计算资源。默认的队列包含的计算资源是最大的。 通过使用命令qconf -mq queuename来对队列进行配置。修改hostlist来配置该队列可以使用执行主机;修改slots来配置各台执行主机可使用的线程数。从而对队列的计算资源进行设置。
使用qconf命令对SGE进行配置:
qconf -ae hostname
添加执行主机
qconf -de hostname
删除执行主机
qconf -sel
显示执行主机列表
qconf -ah hostname
添加管理主机
qconf -dh hostname
删除管理主机
qconf -sh
显示管理主机列表
qconf -as hostname
添加提交主机
qconf -ds hostname
删除提交主机
qconf -ss
显示提交主机列表
qconf -ahgrp groupname
添加主机用户组
qconf -mhgrp groupname
修改主机用户组
qconf -shgrp groupname
显示主机用户组成员
qconf -shgrpl
显示主机用户组列表
qconf -aq queuename
添加集群队列
qconf -dq queuename
删除集群队列
qconf -mq queuename
修改集群队列配置
qconf -sq queuename
显示集群队列配置
qconf -sql
显示集群队列列表
qconf -ap PE_name
添加并行化环境
qconf -mp PE_name
修改并行化环境
qconf -dp PE_name
删除并行化环境
qconf -sp PE_name
显示并行化环境
qconf -spl
显示并行化环境名称列表
qstat -f
显示执行主机状态
qstat -u user
查看用户的作业
qhost
显示执行主机资源信息
使用qsub提交作业
qsub简单示例:
$ qsub -V -cwd -o stdout.txt -e stderr.txt run.sh
其中run.sh中包含需要运行的程序,其内容示例为如下三行:
#!/bin/bash
#$ -S /bin/bash
perl -e 'print "abc\n";print STDERR "123\n";'
qsub的常用参数:
-V
将当前shell中的环境变量输出到本次提交的任务中。
-cwd
在当前工作目录下运行程序。默认设置下,程序的运行目录是当前用户在其计算节点的家目录。
-o
将标准输出添加到指定文件尾部。默认输出文件名是$job_name.o$job_id。
-e
将标准错误输出添加到指定文件尾部。默认输出文件名是$job_name.e$job_id。
-q
指定投递的队列,若不指定,则会尝试寻找最小负荷且有权限的队列开始任务。
-S
指定运行run.sh中命令行的软件,默认是tcsh。推荐使用bash,设置该参数的值为 /bin/bash 即可,或者在run.sh文件首部添加一行#$ -S /bin/bash。若不设置为bash,则会在标准输出中给出警告信息:Warning: no access to tty (Bad file descriptor)。
-hold_jid
后接多个使用逗号分隔的job_id,表示只有在这些job运行完毕后,才开始运行此任务。
-N
设置任务名称。默认的job name为qsub的输入文件名。
-p
设置任务优先级。其参数值范围为 -1023 ~ 1024 ,该值越高,越优先运行。但是该参数设置为正数需要较高的权限,系统普通用户不能设置为正数。
-j y|n
设置是否将标准输出和标准错误输出流合并到 -o 参数结果中。
-pe
设置并行化环境。
任务提交后的管理:
$ qstat -f
查看当前用户在当前节点提交的所有任务,任务的状态有4中情况:qw,等待状态,刚提交任务的时候是该状态,一旦有计算资源了会马上运行;hqw,该任务依赖于其它正在运行的job,待前面的job执行完毕后再开始运行,qsub提交任务的时候使用-hold_jid参数则会是该状态;Eqw,投递任务出错;r,任务正在运行;s,被暂时挂起,往往是由于优先级更高的任务抢占了资源;dr,节点挂掉后,删除任务就会出现这个状态,只有节点重启后,任务才会消失。
$ qstat -j jobID
按照任务id查看
$ qstat -u user
按照用户查看
$ qdel -j jobID
删除任务