目录
目录
OpenFOAM在Centos7系统集群上OpenMPI并行的配置
OpenFOAM在Centos7系统集群上OpenMPI并行的配置
主要参考:
http://www.4k8k.xyz/article/PitBXu/109643758
https://qizhanming.com/blog/2018/08/08/how-to-install-nfs-on-centos-7
https://deepzz.com/post/how-to-setup-ssh-config.html
https://blog.csdn.net/shenyuye/article/details/107696635
问题集锦:
https://www.open-mpi.org/faq/?category=running
https://www.cfd-online.com/Forums/openfoam-solving/219020-openfoam-v1812-over-infiniband.html
https://blog.csdn.net/wenfeifang/article/details/83029067
https://blog.csdn.net/xiyangyang8/article/details/49725039
https://github.com/open-mpi/ompi/issues/6377
1)环境说明
已有设备(CentOS Linux 7.6.1810 Kernel:Linux 3.10.0-95)
管理节点:manager 计算节点:node1~6 (上述节点名称与ip address对应,通过/etc/hosts可设置)
[root@manager etc]# cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.10 manager
10.0.0.11 node01
10.0.0.12 node02
10.0.0.13 node03
10.0.0.14 node04
10.0.0.15 node05
10.0.0.16 node06
10.0.0.17 node07
可先测试各节点间是否可以ping通 (ping node01)
预先需要在各节点安装ssh 和 NFS
sudo yum install ssh
sudo yum install nfs-utils
2)建立节点间SSH无密码连接
- 在服务器节点上生成一对SSH 私钥和公钥
- 将公钥上传到集群计算节点
管理节点上生成SSH私钥和公钥
ssh-keygen -t rsa #连续回车
在管理节点的~/.ssh/目录下执行上述命令,生成名为id_rsa的私钥文件和名为id_rsa.pub的公钥文件,-t 表示密钥类型是rsa。
计算节点配置
1)将本地的公钥文件上传
scp -p ~/.ssh/id_rsa.pub root@node01:/root/.ssh/ #将公钥上传到相应(node01)节点的指定免密登录用户(root)的.ssh目录下
2)在相应的节点中需免密登录的用户家目录下查看是否有 ~/.ssh/authorized_keys 这个文件,
如果没有手动创建一个:
touch ~/.ssh/authorized_keys
3)将公钥内容写入到authorized_keys文件中
cat -n ~/.ssh/rsa.pub ~/.ssh/authorized_keys
配置权限
- 将用户的home目录权限设为700
- 将.ssh目录的权限为700
- 将authorized_keys目录的权限为600
注:计算节点配置公钥的方式还可使用 ssh-copy-id 复制公钥
ssh-copy-id username@host #它会将本地的所有公钥都传到对应的节点
或者手动复制服务器节点中id_rsa.pub文件的内容到计算节点的authorized_keys文件中。
为了实现相互免密访问,需要在服务器节点上也储存计算节点的公钥。为了方便起见,可以将服务器节点的公钥和私钥以及authorized_keys(也即.ssh目录)复制到所有计算机节点相应免密用户的.ssh目录,并配置权限,从而不必在每个计算节点上单独生成key和复制key到其他节点。
测试是否已经实现免密登录
ssh user@host
有时为了方便可以在.ssh目录中添加config文件,并配置相应的信息,从而实现默认用户连接方式,更详细的内容可参见:https://deepzz.com/post/how-to-setup-ssh-config.html
$ vim ~/.ssh/config
Host sshtest
HostName ssh.test.com
User user
Port 2200
IdentityFile ~/.ssh/id_rsa_test
Host *
User amber
3)NFS的配置(已安装NFS)
(1)管理节点配置
设置 NFS 服务开机启动
$ sudo systemctl enable rpcbind
$ sudo systemctl enable nfs
启动 NFS 服务
$ sudo systemctl start rpcbind
$ sudo systemctl start nfs
防火墙需要打开 rpc-bind 和 nfs 的服务(如未设置防火墙则不需要打开)
$ sudo firewall-cmd --zone=public --permanent --add-service={rpc-bind,mountd,nfs}
success
$ sudo firewall-cmd --reload
success
配置共享目录(已安装OpenFOAM)
服务启动之后,在管理节点配置一个共享目录。选择OpenFOAM的安装目录(~/OpenFOAM)作为共享目录。根据这一目录,配置相应的导出目录
[amber@manager OpenFOAM]$ cat /etc/exports
/home/amber/OpenFOAM *(rw,sync,no_root_squash,no_subtree_check)
<<COMMENT
/data: 共享目录位置。
192.168.0.0/24: 客户端 IP 范围,* 代表所有,即没有限制。
rw: 权限设置,可读可写。
sync: 同步共享目录。
no_root_squash: 可以使用 root 授权。
no_all_squash: 可以使用普通用户授权。
COMMENT
保存设置之后,重启 NFS 服务。
$ sudo systemctl restart nfs
可以检查一下本地的共享目录
$ showmount -e localhost
Export list for localhost:
/home/zhangzheng/OpenFOAM *
(2)计算节点配置
在对计算节点进行NFS配置前需要建立与管理节点相对应的用户和组以及共享目录
①建立相应的用户和组
在此采用一个shell脚本(adduser.sh)实现批量建立User和Group:
#! /bin/bash
G=$2
U=$3
P=$4
if [[ $1 = "create" ]] && [[ $# -eq 4 ]]
then
# Linux 用户存在则退出
A=`grep -w $U /etc/passwd | wc -l`
if [[ $A -ne 0 ]]
then
echo "USER ALREADY EXIST"
exit 1
fi
# create linux gproup/user/passwd
for i in node01
do
ssh $i "useradd -d /home/$U -g $G $U;echo "$P" | passwd --stdin $U"
#通过echo, 标准输入密码,在sudo命令中也可如此应用 sudo --stdin
done
elif [[ $1 = "delete" ]] && [[ $# -eq 3 ]]
then
# delete linux user,参数依次为 组名、用户名
for i in node01
do
ssh $i "userdel -r $U"
done
else
echo 400
fi
使用一下命令执行adduser.sh( chmod 700) 脚本:
./adduser.sh create GID UID Passwd #输入脚本中创建用户和密码所需的参数
注意在执行此脚本时,应该通过ssh免密登录至对应节点的root用户,可在.ssh的config文件中设置.
②建立共享文件夹
在各计算节点的amber用户下建立相应的文件/home/amber/OpenFOAM,相似的也可采用shell脚本实现,同时需要将免密登录的用户更改为amber。
③挂载共享目录到计算节点
$ sudo mount -t nfs manager:/home/amberMpi/OpenFOAM /home/amberMpi/OpenFOAM
挂载成功后可用df -h命令查看当前节点是否挂载管理节点共享文件
④开机自动挂载共享目录
由于使用mount命令挂载共享目录在重启系统之后会失效,需要进行以下设置以实现开机自动挂载
echo "mount -t nfs manager:/home/amberMpi/OpenFOAM /home/amberMpi/OpenFOAM" >> /etc/rc.local && chmod 777 /etc/rc.local && chmod -R 777 /etc/rc.d
#将挂载命令写入/etc/rc.local 文件尾部,同时将上述文件的可执行权限打开
4)环境的配置与注意事项
SSH免密登录和NSF共享目录配置好后,需要将管理节点和登录节点/home目录中,OpenFOAM的环境变量配置到~/.bashrc 中
source ~/OpenFOAM/OpenFOAM-v2112/etc/bashrc
alias of2112=“source ~/OpenFOAM/OpenFOAM-v2112/etc/bashrc”
- 注意事项:
- 1)需要注意SSH免密登录中相关文件和文件夹的权限设置;注意登录的用户的设置,最好在管理节点和计算节点建立相同的用户;
- 2)NSF共享文件的配置需要建立在相同的用户和用户组间,且其UID和GROUPID均需要相同,通过/etc/passwd可以查看用户的所有信息;如过未满足上述要求则可能出现计算节点写入共享文件夹受限,这点也可通过修改/etc/exports文件中的权限参数进行修改。可参考:https://blog.csdn.net/wenfeifang/article/details/83029067
cat /etc/passwd
amber:x:1001:1001::/home/amberMpi:/bin/bash
# 第一个1001对应UID 后一个为GID
- 3)使用mpirun命令执行相应的OpenFOAM程序时,需要注意mpirun的参数设置问题。否则可能出现无法连接相应计算节点的错误,这种错误与节点间的网络连接方式有关
mpirun –mca btl self,sm,openib //用于 Inifiniband
mpirun –mca mtl psm2 //用于 Omni-Path(OPA)
以下为本集群所使用的mpirun命令脚本:
#!/bin/bash
np=`cat system/decomposeParDict |grep "numberOfSubdomains"| tr -cd "[0-9]"`
echo ""
echo "program will run on $np processors!"
echo ""
mpirun -mca btl_openib_allow_ib 1 --hostfile hosts --np $np simpleFoam -parallel &> log.test &
# -mca btl_openib_allow_ib 1 是比较重要的参数
上述hosts文件为每个节点上进程的分配,其中np=192,每个节点分配32个进程:
node01 slots=32
node02 slots=32
node03 slots=32
node04 slots=32
node05 slots=32
node06 slots=32
查看计算节点的CPU信息(参考: https://blog.csdn.net/w8y56f/article/details/89816283),可登录节点后运行:
#列出物理CPU及各自的物理核数
cat /proc/cpuinfo | grep -E "physical id|cpu cores" | sed 'N;s/\n/ /' | sort | uniq
#输出如下
physical id : 0 cpu cores : 16
physical id : 1 cpu cores : 16
#列出物理CPU及各自的逻辑核数
cat /proc/cpuinfo | grep "physical id" | sort | uniq -c
#输出如下:
32 physical id : 0
32 physical id : 1
OpenFOAM使用小Tips
-
foamNewApp
基于.msh格式的OpenFOAM轴对称网格生成
1)使用ICEM划分平面网格后拉伸extrude一层网格后导出为3D网格,生成的网格导出为ansys fluent 3D *.msh格式。
2)将*.msh格式的网格转化为wedge型网格(wedgePlease工具),具体过程可参考如下所示:
#!/bin/sh cd ${0%/*} || exit 1 # run from this directory # Source tutorial clean functions . $WM_PROJECT_DIR/bin/tools/CleanFunctions fluentMeshToFoam -scale 1e-3 fim_01_00_msh_C_01_01.fluentMesh > log.fluentMeshToFoam wedgePlease -angle 5 # checkMesh > log.checkMesh_bad collapseEdges -overwrite # remove the 0 length edges on the axis patch # checkMesh > log.checkMesh_good # type wedge boundary condition foamDictionary constant/polyMesh/boundary -entry entry0.FRONT.type -set wedge foamDictionary constant/polyMesh/boundary -entry entry0.BACK.type -set wedge createPatch -overwrite #removing patch axis which contains no faces
wedgePleasehttps://github.com/krebeljk/wedgePlease
3)wedgePlease的原始代码中mesh网格以y轴为旋转轴,因此在icem构建模型和网格时需要注意轴线坐标选取。
基于redistributePar的网格剖分与重组
redistributePar的功能选项如下:其中reconstruct 和decompose近似于reconstructPar和decomposePar的功能,但可直接实现多节点间的并行。
以网格的剖分为例,bash脚本如下:
#!/bin/bash`
np=`cat system/decomposeParDict |grep "numberOfSubdomains"| tr -cd "[0-9]"`
echo ""
echo "ReconstrcutPar program will run on $np processors!"
echo ""
mpirun -mca btl_openib_allow_ib 1 --hostfile hosts_re --np $np redistributePar -decompose -parallel -latestTime
注:1)decompose默认为overwrite模式,因此无法如decomposePar -fields一般实现仅剖分变量,而不对网格几何数据进行剖分。2)并行所需核数应等于decomposeParDIict中的分区数。3)对于网格规模千万或亿级和输出变量较多的case,并行相较于串行有十几到几十倍的效果。