手动搭建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< 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< # 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< 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 添加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