此处略去用户申请过程,假设你已经拥有了超算中心用户。
好了,开始吧!
工欲善其事,必先利其器。首先我们需要能够连接到超算中心计算机的工具。
Putty:优点:开源,免费。 下载地址
FileZilla:用于文件传输。优点:开源,免费。下载地址
Xmanager:商业软件,功能强大,带图形服务(X Server),整合文件传输。官方地址
入门教程将以Putty和FileZilla为例进行讲解。
接下来我们就用Putty来连接到超算中心服务器(节点名称会因系统调整而有所不同,使用方法不变,后同):
打开Putty:
建立连接:
接受服务器公钥(hostkey,首次使用需要):
依次输入用户名和密码(注意:密码输入时,不会显示任何字符):
登录成功后界面:
如果出现上面界面,那么恭喜你已经成功连接到超算中心服务器。
接下来,我们来运行一些基本的Linux命令:
说明:
[simon@n0255 ~] #命令提示符,simon 表示你的用户名,n0255 表示当前登录的节点的名字
[simon@n0255 ~]$ pwd #显示当前路径
/home/simon #/home/用户名 即为你的home目录
[simon@n0255 ~]$ ls -l #列出当前目录的所有文件及子目录
total 0
lrwxrwxrwx 1 simon simon 11 Apr 11 22:50 data -> /data/simon #/data/用户名 为你的数据目录,在home目录中会有一个链接指向该目录。该目录用于存放你的数据文件
[simon@n0255 ~]$ cd data #进入data目录(其实是进入到/data/simon目录)
[simon@n0255 data]$ ls -l #列出当前目录的所有文件及子目录
total 4
-rw-rw-r-- 1 simon simon 171 Apr 13 00:22 HelloWorld.c
[simon@n0255 data]$ cd .. #返回到上层目录
[simon@n0255 ~]$ [simon@n0255 ~]$
恩,很好。我们成功地运行了一些系统系统命令,接下来我们将编写自己的程序并运行。
好吧,还是以经典的 Hello World C程序入手。
在命令提示符下输入:vim HelloWorld.c
[simon@n0255 ~]$vim HelloWorld.c
说明:
vim 为Linux下常用的编辑器,HelloWorld.c为文件名,如果当前目录下不存在该文件,则新建并编辑,如果存在,打开并编辑。
按下 i 键进入插入模式:
输入以下内容:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return(0);
}
输入完成后按下 Esc 键 退出插入模式,然后输入 :wq 写入并退出。
此时,输入ls,应该能看到刚刚建立的文件:
[simon@n0255 ~]$ ls
data HelloWorld.c
接下来,我们要调用系统的编译器来将我们刚才建立的HelloWorld.c源程序编译成可执行文件:
[simon@n0255 ~]$ gcc HelloWorld.c
[simon@n0255 ~]$ ls
a.out data HelloWorld.c
说明:
gcc 即为系统的C编译器(也可以使用Intel的 icc编译器),后面接你的源程序。
使用 ls 列出当前目录内容 可以看到生成了名为a.out的程序。是的,就这么简单,你的可执行的程序就这样产生了。
接下来,我们执行 a.out 查看下结果:
[simon@n0255 ~]$ ./a.out
Hello world!
[simon@n0255 ~]$
说明:
./a.out 中. 代表当前目录。Hello world! 即为程序的输出了。
恩,程序能运行了,看看还有什么问题?
好吧,我来告诉你:目前你运行的这个程序是在你当前登录的这个节点,也就是n0255上运行的,这个节点也就一个普通的服务器,拥有16个CPU核,如果是运行很多个像我们这样的HelloWorld的程序还是没有啥问题的,但是如果你的一个程序运行需要很长的运行时间,那么16核的CPU就不够用了。特别是这个登录节点同时还有其他用户登录同时使用的,所以 n0255这个节点是禁止运行大量的、长时间占用CPU时间的程序的 。此时我们就需要使用调度系统(SLURM),将我们的程序投放到其它的节点上来运行。
好,说做就做:
[simon@n0255 ~]$ srun -p hpxg ./a.out
Hello world!
[simon@n0255 ~]$
同样很简单吧,srun为我们提交程序,用于把我们程序提交到整个集群系统的节点上去运行的。-p 用于指定分区,hpxg为分区名,我们的集群根据底层网络连接类型分成了hpxg(万兆网络互连,目前已经升级为Infiniband网络互连)、hpib(Infiniband网络互连)、debug(调试用途分区)分区。使用sinfo命令,我们查看各个分区的情况:
我们接着说 srun 的事,从之前运行的情况来看,输出 Hello World!好像直接在n0255登录节点输出没啥两样,现在我们将程序稍微修改下,就可以看出运行的不同了:
[simon@n0255 ~]$vim HelloWorld.c
按 i 进入插入模式,输入:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char hostname[1024];
gethostname(hostname,1024);
printf("%s:",hostname);
printf("Hello world!\n");
return(0);
}
说明:上述程序改动的作用就是在输出Hello World!之前获取主机名并输出。按 Esc 退出插入模式,然后按 :wq 保存并退出。
[simon@n0255 ~]$ gcc HelloWorld.c
[simon@n0255 ~]$ ./a.out
n0255:Hello world!
可以看出,直接运行的程序前面有了 n0255 的主机名了。接下来,我们使用 srun来进行提交看看:
[simon@n0255 ~]$ srun -p hpxg ./a.out
n0242:Hello world!
[simon@n0255 ~]$
由此可以看出,我们这个Hello World!应该是在节点n0242上运行了。
接下来,我们继续修改一下源程序,用来模拟长一点时间(100s)的程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char hostname[1024];
sleep(100);
gethostname(hostname,1024);
printf("%s:",hostname);
printf("Hello world!\n");
return(0);
}
上面程序先sleep了100s,然后才有输出。vim HelloWorld.c,然后 gcc 编译,重新生成 a.out,并运行:
可以看出,程序运行没有返回到命令行,处于等待输入或输出的状态。所以以 srun 提交的程序处于处于交互模式下。
一般只有在程序运行后需要用户人工判断进行输入时才使用交互模式。处于交互模式下运行的程序被人工退出(如Ctrl+c、终端关闭等)或因登录节点故障退出时,程序运行节点的程序也会退出。
当我们进程不需要人工干预时,我们可以使用sbatch命令来进行任务的提交,这样无论是终端退出或登录节点故障都不会影响到我们实际运行的程序。
要使用sbatch提交程序,我们只需要写一个很简单的脚本:
[simon@n0255 ~]$ vim a.sbatch
新建一个a.sbatch(名字或后缀可以随便取)输入以下内容:
#!/bin/bash
./a.out
保存退出,然后给这个脚本加上可执行的权限:
[simon@n0255 ~]$ chmod +x a.sbatch
接着使用 sbatch 提交:
[simon@n0255 ~]$ sbatch -p hpxg a.sbatch
Submitted batch job 2653283
[simon@n0255 ~]$
可以看到,提交会返回了一个job的ID(2653283),之后便又回到了命令提示符的状态。
接下来,我们便可以使用 squeue 来查看我们已经提交了的作业的信息:
squeue的输出我们可以看出我们提交的任务的ID(JOBID),运行所在的分区(PARTITION),任务的名称(NAME),运行的用户(USER),任务状态(ST,R表示正在运行),运行了的时间(TIME),使用了多个节点(NODES)以及使用了的节点的列表(NODELIST)。
任务运行完之后,如果需要查看我们程序的输出情况,默认会在提交任务的目录产生 slurm-jobid.out的文件,所有任务运行的错误已经标准输出会重定向至此文件中。
squeue 只能查看正在运行的任务。如果想查看已经结束的任务历史,可以使用 sacct命令:
接下来,我们来介绍一下使用filezilla 上传或下载文件到超算。
打开filezilla:
通过拖拉或者右键菜单中可将文件或文件夹进行上传和下载。