手动搭建HPC(高性能计算)

  • 来源:网络
  • 更新日期:2020-09-01

摘要:建站服务器 撰写日期:2017年6月13日作者:翟江恒一般情况下不会采用手动的方式安装HPC,而是采用集成自动化方案来部署hpc,但是这些集成方案都

建站服务器


撰写日期: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 系统中很重要,但是使系统如此有效的核心功能是由操作系统和应用软件提供的。

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

 Source /home/用户/.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



新网虚拟主机