Linux 入门教程——服务器使用

气象家园投稿第七篇:服务器使用

“Linux 入门教程”系列终于要进入尾声啦!在这最后一期里,我想讲讲有关服务器使用的一些问题。那么为什么要使用服务器呢,自己电脑不够用吗?是的!在科研刚开始的阶段,我也只是用个人电脑下下数据画画图,可是到后面接触了模式以后,计算量太大,数据也很多,就不得不依赖服务器了。服务器其实可以理解成比较厉害的计算机,其运算速度快,存储空间大,因此数值模式一般都会在服务器上运行。但正因为服务器比较好用,大家都抢着用它,所以“多个用户如何充分利用好服务器的计算资源”就变得非常重要。这意味着,同样是使用 Linux 系统,在服务器上就需要考虑一些新的问题。

远程登录

相比于个人电脑,服务器通常是多用户的,而且是多个用户同时使用的。在服务器管理员的管理下,每个用户在自己的目录下做着自己的事情,不会相互打扰。假如我现在向某个服务器的管理员申请到了一个帐户,可我要去哪里打开服务器并登录自己的帐号呢?实际上服务器一直都处于开机状态,并被集中放置在机房里,由专人进行管理,用户们只需要登录并使用它即可。当然大家并不会跑到机房里进行登录,而是采取远程登录的方式,只要连上局域网,就能在实验室或者宿舍使用服务器了。
不管自己的电脑是 Windows 系统还是 Linux 系统,我们一般都会采用 ssh 协议进行远程登录。在 Linux 下,输入 ssh 命令即可:

1
[N@Dell ~]$ ssh $user@$ip

其中 $user 是你在服务器上的用户名,$ip 则是服务器的 IP 地址,输入命令后系统会提示你继续输入密码。如果是第一次连接,还会有个小提示,输 yes 就行啦。不过还有关于图形系统(X Window System)的问题,即按照上述命令登录以后,是无法进行画图显示的。比如我用 ncl 打开一个 x11,会显示 --X driver error: DISPLAY environment variable not set;再试试运行 MATLAB,发现它并没有启动图形窗口,而是直接进入了命令行模式。如果想要正常使用图形系统,只需在登录时加上一个选项:

1
[N@Dell ~]$ ssh -X $user@$ip

如果想在 Windows 系统下登录服务器,则需要下载一个远程登录软件。这里我推荐一下 Xmanager,感觉它使用起来相对比较友好。Xmanager 包含多个应用程序,其中 Xshell 就是用来进行远程登录的,选择协议为 ssh 之后填上用户名、密码和 IP 就 OK 了。若要使用图形系统,记得运行一下 Xmanager - Passive。

文件传输

远程登录没有问题了,可如何在个人电脑和服务器间进行文件传输呢?通常也是采用的 ssh 协议。如果使用 Linux 系统,则会用到 scp 命令,其用法类似于 cp 命令:

1
2
[N@Dell ~]$ scp $user@$ip:$file $des
[N@Dell ~]$ scp $file $user@$ip:$des

同样需要指定用户名、服务器 IP,同时要指明源文件 $file 及目标地址 $des。这里第一行是从服务器下载至本地,第二行是从本地上传至服务器,实际上就是在 cp 的用法基础上加入了 $user@$ip。如果要传输文件夹,当然也是加上 -r 选项啦(类似于 cp )!
对了,顺带提一下 rsync 命令:

1
2
[N@Dell ~]$ rsync -P --rsh=ssh $user@$ip:$file $dir
[N@Dell ~]$ rsync -P --rsh=ssh $file $user@$ip:$dir

这是一个远程同步工具,功能比较强大。我们可以用它来代替 scp 进行文件传输,因为它能实现断点续传。这里不多做介绍了,大家可以自行百度。
对于 Windows 系统,假如你使用的是 Xmanager,只需要点击 Xshell 工具栏的“新建文件传输”按钮,就会出现文件传输的窗口了。咦,这个文件传输窗口叫 Xftp,难道是采用的 ftp 协议吗?可是我们服务器都没开 ftp 协议,不可能是 ftp 传输的,所以我猜测其实相当于用了 scp 命令。不过我也没有仔细去研究它 (;-_-)

用户管理

尽管服务器性能优良,但用户一多就得考虑合理分配的问题。而作为用户,我们要时刻注意自己的使用情况,如 CPU 和内存的占用率、磁盘配额、文件系统限制等等。由于用户管理是一个比较大的问题,我现有的经验也比较零散,所以决定从几个重要命令入手,给大家说说我关注的问题吧。
freetop
free 可以查看内存使用情况,而 top 可以查看进程的 CPU 占用率、内存占用率、优先级等。这类似于在 Windows 下查看任务管理器,来了解机器运行状况。如果服务器负载过高,可以跟管理员反馈反馈。
dfdu
了解服务器的总存储空间大小是很重要的,所以需要用到 df 命令。知道了总空间大小,当然也得知道自己目录占了多少空间,一般输入 du -sh dir 就可以查看 dir 的大小了。
ps
ps 可以查看进程的运行情况。直接输 ps 可以查看当前会话的进程,若要查看自己所有的进程(包括其他会话的进程以及后台进程),则可以输入 ps -fu $user$user 即用户名。若输入 ps -fe,则会显示所有用户的所有进程。
quota
因为服务器是供多用户使用的,所以对每个用户限定其可用磁盘空间也是理所当然的。大家使用服务器时是否遇到过无法写入磁盘的问题呢?有可能就是磁盘额度不够造成的。如果额度不够了,就只能删掉那些没用的文件,释放空间之后才能写入。这时候就得用 quota 看看总额度是多少,以及需要腾出多少空间。
ulimit
除了磁盘空间,用户的可打开文件数、可使用内存总量、可使用进程数等等也会被限制,相关信息的查看与设置需要用到 ulimit 命令。如 ulimit -n 设置可打开文件数,ulimit -u 设置可使用进程数。还有在运行模式时,如果出现 segmentation fault,有可能是 ulimit 设置问题,可以尝试输入 ulimit -s unlimited 来解决。需要注意的是,用户并不能随心所欲地使用 ulimit 来进行调整哦~

后台运行

有时候我们的程序要运行很久,如果需要等它运行完才能进行其他操作,难免会有不便之处。解决的办法就是把程序挂到后台运行,这样就能继续输入其他命令,甚至退出登录也不会影响程序的运行。
比如我在服务器上运行 matlab 之后,会话窗口就不能输入其他命令了。这时按下 Ctrl+zmatlab 会被临时挂起,输入 jobs 就能查看到 matlab 的运行情况。根据 jobs 的显示,我们再使用 bg 命令,即可把 matlab 移至后台。具体过程如下:

1
2
3
4
5
6
[N@Dell ~]$ matlab
[Ctrl+z]
[1]+ Stopped matlab
[N@Dell ~]$ bg 1
[1]+ matlab &
[N@Dell ~]$

当然,我们也可以通过 fg 1 命令,来将 matlab 重新移至前台,此时又回到了无法继续输入命令的状态。
让我们考虑另一种情况:我用 ncl 对大量数据进行插值,并将插值后的数据保存成文件,但我算了一下时间,完成所有插值需要一天,那我岂不是要一整天都开着电脑并保持登录状态?万一网络出错,连接超时了,程序不就断啦!没错,这样就需要后台运行了,不过为了保证退出登录后程序仍会运行,需要用到 nohup 命令。由于上述 matlab 例子的操作比较繁琐,我们采用一种更为简便的方式来实现:

1
[N@Dell ~]$ nohup ncl interp.ncl > interp.log 2>&1 &

平常情况下,我们会输入 ncl interp.ncl 来运行脚本。而这里,首先我通过 > interp.log 2>&1 将标准输出和标准错误输出重定向到 interp.log 文件里。然后在命令末端加上 & 符号,可将程序移至后台运行。最后在命令首端加上 nohup,以保证退出登录后程序不会中断。之后就可以退出登录,关闭电脑,等一天过后再来查看了。
关于程序的后台运行,我只推荐在小型服务器上进行,如自己老板的服务器。对于大型服务器,如全院或全校共同使用的机群,就不要自行将程序移至后台了。对于机群来说(机群包含多台计算机,每台计算机为一个节点),通常会分成登录节点和计算节点,各种程序都应该被放到计算节点上运行。按照刚才的方式,我们会直接在登录节点上将程序转至后台,而无法将它们放到计算节点上去。另一方面,即使是登录到计算节点后再进行后台运行,如果多个用户在同一节点上长时间运行程序,该节点就会变得拥挤,而其他节点却很空闲,这样就不利于服务器的合理利用了。因此服务器通常不会允许用户长时间地自行运行程序(不管是前台运行还是后台运行),而是让用户经由作业系统来运行大型程序。

作业系统

对于机群而言,用户一般在登录节点上登录,但不在登录节点上运行程序,而是经由系统将程序放到计算节点上。其中完成分配工作的就是作业系统了。当新任务提交时,作业系统会对目前机群使用情况进行分析,并根据该任务所需资源,来决定最终使用哪几个计算节点。作业系统实际上就是个管理软件,而这管理软件在不同服务器上可能是不同的。我之前在好几个服务器上接触了不同的作业系统(如 SLURM、Platform LSF 和 LoadLeveler),发现不同的作业系统有着相同的用法,学起来也是一通百通。这里我就以 Platform LSF 为例来讲讲基本用法:

1
2
3
4
[N@Dell ~]$ bhosts
[N@Dell ~]$ bsub -a openmpi -n 40 -e test.err -o test.out mpirun.lsf ./test
[N@Dell ~]$ bjobs
[N@Dell ~]$ bkill jobid

首先 bhosts 可以查看各节点的占用情况,然后用 bsub 来提交作业,之后用 bjobs 查看当前作业运行情况,而如果想终止作业的话可以使用 bkill。其中 bsub 后的 -a openmpi 指定了采用的并行方式为 openmpi-n 40 指定程序将使用40个核,-e test.err -o test.out 指定标准输出和错误输出的日志文件,mpirun.lsf ./test 则为所运行的程序。bkill 之后接作业编号,该编号由 bjobs 查询得到。
简单来看,使用作业系统基本就是这四条命令了,是不是很简单呢?当然你可以自己去查看其他命令,也可以去了解其他作业系统,这里我就不再赘述了。

结语

终于到了完结撒花的时候啦!虽说一开始我就已经想好所有7期的主题了,但在确定每期的具体内容时总是思前想后,困扰不已,也曾因为太忙而拖了好久没写。这个系列算是我第一次尝试在微信公众号上发表连载文章,只能说深切体会到了写文章的不易。当然了,我感觉自己得到了不少锻炼,也希望大家看了我的文章以后能有一些帮助。如果大家觉得我写得不好,欢迎指正,任何合理意见与建议我都会好好听取的,下次再有机会的话我会努力做更好~ ◕‿◕