Download presentation
Presentation is loading. Please wait.
1
NUIST HPC使用讲座 —— 用户环境设置 刘建宇
2
!!!声明!!! ftp://202.195.238.13/Public/User_Environment.pdf 仅校内可访问
这里讨论的用户环境设置是基于目前(2014年)的NUIST HPC的配置上进行的 相关的用法、设置方式等有一定的普遍性,也有本地局限性 这里讨论的用法、设置方式,在不同的系统及配置下可能不适用 这里讨论的用法、设置方式,可能有不全面或不足之处 仅供参考,谨慎使用 ftp:// /Public/User_Environment.pdf 仅校内可访问
3
用户环境设置方式 静态设置 动态设置 直接在用户环境文件(.bashrc, kshrc, cshrc等)中设置具体的路径信息
在脚本中硬编码嵌入具体的路径信具体的路径信息 适用于单一或静态的环境 设置简单,不需要特殊的脚本编程知识 动态设置 使用“modules” system,例如 Environment Modules Lmod 适用于多版本共存,需要动态切换的复杂环境 需要相应的脚本编程知识
4
用户环境变量 PATH LD_LIBRARY_PATH MANPATH 应用程序环境变量
可执行程序的搜索路径 当前路径”.”不是缺省搜索位置 从安全角度考虑,缺省设置没有把”.” 添加到可执行程序搜索路径中 当前路径”.”不在可执行程序搜索路径中时,执行当前路径下的可执行程序时,必须指明当前路径信息“./”,例如;”./hello” 从方便角度考虑,可以在自己的用户环境文件中在PATH环境变量中添加当前路径”.” LD_LIBRARY_PATH 运行时,除了ld.so.conf中设置的缺省路径之外的其他共享库的搜索路径 该路径在缺省路径之前查找 跟编译时库搜索路径没有关系,编译的时候还是该加-L就得加,不要混淆 该变量只适用于Linux,其他系统如,AIX, Mac OS X等不使用该变量 MANPATH 帮助命令man搜索man page的路径 应用程序环境变量 根据具体的应用程序而定,例如,NETCDF, NCARG_ROOT等
5
用户环境变量(续) 以下环境变量慎用,可能会与预期的工作方式不同 FPATH LIBRARY_PATH C_INCLUDE_PATH
KSH的shell function的搜索路径 可用于头文件搜索路径 (Linux OS and Mac OS X) LIBRARY_PATH gcc 编译期间查找动态链接库时指定查找共享库的路径 不是所有编译器都会使用该变量 C_INCLUDE_PATH gcc 编译期间头文件的搜索路径 CPLUS_INCLUDE_PATH g++ 编译期间C++头文件的搜索路径
6
用户环境变量(续) 编译相关的通用约定环境变量 以下环境变量仅为通用约定,具体的应用程序不一定遵循这些约定
使用遵循通用约定的configure/make时,如无具体设置这些变量,则会调用缺省的编译设置 FC Fortran 编译器 F90 Fortran 90编译器 F95 Fortran 95编译器 F77 Fortran 77编译器 CC C 编译器 CXX C++ 编译器 CPP C预处理器 FCFLAGS Fortran 编译选项 FFLAGS F77 编译选项 CFLAGS C 编译选项 CXXFLAGS C++ 编译选项 CPPFLAGS C预处理选项 LDFLAGS 链接选项
7
使用Environment Modules
常用命令 列出加载的模块 – module list 列出可用的模块 – module avail 加载指定的模块 – module load 卸载指定的模块 – module unload 切换不同的模块 – module switch 使用自定义module 需要首先加载 use.own 模块 把自定义的模块放$MODULEPATH中定义的用户自定义模块路径下,一般为$HOME/privatemodules 或 $HOME/.privatemodules module 脚本的编写采用tcl/tk( 可参考$MODULEPATH中定义的模块路径下的脚本来改写自己的module脚本 加载Module时按$MODULEPATH中定义的路径顺序搜索,使用第一个匹配的项目
8
Environment Modules注意事项
‘module load’ 为前添加方式 后加载的模块的路径在最前面 在搜索路径时,按路径顺序搜索,使用搜索到的第一个匹配项目 某些模块需要使用的库有兼容性问题 libhdf5 : matlab, hdf5 / ncl + netcdf 4.x 某些模块可能有依赖关系 netcdf 4.x, hdf5, ncl IMPI, MKL, Intel Compiler 编译模块是基础模块,大多数模块的加载都依赖于编译模块 需要首先加载编译模块,然后再加载其他的模块 加载缺省版本模块时,可以不用指明版本号 切换不同版本模块时,需要指明版本号 在module加载后,修改了module脚本,再卸载,无法完全清除旧的信息。因此,要更改module脚本时,如该module已加载,需要先卸载,再更改module脚本。
9
用户环境设置注意事项 对同一环境变量,同时通过module命令与静态方式分别进行设置,只有其中的一个设置会有效,例如,
module load netcdf/3.6.3 export LD_LIBRARY_PATH=/my/netcdf/lib:${LD_LIBRARY_PATH} export的设置有效 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/my/netcdf/lib export的设置无效 module加载的netcdf-3.6.3的LD_LIBRARY_PATH有效(前添加方式) 通过module load加载相关库后,只是设置了常用约定的环境变量,并非适用所有的应用情形。针对具体的应用,可采用以下步骤获得正确设置所需要的信息 先使用module load加载相关的模块 使用env命令,查看PATH、LD_LIBRARY_PATH中等对应模块的位置及相关变量的设置 根据具体应用的要求,设置对应的相关信息
10
用户环境设置注意事项(续) 除非清楚相关的设置及相关关系,否则最好不要同时混用module命令与静态方式进行设置,特别是交叉混合设置不同编译器,不同版本库 可执行程序、库、头文件的搜索都是依相关搜索路径顺序进行,使用第一个匹配的项目。在有多个同名文件时,需要注意搜索路径顺序,以免使用的并不是所期望的。 在用户环境文件或脚本中安全切换环境设置的方式为 module purge module load use.own # 可选步骤,如果需要加载自己的模块 module load ‘编译器模块’ module load ‘相关模块 … …’ 当登录节点的login shell与计算节点的login shell设置不同时,有可能引起作业运行时因环境初始化不一致而导致作业运行问题。这一问题大多发生在用户账户信息同步的问题上。可以通过设置相应的login shell的用户环境设置文件自行解决或通知系统管理员对账户信息同步进行处理 当login shell 与作业脚本shell不同时,相应的用户环境设置文件中都要进行相同的设置,以避免出现运行时,运行环境不一致的情况
11
login shell与non login-shell
取得Shell需要完整的登入流程,就称为login shell non-login shell 取得Shell而不需要重复登入的动作 login shell 和 non-login shell的最大区别在于读取环境变量的配置文件不同 在X介面下启动的终端,基本都是non-login shell
12
Interactive与non-interactive shells
login shell 或 non-login shell 可以交互式输入/中断命令 non-interactive shell 一个子shell,通常是一个non-login shell 在interactive shell下执行脚本,将会启动non-interactive shell non-interactive shell只能从其父进程处继承环境变量 ksh 在non-interactive shell中不扩展父进程中的别名和shell functions
13
用户环境初始化流程 bash ksh ? ~/.bash_profile /etc/profile ? ~/.bash_login
NO Yes Yes ? ~/.bash_login login shells NO ~/.bash_login ~/.profile ~/.bash_profile non-login shells ~/.bashrc $ENV ksh ~/.kshrc NO -p /etc/profile ~/.profile $ENV non-login shells Yes non-login shells
14
用户环境初始化流程(续) csh/tcsh tcsh ? ~/.tcshrc /etc/csh.csh /etc/csh.login
Yes NO login shells ~/.tcshrc -f option NO ~/.cshrc non-login shells Yes
15
不同Shell模式都涉及的用户初始化文件
执行方式 bash ksh csh/tcsh interactive login shell 打开putty终端 ~/.bashrc ~/.kshrc ~/.cshrc interactive non-login shell 打开xterm终端 non-interactive login shell 执行远程命令 non-interactive non-login shell 运行一个脚本 crontab启动任务 注:以上测试环境为 Red Hat Enterprise Linux Server release 6.2 (Santiago) GNU bash, version 4.1.2(1)-release ksh sh (AT&T Research) 93t tcsh (Astron) 因环境/系统配置不同,有可能有差异
16
运行MPI任务时环境初始化过程 调度节点 主节点 MPI任务节点 non-interactive login shell 执行远程命令
脚本中所设环境变量只在主节点及对MPI主进程有效,要传递到MPI任务节点,需通过MPI启动脚本的相应参数 执行远程命令 my_job.sh 环境变量继承顺序 non-interactive non-login shell 主节点 环境变量 MPI节点 环境变量 mpirun non-interactive non-login shell 执行远程命令 non-interactive login shell mpi_prog.exe … …
17
运行MPI任务时环境初始化过程(续) 主节点 MPI任务节点 Interactive login shell my_job.sh
脚本中所设环境变量只在主节点及对MPI主进程有效,要传递到MPI任务节点,需通过MPI启动脚本的相应参数 my_job.sh 环境变量继承顺序 non-interactive non-login shell 主节点 环境变量 MPI节点 环境变量 mpirun non-interactive non-login shell 执行远程命令 non-interactive login shell mpi_prog.exe … …
18
作业脚本的额外设置 login shell – CSH login shell – KSH 使用qsub 提交KSH的脚本
设置#PBS -S /bin/bash可避免出现以下信息(需.bashrc与.cshrc的设置一致) e file : tput: No value for $TERM and no -T specified o file : Warning: no access to tty (Bad file descriptor). Thus no job control in this shell. login shell – KSH 设置#PBS -S /bin/bash可避免出现以下信息(需.bashrc与.kshrc的设置一直) /etc/profile[90]: .[5]: .[5]: .[46]: shopt: not found [No such file or directory] 如果需要在作业脚本中使用module命令,则需在作业脚本开头添加以下命令进行ksh的环境初始化 ‘ . /etc/profile.d/modules.sh ’ 使用qsub 提交KSH的脚本
19
作业脚本的额外设置(续) 把当前脚本中用户环境变量复制到作业脚本运行环境中 在PBS作业脚本中设置#PBS –V #!/bin/bash
export work_dir=/blah/blah export data_dir=/blah/blah … … qsub my_job.sh ... … my_job.sh #!/bin/bash #PBS -N check_env #PBS -q Regular #PBS -l node=2:ppn=2 #PBS -l walltime=00:00:05 #PBS -P P #PBS -V echo work_dir=‘|’$work_dir‘|’ echo data_dir=‘|’$data_dir‘|’
20
快速检测运行环境 平台信息的检测 /etc/system-release lsb_release -a uname -a
/proc/cpuinfo 查看cpu类型 cat /proc/cpuinfo | grep "model name" 具有相同core id的cpu是同一个core的超线程 cat /proc/cpuinfo | grep "core id" 具有相同physical id的cpu是同一颗cpu封装的线程或者cores cat /proc/cpuinfo | grep "physical id" siblings 与 “cpu cores”不一致,则超线程打开 cat /proc/cpuinfo | grep " siblings" | sort –u cat /proc/cpuinfo | grep " cpu cores" | sort –u /proc/meminfo egrep --color 'Mem|Cache|Swap' /proc/meminfo free 命令 free -g vmstat
21
快速检测运行环境 软件环境的检测 mpirun -np $nprocs env #!/bin/bash #
#PBS -N check_env #PBS -q Regular #PBS -l node=2:ppn=2 #PBS -l walltime=00:00:10 #PBS -P P cd $PBS_O_WORKDIR pwd > env_pwd_out module list > env_module_out 2>&1 env > env_out ulimit -a > env_ulimit_out echo $PATH > env_PATH_out echo $LD_LIBRARY_PATH > env_LD_LIBRARY_PATH_out which mpirun > env_which_mpi mpicc -v >> env_which_mpi 2>&1 mpif90 -v >> env_which_mpi 2>&1 每个节点都运行 mpirun -np $nprocs env 只在主节点运行
22
快速检测运行环境 (续) qsub hello.pbs
#!/bin/bash # #PBS -N hello #PBS -q Regular #PBS -l node=2:ppn=2 #PBS -l walltime=00:00:10 #PBS -P P cd $PBS_O_WORKDIR mpirun -np 4 ./hello program hello include 'mpif.h' integer rank, size, ierror, tag, status(MPI_STATUS_SIZE) call MPI_INIT(ierror) call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror) print*, 'node', rank, ': Hello world' call MPI_FINALIZE(ierror) end mpif90 -o hello hello_mpi.f90 qsub hello.pbs #include <stdio.h> #include <mpi.h> int main(int argc, char* argv[]) { int rank, size; char hostname[256]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); gethostname(hostname,255); printf("Hello, world, I am %4d of %4d on host %s\n", rank, size, hostname); MPI_Finalize(); return 0; } mpicc -o hello hello_mpi.c
23
问题或建议
Similar presentations