前言
因为实验室的计算量逐年上升,以前计算的很多是二维轴对称的模型,现在很多都需要建立三维模型,并且网格数量是越来越多,所以最近实验室安装了一套计算集群,主要是用来做流体计算的。因为之前的Linux基础不是很扎实,只会一些基本的命令操作,例如:ls、gcc什么的(后悔当初没有去考一个RHCE),因此从安装到调试到解决完所有的问题花费了一个多星期的时间,中间遇到了很多的问题,好在都一一解决掉了。写这篇文章就是想要将配置的过程记录下来,方便以后自己调试,另一面也希望对有类似需求的童鞋有所帮助。可能有的童鞋就会有疑惑了,为什么不让负责安装设备的公司给调试呢?是的,其实这些事情本来就应该是他们做的,但是现实是往往这些公司的工程人员可能对Linux的了解很多操作也很熟练却对ANSYS Fluent知道的不多,他们把软件装上去之后有很多问题他们是调试不出来的,比如说UDF在多个结点之间的调用问题等等。另外,如果自己不弄清楚了以后再找这些人过来调试的时候那是要收费的,所以我建议有类似需求的童鞋还是最好能把整个系统搞明白,这样才不会受制于人。
一、配置选择
说到配置,这里有几点需要注意一下。首先,现在限制大型并行运算的主要瓶颈就在于节点之间的相互通信,尤其是对于以有限单元法为基础的CFD类计算,并行计算时会将网格分成很多块放在不同的计算节点上,因此在计算时每个迭代步这些节点之间就要进行大量的数据交换,尤其是选用隐式格式和耦合算法的时候。所以节点之间的数据通信就显得尤为重要,现行比较有效的解决方案就是Infiniband。其次,建议最好至少在一个节点上安装一块性能强劲的独立显卡,并将此节点作为主节点。虽然没有独立显卡并不会影响计算速度,但是对操作的流畅性有很大的影响,之前选择方案时没有考虑到这一点结果导致机器安装到位后,打开软件以及读入数据和显示模型都十分缓慢。
1.硬件配置
节点数量:4
节点类型:2U
CPU型号:Intel Xeon E5-2650
内存:ECC DDR3 1333 32GB/节点
硬盘:1TB/节点
节点间通讯方式:Infiniband交换机40GB/s型号:QLogic 12200
节点网卡:QLogic QLE 7340
2.软件配置
操作系统:CentOS 6.2
计算软件:ANSYS 13.0
说到操作系统,目前主流的高性能计算集群选用的都是Linux操作系统,主要的原因是免费、高可靠性、高定制性、占用资料少。但是因为Linux系统的内核一直在不断地升级,所以衍生出了很多版本,也导致了一些兼容性问题。前面提到开始的时候在方案里没有选用独立显卡,导致软件显示卡顿,所以后来为了解决这个问题,我将一台配置有独立显卡的PC机安装上Infiniband网卡和Linux系统接入了集群中。刚开始的时候我从CentOS的官网上下载了最新的6.4版本进行安装。后来在给Infiniband安装驱动的过程中就发现,OFED一直安装不上去,后来到官网上一查就是内核的兼容问题导致的,所以很无奈的降低到6.2版本,之后安装就一切正常。
另外,现在ANSYS的最新版本是14.5.2,这个版本有很多新功能,例如:Workbench中双向的流固耦合计算,Fluent与Matlab可以通过服务方式连接等等。但是,也不知道是因为使用D版的原因还是这个版本本身就有可多bug,在使用的过程中经常出现一些莫名其妙的问题。例如:动网格的UDF会被自动调用2遍,这可能是ANSYS更新了Fluent的动网格更新格式的,总之原先的很多UDF都要进行重新编写了。这些都无所谓,最不能让人忍受的就是软件的自动退出,使用ANSYS 14.5.2的Fluent进行计算总是在计算了一定时间后,Fluent就自动退出并且在当前文件夹下生成一个叫做“cortexerror.log”的文件,重复了很多次做了很多设置,这个问题依然存在,并且无论在是Windows Server上还是Redhat上还是CentOS上都是如此,并且打开这个日志文件总能找到类似“堆栈段溢出”的错误信息,而之前ANSYS 13.0的时候却从来也没有出现过这样的问题。据个人推断主要是因为这次更新的MPI导致的,之前在13.0时默认使用的是hp-mpi,而这次ANSYS公司默认使用的是pcmpi,很可能这个pcmpi是非常不稳定的,虽然网上有人推荐使用intel-mpi进行替代,但是intel-mpi设置起来相对麻烦,考虑到新版本出现的诸多问题,这里还是建议大家使用ANSYS 13.0,经本人检验还是非常稳定的。
三、系统安装
下面以图文并茂的方式给大家介绍一下CentOS 6.2的安装过程,其实个人感觉还是非常简单的。
1.下载CentOS
因为CentOS是完全免费和开源的操作系统,所以完全可以从他们的官方网站上下载到包括源代码。下载下来的是两个镜像文件,以我下载的CentOS 6.2为例分别是”CentOS-6.2-x86_64-bin-DVD1.iso”以及” CentOS-6.2-x86_64-bin-DVD2.iso”这两个镜像文件。将他们分别刻盘,安装的时候只需要第一个安装光盘,第二个安装光盘内的是一些额外的软件包。
2.开始安装
将第一张光盘放入光驱,并选择从光盘启动。CentOS的安装盘会自动引导到安装界面如下所示:
图1 CentOS的安装引导界面
在这里需要注意一下,一般情况下应该选择第一项“Install or upgrade an existing system”“安装或者更新现有系统”,但是这一项在正式安装之前会加载一些默认的驱动程序可能会产生一些兼容性问题。例如我在安装CentOS 6.4的时候一切正常,但是在安装6.2时选择了第一项之后在加载安装程序的过程中总是提示内核模块加载错误,后来根据提示信息发现是主板上声卡的问题,将声卡禁用之后继续安装,仍然提示错误,但出错的信息不一样,后来发现是显卡驱动的问题。重新安装选择第二项“Install system with basic video driver”“使用基本的显卡驱动进行安装”之后一切正常。
选择第一或第二项之后,安装程序会询问是否对安装光盘进行检测的信息如下所示:
图2 询问是否检测光盘
这一步之间选择“跳过”即可。
3.选择语言
安装程序加载完毕之后,进入正式安装过程,如下图:
图3 安装启示界面
点击“下一步”,选择语言及键盘类型,如下图:
图4 选择安装类型
图5 选择键盘类型
这里强烈建议选择English虽然也支持中文,但是支持程度明显欠佳,并且会带来很多路径设置问题。
4.为系统分区
之后会让你选择安装系统的存储介质,如下图:
图6 选择存储设备
选择第一项,并继续。
图7 设置hostname
图8 选择时区
图9 设置root用户密码
接下来就会进入硬盘分区界面,首先是选择硬盘的分区方式如下所示:
图10 选择硬盘分区方式
如果是完全重新安装的话建议选择最后一项“自定义分区”,之后进入硬盘分区界面,如下图所示:
图11 建立硬盘分区
不同于Windows的NTFS,Linux下的硬盘格式是ext2、ext3、ext4,选择硬盘上的空白空间点击创建,选择“创建标准分区”,弹出如下对话框:
图12 设置分区
从上到下依次是:选择硬盘分区的挂载位置,选择分区的文件系统类型,设置该分区的大小。设置好需要的分区之后,记得留下一定的空间建立一个swap类型的分区,这个分区的作用类似于Windows下的虚拟内存。
5.完成安装
之后的过程基本上就是不断的下一步。
图13 安装boot loader
图14 选择安装类型
到了这一步时,选择Desktop这样CentOS就会安装GNOME桌面。另外,建议在此处选择“Customize now”这样在随后的过程中就可以指定其他需要的安装包,因为默认情况下CentOS执行的是最轻量化的安装,只安装一些系统运行的必须库文件和软件包,而在随后安装其他驱动以及软件的时候需要很多其他库的支持,因此在这里事先装好的话,就不需要再通过yum来安装了。那么建议将gcc下的标准C库和标准C++库都安装上去。设置好后就开始进行安装,如下所示:
图15 安装进行中
图16 安装完成
图17 重启之后CentOS的设置向导
此处是选择是否开启“Kdump”功能,大概的作用就是当系统崩溃的时候,会记录下系统的信息便于调试,如果感觉没用不要开启就好,到此所有安装完毕,进入桌面后的界面如下所示:
图18 CentOS的桌面
四、配置yum
因为在之后的安装过程中需要安装很多软件包,而安装这些软件包的时候还需要其他的依赖包,如果完全手动安装非得把人累死,好在Linux平台下有一个叫做yum的软件安装、升级和卸载的管理工具,功能类似于Windows平台中的操作面板中的“安装与卸载”加“自动更新”,但是个人感觉功能要强大很多使用起来却稍显麻烦,不过熟悉就好了习惯了之后还是非常方便的。关于“yum”的配置网上以及很多Linux的书籍中都有介绍,这里就不再赘述。以我自己的经验给大家介绍一下如何配置源。
1.挂载安装光盘
前面提到过CentOS的安装光盘总共有两张,其实除了安装系统之外,这两张光盘中还有很多额外的安装包供大家使用,只要将其添加到yum的源中即可。那么首先要做的就是将两张光盘挂载到系统上,做法如下:
#:cd /mnt
#:mkdir /CentOS-DVD1
#:mkdir /CentOS-DVD2
#:cd /root/Downloads
#:mount –o loop ./CentOS-DVD1.iso /mnt/CentOS-DVD1
#:mount –o loop ./CentOS-DVD2.iso /mnt/CentOS-DVD2
通过以上的命令就可以将存放在/root/Downloads文件夹下的两个CentOS镜像文件分别挂载到/mnt/CentOS-DVD1与/mnt/CentOS-DVD2当中。不过有一个问题是,当前的挂载在系统重启之后就自动失效了,所以为了方便以后的应用,我将其设置为了自动挂载方法是:首先找到/etc/fstab文件,在最后添加如下语句:
/mnt/CentOS-DVD1 /root/Downloads/CentOS-DVD1.iso loop default 0 0
/mnt/CentOS-DVD2 /root/Downloads/CentOS-DVD2.iso loop default 0 0
这样系统在每次重启的时候就会自动地将这两个镜像文件加载到相应的目录中。
2.配置yum源
到/etc/yum.repo.d文件夹下找到CentOS-Media.repo文件并打开进行修改:
在baseurl=之后添加file:///mnt/CentOS-DVD1与file:///mnt/CentOS-DVD2,并将enabled=0改为enabled=1。
修改完成之后默认情况下yum还是首先存CentOS-Base.repo指定的源中查找,为了使用我们指定的本地源有两种做法。第一种做法是将该文件夹下除了CentOS-Media.repo文件外的其他文件全部移除。第二种做法是在使用yum时使用如下指令:
#:yum –disablerepo=\* --enablerepo=c6-media list *
到此yum的配置结束。
五、安装显卡驱动
前面提到过我将一台安装有独立显卡的PC机接入到集群当中以解决ANSYS Fluent打开以及显示缓慢的问题。因为这台机器上安装的是nvidia的显卡,因此为了发挥出显卡的性能,需要安装nvidia的显卡驱动。Linux版本的显卡驱动可以直接到英伟达的官方网站上下载,大小在几十兆左右比Windows上的要小很多,但是过程却比较复杂。在Windows系统下安装显卡驱动只需要简单的双击一下然后不断地下一步就可以,而在Linux系统中还要做很多的额外设置,下面就为大家介绍一下我的安装步骤。
1.切换内核模式
在开始安装之前,建议使用root用户进行登录或者切换到root权限下进行安装,以避免因权限问题产生不必要的麻烦。前面提到过我们选择的是默认安装gnome桌面的安装模式,而gnome实质上是一个X server的应用,而我们在安装显卡驱动的时候需要关闭所有的与X server相关的服务,这就意味着我们必须在没有桌面的纯命令行环境下进行安装。这一点可以通过以下命令实现
#:init 3
输入以上的命令之后,Linux内核将会关闭所有的X server服务进入到纯命令行环境下,那么如何回到桌面环境下呢?很简单,输入以下命令即可:
#:init 5
2.禁用系统自带的Nouveau显卡驱动
CentOS有自带的显卡驱动程序,名为nouveau,并且在6.4版本中会有一个很炫酷的开关机画面。但是我们要安装nvidia的官方显卡驱动就必须要将这个驱动禁用掉,操作过程如下:
首先,在/etc/modprobe.d/blacklist.conf文件中加入如下语句:
blacklist nouveau
然后,到/boot目录下找到一个以“initramfs”开头后缀名为“.img”名字很长中间还有Linux版本号的文件,输入以下命令:
#:mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
#:dracut –v /boot/initramfs-$(uname -r).img
这一步的作用其实就是修改Linxu启动时加载的内核模块,因此有一定的风险,所以第一条命令的作用就是将原有的文件进行备份。从我安装的经验来看,在CentOS 6.4系统中有这么操作的必要,不然安装显卡驱动时依然会提示系统在使用默认的nouveau驱动,在6.2当中这么操作则有可能会导致系统无法正常开机,所以在进行以上操作的时候务必要谨慎。不过也不必太过担心,如果修改之后出新系统无法正常开机的情况,可以在开机的过程中进入到“恢复模型中”使用命令将新生成的文件删除并将原先的文件重命名去掉“.bak”即可。
最后,如果以上的操作都一切正常的话,重启之后进入纯命令行环境下,到nvidia显卡驱动程序的存储路径下输入如下命令:
#:sh NV~~~~~.run
安装程序启动,并开始进行安装,完成后重启,系统自动将nvidia显卡驱动加载到内核中。
六、安装Infiniband网卡的OFED驱动
Infiniband网卡作为节点之间的高速通信设备,对用于高性能计算的集群性能有十分重要的影响。因此正确地安装驱动,显得尤为重要。下面为大家介绍一下我安装驱动的过程以及需要注意的事项。
1.下载官方安装文档
OpenFabrics Enterprise Distribution简称OFED是OpenFabrics Alliance组织发布的一个开源的光纤通讯驱动接口。所有的源代码和安装包以及安装文档都可以在OFA的官网找到:
http://www.openfabrics.org
安装文档非常详细,如果大家耐心看一下将会对安装过程非常有帮助。另外,再次强调一下根据版本的不同支持的操作系统也是不同的,我下载的是OFED 1.5.4在CentOS 6.2下安装顺畅而在6.4中就无法安装。因此建议在安装之前一定要确认一下OFED的版本与Linux版本的兼容问题。另外,Infiniband网卡与主板的兼容问题也需要注意,以避免插上去之后不识别,兼容与否可以在插上去之后使用如下命令进行查看,
#:lspci -v
如果兼容,则会在弹出的硬件列表中找到类似的如下信息:
图19 Infiniband网卡信息
2.开始安装
同安装nvidia显卡驱动一样,安装OFED驱动需要root权限,在安装之前先检查一下所需的安装包是否齐全,下面是从官方的帮助文档中截出的所需的软件包:
图20 OFED所需的软件包
使用如下命令对下载的安装包进行解压:
#:tar –xzvf OFED-1.5.4.tar
进入解压之后的文件夹执行安装程序:
#:./install.pl
弹出如下界面:
图21 安装界面
此处选择“2”,之后安装程序会首先检测之前在系统上安装的OFED驱动程序及与其相关联的软件包,并进行卸载。这里需要注意一下,对于有些正在使用的库文件会提示卸载失败,导致安装程序无法继续进行。这个时候最好重启电脑然后按照出错日志中的描述使用yum将提到的软件包卸载掉。之后安装程序继续进行,如下所示:
图22 安装选项
此处选择“3”与“1”,前两个都输入“Y”,最后一个输入“N”。之后安装程序会开始生成所需的安装包如下:
图23 正在生成rpm安装包
在此过程中,如果系统缺少必要的软件包支持,或者版本不兼容,安装程序就会自动退出,相应的信息会记录在日志文件当中,如果一切正常则如下所示:
图24 安装程序正在进行中
图25 安装成功时显示的信息
看到上图则表明安装过程已经顺利结束。
3.对端口进行配置
驱动安装完成之后,并不意味着就可以立马使用了。还需要对Infiniband网卡端口进行设置,也就是设置IP地址、子网掩码等参数。首先到/etc/sysconfig/network-scripts/文件夹下,然后在此处创建一个名为ibcfg-ib0的文件:
#:./touch ibcfg-ib0
#:./vi ibcfg-ib0
向其中添加如下字段:
DEVICE=ib0
ONBOOT=yes
BOOTPROTO=static
IPADDR=xxx.xxx.xxx.xxx
NETMASK=xxx.xxx.xxx.xxx
NETWORK=xxx.xxx.xxx.xxx
BROADCAST=xxx.xxx.xxx.xxx
从上到下的意思是:
端口名字
开机启动时自动连接
使用静态IP地址
设置IP地址
设置子网掩码
设置网络段
设置该网络段上的广播地址
设置完成后保存并退出,重新启动服务:
#:service xinetd restart
#:ifconfig
将会看到ib0端口的信息,至此配置完毕。接着执行如下命令也开启服务:
#:/etc/init.d/opensmd start
#:ibv_devinfo
在显示的信息中将会看到端口已激活的信息“PORT_ACTIVE”。
七、配置rsh与ssh
ANSYS Fluent在进行跨节点并行计算时,将会使用rsh或者ssh进行MPI的任务分配工作,因此在安装ANSYS Fluent之前需要确保rsh和ssh的配置正确,使各个节点之间能够进行无密码的登录。
1.配置rsh
在进行配置之前,确保与rsh相关的服务都已经正确安装包括rsh、rsh-server以及xinetd。
到/etc文件夹下对hosts文件进行编辑,添加所有节点的IP地址和主机名如下:
#:vi hosts
192.168.1.1 node0
192.168.1.2 node1
xxx.xxx.xxx.xxx hostname
然后确保文件hosts.allow和hosts.deny中的内容为空,并在hosts.equiv中添加所有节点的hostname。到/root目录中修改文件.rhosts在其中添加如下语句:
node0 root
node1 root
node2 root
有多少个节点就添加多少行。
到/etc/xinetd.d/文件夹下依次修改文件rexec、rlogin、rsh将disable=yes改为disable=no。并在文件/etc/securetty中将以上三个文件名添加到最后。
完成以上的配置之后需要重新启动系统的网络服务以使配置生效如下:
#:service xinetd restart
此时进行节点之间的连接,仍有可能失败,这是因为系统的防火墙和安全软件没有关闭,阻值了节点间的登录连接,可通过如下命令关闭:
#:service iptables stop
#:setenforce 0
执行以上命令可以立即关闭系统防火墙和安全软件,但是关机重启之后就无效了,可以通过以下的方式永久关闭防火墙和安全软件:
#:chkconfig iptables off
到/etc/selinux/文件夹下修改文件config,将SELINUX=enabled改为SELINUX=disabled。 至此,就可以通过rsh进行无密码的连接了如下:
#:rsh node1
2.配置ssh
相对于rsh,ssh是一种更为安全的连接方式,两个主机之间的通讯都是被加密过的,并且登录认证的方式也更为复杂,两台主机之间需要知道对方主机的公钥以及私钥。因为我们用ssh的目的主要是为了保证ANSYS Fluent在运行多节点并行的时候可以连接,所以采用最简单的认证方式如同前述的rsh无密码登录一样。
首先,进行配置之前还是要确认一些所需的软件包都已安装完全例如:ssh和ssh-server。
然后,到/etc/ssh文件夹下修改文件ssh_config,对以下字段进行修改:
RhostsAuthentication yes
RhostsRSAAuthentication yes
RSAAuthentication yes
接着,生成本机的公钥和密钥:
#:ssh-keygen –t dsa
生成的公钥和密钥会存放在/root/.ssh目录之下,名字分别是id_dsa和id_dsa.pub。复制这两个文件并重命名,然后拷贝到另一台主机上的相同目录之下,并对那台主机进行同样的操作。
最后,如同rsh的配置一样,重启本机的网络服务,就可以使用ssh进行登录了:
#:ssh node1
八、安装ANSYS
1.安装
Linux平台下的ANSYS安装于Windows系统下的安装过程基本一样,这里就不再赘述。只是在Linux平台下安装完成后,不会在开始菜单或者桌面上添加快捷方式也不会在系统的环境变量中添加默认路径。因此,需要收到添加环境变量以及桌面快捷方式,我的方法是:
#:vi ~/.bashrc
在打开的文件最后添加export PATH=$PATH:/usr/ansys inc/v130/fluent/bin
#:source ~/.bashrc
完成以上的配置之后就可以通过命令行直接启动fluent了,但是不同于本地的多核并行计算,跨节点的并行计算在使用命令行进行启动的时候需要很多额外的参数,例如指定节点之间连接的硬件设备,选定MPI的类型,指定节点的主机名等等非常麻烦。所以还是建议从启动器启动。或者也可以在桌面上添加快捷方式如下:
#:cd /root/Desktop
#:touch “ANSYS Fluent”
#:vi “ANSYS Fluent”
#!/bin/sh
cd /usr/ansys inc/v130/fluent/bin
./fluent
这样就会在桌面上出现一个名为”ANSYS Fluent”的脚本文件,双击就可以直接运行fluent启动器。
2.配置
在每台节点上把ANSYS安装好,且License也配置好之后就可以启动Fluent进行跨节点的并行计算了。但是,还是会遇到问题,我刚开始试的时候就遇到了一个非常让我郁闷的问题。是这样的,当我在本机启动当地的并行计算时没有任何问题,启动跨节点并行计算时在节点数较少如16、32、36个节点时都能正常启动。但是一旦节点数多于48个时在启动的时候就会出现错误,提示信息如下poll:protocol failure in circuit setup。开始的时候我认为是选择的登录方式不对,于是就将rsh换成了ssh,但是同样不成功,不过错误信息变成了ssh_exchange_identification:Connection closed by remote host。于是我又想到了是不是MPI的问题,就将默认的hp-mpi改成了intel-mpi和openmpi,但是同样不行。这个问题当时真的让我很郁闷,并且百度了很长时间也没有找到相应的解决办法。后来我google了一下,在国外的一个CFD论坛叫做CFDonline的地方,看到有人遇到了类似的问题,并且后面还有人进行了回复,他说到产生这个问题的原因是xinetd这个网络连接管理服务默认为了防止访问拒绝攻击也就是常说的DDos攻击对每秒钟的连接数以及每个程序可以使用的连接数都进行了限制,并且还限制了如果连接被拒绝之后恢复到再次可以连接的状态的时间。看到这里,我就明白了Fluent在进行跨节点的并行计算时,初始化的过程中会通过rsh在各个节点上分配相应的进程,当要求的并行节点数很多的时候在很短的时间内会通过rsh与节点之间进行多次连接超过了每秒钟可连接数的最大上限,于是连接就被系统拒绝掉了,所以才出现了以上的错误提示信息。那么怎么解决呢?其实非常简单,只要修改连接数的上限就可以了,方法如下:
到/etc文件夹下对文件xinetd.conf进行修改:
找到有cps标示的一行,在我的系统上默认的值是:cps=50 10意思是每秒钟的最大连接数是50,访问被拒绝后回复到可再次接连时的时间间隔是10秒钟,于是修改上限为cps=5000 1
在找到有instances标示的一行,也将其修改为instances=5000
还要找到有per_source标示的一行,也将其修改为per_source=5000
做完以上的修改之后重新启动xinetd服务,再次启动fluent并且使用了102个核进行并行计算,成功了!再往上增加核数也没有出现错误了。
九、结语
在配置集群的过程中会遇到很多的问题,从硬件安装到软件调试到各个节点之间的通信,对于没有经验的“童鞋”来说会遇到很多令人抓狂的问题,例如我把原先插在服务器上的Infiniband网卡拔下来插到PC机上的PCI-E 16x插口上,刚开始的时候怎么都不亮,用lspci也一直查不到信息,我甚至想着是不是接口不兼容把卡给烧了,后来才发现是主板biso设置的问题,因为那个主板上有三条PCI-E插槽,默认情况下除了插显卡的那一条之外其他都禁用了,开启之后就可以使用了。所以对于类似的问题,遇到的时候不要慌张,仔细想一想,大部分都可以解决的。另外,我要吐糟的是,在用百度搜索遇到的这些问题时,国内的论坛上很少有人对这样的问题能够做出正确的解答,有的也不是很详细,而在国外的论坛上例如前面提到的CFDonline对于一个问题下面经常会有一些非常详细的解答,确实对我帮助很大,可能这跟国内大学的只重“学术”不重“技术”有关吧。所以我将自己的配置过程完完整整地写了下来,希望对遇到类似问题的同学有所帮助。如果还有不明白的地方可以跟我联系。