撰写日期:2017年6月13日
一般情况下不会采用手动的方式安装HPC,而是采用集成自动化方案来部署hpc,但是这些集成方案都是集成了指定的操作系统发行版本,比如常见的HPC集成自动化方案rockets,到目前为止集成centos 6.6,如果需要把HPC安装其他linux发行版本环境里面,就不能使用集成自动化方案,必须使用手动安装方法,这篇博客就是叙述如何手动搭建HPC的。敬请往下看。
1. HPC简介
2. HPC架构
3. ssh无密码访问
4. 安装配置NFS
5. 安装配置NIS
6. 安装tentakel
7. 安装openmpi
8. 安装torque
9. 安装ganglia
1. HPC简介
高性能计算(Highperformance computing,缩写HPC) 指通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计算资源操作)的计算系统和环境。有许多类型的HPC 系统,其范围从标准计算机的大型集群,到高度专用的硬件。大多数基于集群的HPC系统使用高性能网络互连,比如那些来自 InfiniBand 或 Myrinet 的网络互连。基本的网络拓扑和组织可以使用一个简单的总线拓扑,在性能很高的环境中,网状网络系统在主机之间提供较短的潜伏期,所以可改善总体网络性能和传输速率。
2. hpc架构
网络架构如图所示
上图显示了一网状 HPC 系统。在网状网络拓扑中,该结构支持通过缩短网络节点之间的物理和逻辑距离来加快跨主机的通信。
尽管网络拓扑、硬件和处理硬件在 HPC 系统中很重要,但是使系统如此有效的核心功能是由操作系统和应用软件提供的。
HPC 系统使用的是专门的操作系统,这些操作系统被设计为看起来像是单个计算资源。正如从图1和图2中可以看到的,其中有一个控制节点,该节点形成了 HPC 系统和客户机之间的接口。该控制节点还管理着计算节点的工作分配。
对于典型 HPC 环境中的任务执行,有两个模型:单指令/多数据(SIMD) 和多指令/多数据 (MIMD)。SIMD在跨多个处理器的同时执行相同的计算指令和操作,但对于不同数据范围,它允许系统同时使用许多变量计算相同的表达式。MIMD允许HPC 系统在同一时间使用不同的变量执行不同的计算,使整个系统看起来并不只是一个没有任何特点的计算资源(尽管它功能强大),可以同时执行许多计算。
不管是使用 SIMD 还是 MIMD,典型HPC 的基本原理仍然是相同的:整个HPC 单元的操作和行为像是单个计算资源,它将实际请求的加载展开到各个节点。HPC 解决方案也是专用的单元,被专门设计和部署为能够充当(并且只充当)大型计算资源。
3.SSH无密码访问
建立脚本目录
mkdir –p /root/rootUser
mkdir –p /home/普通用户目录
例如: mkdir –p /home/hpc (hpc就是一个普通用户)
编写如下三个脚本:
Setp1.exp
内容如下:
#!/bin/bash
rm -fr/root/.ssh
/usr/bin/expect<<EOF
setforce_conservative 0 ;# set to 1 toforce conservative mode even if
;# script wasn't run conservativelyoriginally
if{\$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- \$arg
}
}
settimeout -1
spawnssh-keygen -t dsa
match_max100000
expect-exact "Enter file in which to save the key (/root/.ssh/id_dsa): "
send --"\r"
expect-exact "Enter passphrase (empty for no passphrase): "
send --"\r"
expect-exact "Enter same passphrase again: "
send --"\r"
expecteof
EOF
cd/root/.ssh
catid_dsa.pub >> authorized_keys
chmod 600authorized_keys
step2.exp
内容如下:
#!/bin/bash
if [ $#-ne 1 ]
then
{
echo 'usage: step1.exp root_password'
exit
}
fi;
ROOTPASSWD=$1
rm -fr/root/.ssh/known_hosts
#for((node=1;node<=10;node++))
for nodein $(cat hostfile)
do
/usr/bin/expect<<EOF
# set to1 to force conservative mode even if
setforce_conservative 0 ;
;# script wasn't run conservativelyoriginally
if{\$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- \$arg
}
}
settimeout -1
spawn ssh${node} hostname
match_max100000
expect-exact "Are you sure you want to continue connecting (yes/no)? "
send --"yes\r"
expect-exact "${node}'s password: "
send --"${ROOTPASSWD}\r"
expecteof
EOF
done;
step3.exp
内容如下:
#!/bin/bash
if [ $#-ne 1 ]
then
{
echo 'usage : step3.exp root_password';
exit 1;
}
fi;
ROOTPASSWORD=$1
#for((node=1;node<=10;node++))
for nodein $(cat hostfile)
do
/usr/bin/expect<<EOF
setforce_conservative 0 ;# set to 1 toforce conservative mode even if
;# script wasn't run conservativelyoriginally
if{\$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- \$arg
}
}
settimeout -1
spawn scp-rp /root/.ssh ${node}:/root
match_max100000
expect-exact "root@${node}'s password: "
send --"${ROOTPASSWORD}\r"
expecteof
EOF
Done
执行命令:touch hostfile
编辑hostfile文件,加入说有主机名,一行一个。
例如:
node136
node137
node138
hpc-test
执行如下命令:
cp setp1.exp setp2.exp setp3.exp hostfile /root/rootUser/
cp setp1.exp setp2.exp hostfile /home/普通用户目录
chmod 755 –R /root/rootUser/
chmod 755 –R /home/普通用户目录
chown root:root –R /root/rootUser/
chown 普通用户:普通用户组 –R /home/普通用户目录/
以下实现各服务器之间root用户之间ssh无密码访问。
修改hostfile文件内容,把所有主机名称添加进去。
先使用root用户顺序执行目录/root/rootuser里面的脚本:
sh step1.exp
sh step2.exp root 密码
sh step3.exp root 密码
以下实现各服务器之间普通用户之间ssh无密码访问。
先在所有主机上建立相同的用户,执行命令:
Useradd 用户名
Paswd 用户名
修改hostfile文件内容,同上。
执行顺序目录/home/normalUser下面的脚本
sh step2.exp 普通用户密码
sh step3.exp 普通用户名 密码
以上脚本执行完成后使用root和普通用户使用ssh命令测试各服务器之间是否可以无密码访问。
4. NFS配置
在管理节点上设置共享目录:
touch /etc/exports
echo ‘/home *(rw,insecure,no_root_squash,sync)’>>/etc/exports
echo ‘/hpc *(rw,insecure,no_root_squash,sync)’>> /etc/exports
启动nfs服务器
systemctl start nfs.service
查看nfs服务状态
systemctl status nfs.service
设置nfs开机自启动
systemctl enable nfs.service
在计算节点上执行mount命令把/home和/opt挂载到本地:
mount -t nfs -o vers=3 hpc:/opt /opt
mount -t nfs -o vers=3 hpc:/home /home
5.安装配置NIS服务
NIS的作用是让整个系统里的机器的账户能统一管理。
yum install –y ypbind yp-tools ypser rpcbind protmap
NIS的配置如下:
1)server端的配置
1、开启两个服务:
[root@admin ~]# /sbin/chkconfig yppasswdd on
[root@admin ~]# /sbin/chkconfig ypserv on
[root@admin ~]# /sbin/service yppasswdd restart
[root@admin ~]# /sbin/service ypserv restart
2、配置NIS域名
[root@admin ~]# nisdomainname TS10K
(必需将nisdomainname TS10K加入到nis服务器的/etc/rc.d/rc.local文件里面或者把NISDOMAIN=TS10K加入到/etc/sysconfig/netwok文件里)
echo “/bin/nisdomainnamehpc”>>/etc/rc.d/rc.local
echo“NISDOMAIN=hpc”>>/etc/sysconfig/network
可以使用rpcinfo–u 本机名 ypserv 察看ypserv是否启动,若成功启动会看到:
program 100004 version 1 ready and waiting
program 100004 version 2 ready and waiting
若没看到,则把ypserv重新启动一下即可。
3、数据初始化
[root@admin ~]# cd /usr/lib/yp
[root@admin yp]#./ypinit –m 或者/usr/lib64/yp/ypinit -m
ctl+d(切记)来结束这个命令,再打入回车
回车后会显示类似内容:admin has been set up as a NISserver ,now you can run ypinit –s admin on all slave server.
在server端重新建立新用户后,需要到/var/yp 目录下make一下(当nis map有任何修改必须重新make一下),这样client端才能使用新用户登录。
2)client端的配置
1、设定NIS client
setup→authentication configuration→[*]use NIS
填写:Domain:TS10K (NIS的域名)
Server: admin (server端的名称或者ip)
2、开启服务
[root@cu001 ~]# /sbin/chkconfig ypbind on
[root@cu001 ~]# /sbin/service ypbind restart
也可以直接修改/etc/yp.conf文件来设定nis client端
修改完毕后,serviceypbind restart重启服务即可
新增用户时,需要更新nis账户和资料库:
cd /var/yp make
6.安装tentakel
解压软件包pip-1.1.tar
进入目录:pip-1.1
cd pip-1.1
执行:python setup.py install
解压软件包:sfermigier-tentakel-1564958.zip
unzipsfermigier-tentakel-1564958.zip
cdsfermigier-tentakel-1564958
执行如下命令进行安装:
pip install . (.是表示当前目录)
拷贝配置文件到/etc
cp tentakel.conf /etc
测试tentakel是否生效
执行命令:tentakel –g all “uptime”
7.安装openmpi
安装所需依赖包:
yum install –ygcc-gfortran gcc gcc-c++ *aclocal
解压openmpi-1.6.4.tar
tar –zxvf openmpi-1.6.4.tar
cd openmpi-1.6.4
下面开始编译安装:
生成安装配置信息
./configure --prefix=/hpc/openmpi CC=gcc CXX=g++F77=gfortran FC=gfortran
编译安装
make && make install(必须要make命令编译成功才执行makeinstall开始安装)
编辑文件/etc/ ld.so.conf, 文件末尾加入openmpi的lib目录路径。
vim /etc/ ld.so.conf
执行ldconfig命令
编辑/etc/profile文件和用户目录下面的.bashrc文件,.bashrc是隐藏文件需要使用ls–al命令才可以看到。
加入如下内容:
export OPENMPI_HOME=/hpc/openmpi
export OPENMPI_PATH=$OPENMPI_HOME/bin
export TORQUE_HOME=/var/spool/torque
exportLD_LIBRARY_PATH=$OPENMPI_PATH:$OPENMPI_HOME/lib:$TORQUE_HOME:$LD_LIBRARY_PATH
export PATH=$PATH:$LD_LIBRARY_PATH
再执行:
source/etc/profile
用户/.bashrc
测试openmpi
8.安装torque
Torque在整个集群里面充当任务调度的角色。
以下步骤在管理节点操作
安装torque之前需要先安装依赖包。
yum update
yum install -ylibxml2-devel openssl-devel
上传安装包
解压安装包
tar -zxvf torque-4.2.10.tar.gz
cd torque-4.2.10/
生成安装信息,如果加了—perfix指定了安装目录,就会安装到指定目录,如果不加会安装到默认目录/usr/local,我这里不指定目录,安装默认目录下。
执行 ./configure
生成安装配置信息后执行如下命令进行编译安装:
make && make install
拷贝服务启动程序到/etc/init.d/
cp torque/contrib/init.d/trqauthd/etc/init.d/
cp torque/contrib/init.d/pbs_server/etc/init.d/
cp torque/contrib/init.d/pbs_sched}/etc/init.d/
添加trqauth到服务列表
设置以上服务开机自启:
chkconfig pbs_server on
chkconfig pbs_sched on
chkconfig trqauthd on
执行如下命令:
echo /usr/local/lib > /etc/ld.so.conf.d/torque.conf
ldconfig
echo <pbs_server's_hostname> >/var/spool/torque/server_name
添加TORQUE_HOMEH环境变量
vim /etc/profile
执行命令: source /etc/profile
在安装包目录下面执行:
执行:pbs_server –u
touch /var/spool/torque/server_priv/nodes
vim /var/spool/torque/server_priv/nodes 加入所有计算机节点。
安装计算节点:
在管理节点的torque安装包目录下执行:makepackages
生成了几个shell脚本:
在管理节点上执行:
cp torque-package-mom-linux*.sh /shared_storage/ ----/shared_storage 指的是共享存储目录
cp torque-package-clients-linux*.sh /shared_storage/
在所有计算节点上执行:
cd 到共享目录
执行torque-package-clients-linux-x86_64.sh和torque-package-mom-linux-x86_64.sh
把管理节点上的安装包目录里的contrib/init.d/pbs_mom拷贝到所有计算节点的/etc/init.d/目录。
把pbs_mom加入服务列表
chkconfig--add pbs_mom
设置pbs_mom服务开机自启动
chkconfigpbs_mom on
在管理节点编写脚本:
startpbs_server.sh和shutpbs_server.sh
startpbs_server.sh用来启动所有pbs服务,内容如下:
#!/bin/bash
for iin pbs_server pbs_mom pbs_sched trqauthd;
do
/etc/init.d/$istart
done
shutpbs_server.sh用来停止所有pbs服务,内容如下:
#!/bin/bash
for iin pbs_server pbs_mom pbs_sched trqauthd;
do
/etc/init.d/$istop
done
添加执行权限:
chmod+x startpbs_server.sh
chmod+x shutpbs_server.sh
执行:shstartpbs_server.sh启动所有服务。
在计算节点的编辑/etc/profile文件加入TORQUE_HOME环境变量
source/etc/profile
在计算节点执行:
#echo /usr/local/lib> /etc/ld.so.conf.d/torque.conf
#ldconfig
启动pbs_server
/etc/init.d/pbs_momstart
在管理节点执行命令:qnodes
状态为free就是正常的,为down就是计算节点的pbs_mom服务挂了。
编写测试脚本:
test.pbs内容如下:
#PBS-l nodes=1
##PBS-N test_1
#PBS-S /bin/bash
mpiexec–H localhost,node136,node137 -np 30 /home/hpc/a.out > /home/hpc/cu1111.log2>&1
su – 普通用户
提交作业:
qsub test.pbs
查看作业队列:
qstat
状态为C表示作业执行完成,为E表示作业执行完成正在退出。
9.安装ganglia监控
Ganglia由gmond、gmetad和gweb三部分组成
gmond(GangliaMonitoring Daemon)是一种轻量级服务,安装在每台需要收集指标数据的节点主机上。gmond在每台主机上完成实际意义上的指标数据收集工作,并通过侦听/通告协议和集群内其他节点共享数据。使用gmond,你可以很容易收集很多系统指标数据,如CPU、内存、磁盘、网络和活跃进程的数据等。
gmetad(GangliaMeta Daemon)是一种从其他gmetad或gmond源收集指标数据,并将其以RRD格式存储至磁盘的服务。gmetad为从主机组收集的特定指标信息提供了简单的查询机制,并支持分级授权,使得创建联合监测域成为可能。
gweb(GangliaWeb)gweb是一种利用浏览器显示gmetad所存储数据的PHP前端。在Web界面中以图表方式展现集群的运行状态下收集的多种不同指标数据。
管理节点需要安装的组件:
gmetad
http
php
gweb
计算节点需要安装的组件:
gmond
在所有节点执行下面的操作:
安装软件源:wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
执行如下命令:
yum clean all
yum makecach
yum update –y
yum search ganglia-gmetad ganglia-gmond
如果yum search命令可以找到ganglia软件包在开始安装管理节点和计算节点。
安装管理节点:
安装gmetad
执行:
yum installganglia-gmetad -y
安装ganglia-web
在安装ganglia-web之前需要先安装httpd和php
执行:
yum install httpd php
建立ganglia的web目录:
mkdir /var/www/html/ganglia
把ganglia-web下面的所有文件拷贝到/var/www/html/ganglia
配置管理节点:
配置gmetad
修改gmetad服务的配置配文件:
vim /etc/ganglia/gmetad.conf
修改data_source参数
格式为:data_source “集群名称” host1:port,host2:port,.. hostN:port
如果不指定端口会使用默认端口:8649
配置ganglia-web
Ganglia的web监控界面是基于PHP的,因此需要安装PHP环境,PHP环境的安装不在介绍,可以在http://sourceforge.net/projects/ganglia/files/下载ganglia-web,然后放到web根目录即可。
配置ganglia的web界面比较简单,只需要修改几个php文件即可,首先第一个是conf_default.php,可以将conf_default.php重命名为conf.php,也可以保持不变,ganglia的web默认先找conf.php,找不到会继续找conf_default.php,需要修改的内容如下:
$conf['gmetad_root'] ="/var/www/html/ganglia/"; # ganglia web根目录
$conf['rrds'] ="${conf['gmetad_root']}/rrds"; #ganglia web读取rrds数据库的路径
$conf['dwoo_compiled_dir'] ="${conf['gmetad_root']}/dwoo/compiled"; #需要777权限
$conf['dwoo_cache_dir'] ="${conf['gmetad_root']}/dwoo/cache"; #需要777权限
$conf['rrdtool'] ="/usr/bin/rrdtool"; #指定rrdtool的路径
$conf['graphdir']= $conf['gweb_root'] .'/graph.d'; #生成图形模板目录
$conf['ganglia_ip'] ="127.0.0.1"; #gmetad服务器的地址
$conf['ganglia_port'] = 8652; #gmetad服务器的交互式提供监控数据端口发布
执行如下命令:
chmod 777 -R /var/www/html/ganglia/dwoo/cache/
配置计算节点gmond服务
在所有计算节点执行如下命令:
yum install ganglia-gmond –y
gmond服务配置
gmond服务配置文件是/etc/ganglia/gmond.conf
部分配置说明如下:
globals {
daemonize = yes #以后台的方式运行
setuid = yes
user = nobody #运行gmond的用户
debug_level = 0 #调试级别
max_udp_msg_len = 1472
mute = no #本节点将不会再广播任何自己收集到的数据到网络上
deaf = no #本节点将不再接收任何其他节点广播的数据包
allow_extra_data = yes
host_dmax = 0 /*secs */
cleanup_threshold = 300 /*secs */
gexec = no #是否使用gexec
send_metadata_interval = 0
}
cluster {
name = "Cluster1" #本节点属于哪个cluster
owner = "junfeng" #指定该节点的所有者
latlong = "unspecified" #在地球上的坐标,经度、纬度
url = "unspecified"
}
host {
location = "unspecified"
}
udp_send_channel { #udp包的发送通道
mcast_join = 239.2.11.71 #多播模式,工作在239.2.11.71通道下。如果使用单播模式,则要 写成host = host1,单播模式下也可以配置多个udp_send_channel
port = 8649 #监听端口
ttl = 1
}
udp_recv_channel { #接收udp包配置
mcast_join = 239.2.11.71 #同样工作在239.2.11.71通道下
port = 8649 #监听端口
bind = 239.2.11.71 #绑定
}
tcp_accept_channel {
port = 8649 #通过tcp协议监听的端口,远端可以通过链接8649端口得到监控数据
}
在此文档中我们只需要修改cluser{…….}部分如下:
name字段需要和管理节点一致。
在管理节点执行:
systemctl enablegmetad.service
systemctl startgmetad.service
systemctl enablehttpd.service
systemctl enablehttpd.service
在计算节点执行:
systemctl enablegmond.service
systemctl start gmond.service
下面是见证奇迹的时刻。
在浏览器地址栏里面输入:
http://apache-hosot/ganglia