主机系统:rhel6.0 (数量不限)

系统环境:selinux and iptables disabled
服务节点: desktop26.example.com     192.168.0.26
计算节点: desktop80.example.com     192.168.0.80
                  desktop83.example.com     192.168.0.83
 
1. 使用SSH密钥让各个节点做到无需密码连接
 
先要在每个节点都要新建一个普通用户用作以后的集群用户
 
    
  1. useradd yejk  
  2. passwd yejk (密码设为westos)  
注意每台节点上的这个普通用户的密码和ID必须相同
 
这里要注意,无论有多少个节点,这个普通用户家目录里的数据都应该完全相同,为了达到这一点可以用一些网络存储实现,这里使用NFS实现,因为实现方法简单且工作稳定
在任意一个节点上部署NFS将yejk的家目录发布出来,其他节点直接挂载此家目录
 
 
    
  1. yum install nfs-utils rpcbind -y 
  2. vim /etc/exports 
  3. /home/yejk      192.168.0.0/24(rw,no_root_squash) 
  4. exportfs -r     #使配置生效 
  5. exportfs -v     #查看 
  6. /etc/init.d/rpcbind start    #需要rpcbind支持 
  7. /etc/init.d/nfs start 
此处注意要加no_root_squash,因为nfs服务器将NFS客户端上的root视为用户nfsnobody,会出现权限 上的问题。发布以后在其他节点上用命令可以直接挂载,并应该写入fstab
  1. mount 192.168.0.80:/home/yejk /home/yejk 
  2. vim /etc/fstab 
  3. 192.168.0.80:/home/yejk /home/yejk              nfs     defaults        0 0 

此时在任意节点上的操作就可以在每个节点上生效

 
    
  1. su - yejk  
  2. ssh-keygen 一路回车即可  
  3. ssh-copy-id -i ~/.ssh/id_rsa.pub desktop80.example.com(与自己信任连接)  
  4. ssh-copy-id -i ~/.ssh/id_rsa.pub desktop83.example.com(与其他节点信任连接)  
  5. sh-copy-id -i ~/.ssh/id_rsa.pub desktop26.example.com(与其他节点信任连接) 

 

 

2.在每个节点上安装mpich2

 
    
  1. yum install mpich2 -y 
  2. su - yejk
  3. cd /home/yejk
创建.mpd.conf文件 (文件前加".")
 
    
  1. vim .mpd.conf 
  2. secretword=westos    #节点的密码,每台节点都得相同 
  3. chmod 600 .mpd.conf 

创建集群节点集合文件mpd.hosts

 
    
  1. vim mpd.hosts  
  2. desktop80.example.com  
  3. desktop83.example.com  

 

 

注:如果以root用户启动mpd服务, 把mpd.conf文件创建在/etc目录中(不加"."),mpd.hosts放在root主目录中

3.1测试mpich2:
启动mpich2
 
     
  1. mpd  
观看启动机器:
 
 
     
  1. mpdtrace 
  2. desktop80.example.com 
 
退出:
 
 
     
  1. mpdallexit 
3.2运行集群系统
 
    
  1. mpdboot -n 2 -f mpd.hosts    参数-n 2指定了要起动的机器个数,-f mpd.hosts指定了运行mpd.hosts文件中指定的节点。 
  2. mpdtrace 
  3. desktop80.example.com 
  4. desktop83.example.com 
  5. mpdallexit 

 

 

3.3单机测试  

 
    
  1. ./icpi-64
  2. Enter the number of intervals: (0 quits) 1000000000  
  3. pi is approximately 3.1415926535921401, Error is 0.0000000000023470  
  4. wall clock time = 46.571311  
  5. Enter the number of intervals: (0 quits) 10000  
  6. pi is approximately 3.1415926544231341, Error is 0.0000000008333410  
  7. wall clock time = 0.000542  
  8. Enter the number of intervals: (0 quits) 0  

 

 

3.4 集群测试

 
    
  1. mpdboot -n 2 -f mpd.hosts 
  2. mpiexec -n 2 /root/icpi-64
  3. Enter the number of intervals: (0 quits) 1000000000 
  4. pi is approximately 3.1415926535899761, Error is 0.0000000000001830 
  5. wall clock time = 15.530082 
  6. Enter the number of intervals: (0 quits) 10000 
  7. pi is approximately 3.1415926544231323, Error is 0.0000000008333392 
  8. wall clock time = 0.006318 
  9. Enter the number of intervals: (0 quits) 0 
  10. mpdallexit 

 

由上述测试的结果可以看出使用单机单进程运行,intervals设为1000000000,耗时46.571311秒,而用两台机器双进程则只有15.530082秒,明显快很多,并行运算还是
很有效果的。不过,如果我们把intervals改为10000,单机运行只用了0.000542秒,而两台机器却花了0.006318秒,这是因为并行运算过程中,参与运算的机器需要通过网
络传递一些消息,如果计算量不大的话,花在了这上面的时间影响会比较明显,因而反不如单机版的来得快
 
4. 排错
 
 
      
  1. mpdcheck获得帮助信息 
  2. mpdcheck -pc 
  3. mpdcheck -l 
  4. 通过mpd.hosts文件查错 
  5. mpdcheck -f mpd.hosts 
  6. mpdcheck -f mpd.hosts -ssh 
  7. 对任意两台机器进行查错 
  8. Station11上: 
  9. mpdcheck -s 
  10. 返回主机名host和端口port 
  11. server listening at INADDR_ANY on: station11 52576 
  12. station12上: 
  13. mpdcheck -c 192.168.0.1 40782 
  14. client successfully recvd ack from server: ack_from_server _to_client 
  15. station11 上返回消息传递结果 
  16. server has conn on from ('192.168.0.12', 54438) 
  17. server successfully recvd msg from client: hello_from_client_to_server 
  18. station1上: 
  19. mpd -e & 
  20. 返回使用的端口 
  21. [1]12703 
  22. mpd_port=42498 
  23. station12上: 
  24. mpd -h station11 -p 41563 & 
  25. [1]5122 
 torque作业调度系统
 
 
     
  1. yum install gcc gcc-c++ make -y 
  2. tar zxf torque-3.0.0.tar.gz 
  3. cd torque-3.0.0 
  4. ./configure --with-rcp=scp --with-default-server=desktop26.example.com (--with-rcp=scp用于ssh key方式) 
  5. make 
  6. make install (torque的配置目录: /var/spool/torque) 
  7. make packages (生成计算节点安装包,即在station11和station12上安装的包,确保所有计算节点和服务节点的架构是相同的) 
  8. cp contrib/init.d/pbs_server /etc/init.d/
  9. cp contrib/init.d/pbs_sched /etc/init.d/
  10. scp contrib/init.d/pbs_mom desktop80.example.com:/etc/init.d
  11. scp contrib/init.d/pbs_mom desktop83.example.com:/etc/init.d
  12. vi /var/spool/torque/server_priv/nodes (设定计算节点,服务节点也可做计算)
  13. desktop80.example.com
  14. desktop83.example.com
  15. ./torque.setup root (设置torque的管理帐户)
  16. qterm -t quick (停止torque)
  17. service pbs_server start (启动torque)
  18. service pbs_sched start (启动调度程序)
  19. scp torque-package-clients-linux-x86_64.sh torque-package-mom-linux-x86_64.sh desktop80.example.com:~
  20. scp torque-package-clients-linux-x86_64.sh torque-package-mom-linux-x86_64.sh desktop83.example.com:~
  21.  
 在所有计算节点安装torque,在所有计算节点执行如下命令:
 
 
     
  1. ./torque-package-clients-linux-x86_64.sh --install  
  2. ./torque-package-mom-linux-x86_64.sh --install 
注:如果计算节点的架构和服务节点不同,安装方法如下:
 
 
     
  1. tar zxf torque-3.0.0.tar.gz 
  2. ./configure --with-rcp=scp --with-default-server=server1.example.com 
  3. make 
  4. make install_mom install_clients 
 
 
     
  1. vi /var/spool/torque/mom_priv/config (所有计算节点执行此配置) 
  2. $pbsserver server1.example.com 
  3. $logevent 255 
  4. service pbs_mom start (所有计算节点执行此命令,启动计算节点守护进程)
测试
torque的调度需要使用非root用户
 
 
     
  1. su - yejk 
  2. cd /home/yejk 
  3. vim job1.pbs (串行作业) 
  4. #!/bin/bash 
  5. #PBS -N job1 
  6. #PBS -o job1.log 
  7. #PBS -e job1.err 
  8. #PBS -q batch 
  9. cd /home/yejk 
  10. echo Running on hosts `hostname` 
  11. echo Time is `date` 
  12. echo Directory is $PWD 
  13. echo This job runs on the following nodes: 
  14. cat $PBS_NODEFILE 
  15. echo This job has allocated 1 node 
  16. ./prog 
  17.  
  18. vi job2.pbs (并行作业) 
  19. #!/bin/bash 
  20. #PBS -N job2 
  21. #PBS -o job2.log 
  22. #PBS -e job2.err 
  23. #PBS -q batch 
  24. #PBS -l nodes=2 
  25. cd /home/yejk 
  26. echo Time is `date` 
  27. echo Directory is $PWD 
  28. echo This job runs on the following nodes: 
  29. cat $PBS_NODEFILE 
  30. NPROCS=`wc -l < $PBS_NODEFILE` 
  31. echo This job has allocated $NPROCS nodes 
  32. mpiexec -machinefile $PBS_NODEFILE -np $NPROCS ./prog 
 
     
  1. vi prog 
  2. #!/bin/bash 
  3. echo 1000000000 | ./icpi-64 (icpi程序是mpi自带的,拷贝过来即可) 
  4. chmod +x prog 
 
 
     
  1. qsub jobx.pbs(提交作业) 
  2. qstat (查看作业) 
  3. pbsnodes (查看节点)
使用单节点计算,串行计算截图:

 

 
查看结果
 
      
  1. [yejk@desktop26 ~]$ cat job1.log  
  2. Running on hosts desktop80.example.com 
  3. Time is Sat Jun 2 05:33:32 CST 2012 
  4. Directory is /home/yejk 
  5. This job runs on the following nodes: 
  6. desktop80.example.com 
  7. This job has allocated 1 node 
  8. Enter the number of intervals: (0 quits) pi is approximately 3.1415926535899708, Error is 0.0000000000001776 
  9. wall clock time = 43.059767 
  10. Enter the number of intervals: (0 quits) No number entered; quitting 
使用集群并行计算截图:
 

 
 
      
  1. [yejk@desktop26 ~]$ cat job2.log  
  2. Time is Sat Jun 2 05:49:29 CST 2012 
  3. Directory is /home/yejk 
  4. This job runs on the following nodes: 
  5. desktop83.example.com 
  6. desktop80.example.com 
  7. This job has allocated 2 nodes 
  8. Enter the number of intervals: (0 quits) pi is approximately 3.1415926535900072, Error is 0.0000000000002141 
  9. wall clock time = 23.318623 
  10. Enter the number of intervals: (0 quits) No number entered; quitting 
  11. You have mail in /var/spool/mail/yejk 
  12. [yejk@desktop26 ~]$  
可以看到同样的任务并行的时间用的短
注:1. 以上测试我是以yejk用户测试,确保所有节点上有此用户,并且在计算节点上的yejk用户目录中有 prog 和 icpi 两个可执行程序
2. 启动mpd程序时要使用yejk用户 因为在调度时会连接计算节点上/tmp/
mpd2.console_yejk