计算化学公社
标题: 分享一下超算的一些小技巧 [打印本页]
作者Author: chengdi123000 时间: 2015-3-6 22:52
标题: 分享一下超算的一些小技巧
本帖最后由 chengdi123000 于 2015-3-6 23:02 编辑
新人第一帖,希望大大多多交流
不知道大家超算用得多不多,现在所里用nscc-tj的th-1a系统比较多,用了几周攒了一些脚本,分享一下
th-1a的结构和一般超算都差不多,用户登录vpn,用ssh访问到LN,再在LN中可以访问到CN,用yhi,yhq,yhrun,yhcontrol等命令提交任务。网上资料有很多,比如:
不再详述。
本人是做一点cfd的,所以和量化关系不大,不过超算有几点让人很不爽的地方,可能大家都深有体会,一是vpn太慢,上传下载超级麻烦;二是LN不能连接外网,网上直接down代码来编译也很麻烦。这里分享两个小技巧,可以做得方便一点儿。
nscc-tj的系统得用vpn登录,但是坑爹的这个vpn必须占用系统的22端口,所以通常客户端用windows比较多。
超算的数据量都特别巨大,上传下载数据耗时超长,所以传文件很多人是用快递硬盘的方式,最近一个算例有560G,50k+个文件,vpn平均速度0.3-1.0 MB/s,而且实验室网络总带宽有限,下载和上传都很费劲,个人摸索了一下,发现一个比较好的方式,那就是可以用rsync来同步
rsync本来是linux下的一个同步工具,在windows下的移植是cwrsync,下载地址是:https://www.itefix.net/dl/cwRsync_5.4.1_x86_Free.zip,绿色软件,解压之后把里面的cwrsync.cmd用notepad打开改成cwrsync.bat,内容如下,并根据需要自己需要修改一下相关变量运行就好了,可以在客户端设置计划任务,夜间运行,在计算的同时就开始同步,这样计算生成的文件就源源不断地下载到本地。同样交换一下位置可以进行上传。
特别是计算结果文件通常都是文本文件,特别是结果文件,都是0123456789,这11个字符,采用压缩后,可以加速达10x左右,效果特别明显。
@echo off
rem author: catdog
rem modification: 2015-03-05
set RSYNC_OPT=-n -a -z -h -v -P
rem -n 测试,不输出
rem -a archive模式,保持文件结构、创建时间等
rem -z 启用压缩,对文本文件非常有效!
rem -h 人类可读数字,也就是加上K,G等字头
rem -v 输出详细信息
rem -P 可以断点续传
rem 更多选项可以输入以下命令
rem >rsync --help
rem 设置路径
rem 例如: 完整路径: /vol6/xxx/OpenFOAM
rem 相对($HOME)的路径: ~/OpenFOAM
set SOURCE_PATH=~/OpenFOAM
rem 目标文件夹使用cygwin形式的路径,也就是windows路径的'\'改成'/',把盘符X:改成/cygdrive/x/
rem 例如: C:\WORK\*--> /cygdrive/c/work/*
setDESTINATION_PATH_IN_CYGDRIVE_FORM=/cygdrive/d/
rem 用户名
set USER=xxx
rem 数据节点
set DATA_NODE=TH-1A-LN9
rem 设置环境变量HOME为当前目录,方便ssh使用,因为cwrsync后端采用的cygwin的库,
rem 所以需要一个home文件夹,指定为当地文件夹比较方便,不然会有权限问题
set HOME=%cd%
rem 设置log文件
set RSYNC_LOG=rsync.log
rem 重启的label
:restart
rem '^' 代表续行
rem id_rsa是该用户的私钥文件,可以用ssh-keygen生成,并将id_rsa.pub中的内容加入服务器的~/.ssh/authorized_keys中
rsync %RSYNC_OPT% -e './ssh -i ./id_rsa'--log-file=./%RSYNC_LOG% ^
%USER%@%DATA_NODE%:%SOURCE_PATH%%DESTINATION_PATH_IN_CYGDRIVE_FORM%
rem 利用rsync程序的返回值%ERRORLEVEL%选择下一步操作
if %ERRORLEVEL% GEQ 1 (
echo'----------ERRORLEVEL = %ERRORLEVEL%---------------'
if%ERRORLEVEL% EQU 12 (
remVPN断开会出现,直接退出
echo'----------Error in rsync protocol data stream------'
gotoend
)else if %ERRORLEVEL% EQU 23 (
rem可能是文件路径问题,直接退出
echo'----------Partial transfer due to error------------'
gotoend
)else (
rem不明原因错误,继续
echo'----------Some unclear error, try to restart------'
gotorestart
)
) else (
rem圆满完成,结束
echo'----complete without error!------------------------'
gotoend
)
:end
2. LN节点直接访问网络问题
总所周知,ssh是可以利用-D 选项建立socks proxy接口的,可惜的是,最方便的wget不支持socks proxy,而超算用户权限很低,不能自己安装软件,不过linux下另一个神器curl,正好可以下载文件。这样就可以利用一些技巧,建立反向socks代理
这个过程分两步,第一步,建立本地socks代理,可以采用ssh localhost的方式,也可以使用其他的代理服务器,下面演示的是采用ssh localhost的方式
>>>step 1
首先需要在本地建立ssh服务器,网上很多相关教程,不详述,比如我用的bitvise ssh server,仍旧使用上述cwrsync中的ssh-keygen生成的私钥id_rsa和公钥id_rsa.pub吧,按照下图设置好公钥
(参考链接: http://www.bitvise.com/ssh-server-usage-faq#public-key)
然后在本地用cmd进入cwsync所在路径,输入
set HOME=%cd%
ssh -i ./id_rsa catdog@localhost -p2222 -f -N -D 1081
其中,
set HOME=%cd% 设置环境变量,因为cwrsync后端采用的cygwin的库,所以需要一个home文件夹,指定为当地文件夹比较方便,不然会有权限问题
./id_rsa 私钥,用于免密码登录,便于实现自动化,这里也有个权限问题,如果是在cmd中用cwrsync自带的ssh-keygen生成的id_rsa,需要在属性中去掉Everyone的权限
catdog 登录用户名;
-p2222 表示采用的2222端口号,因为nscc-tj的vpn会占用掉22端口;
-f -N 表示ssh将在后台运行;
-D 1081 在本地建立一个socks 代理,端口1081;
第一步就完成了,现在需要记住,localhost:1081就是我们要的socks 代理,如果你有办法弄到别的代理,比如192.168.1.123:1080,这一步可以省略。
>>> step 2
下面同样地,用ssh,建立反向链接,把服务器的55555端口映射到客户端的1081端口,命令如下
set HOME=%cd%
ssh xxx@th-1a-ln9 -R55555:localhost:1081-i ./id_rsa
其中,
set HOME=%cd% 设置环境变量,因为cwrsync后端采用的cygwin的库,所以需要一个home文件夹,指定为当地文件夹比较方便,不然会有权限问题
./id_rsa 私钥,用于免密码登录,便于实现自动化,这里也有个权限问题,如果是在cmd中用cwrsync自带的ssh-keygen生成的id_rsa,需要在属性中去掉Everyone的权限
xxx 登录用户名;
th-1a-ln9 数据节点;
-R55555:localhost:1081 把服务器的55555端口映射到socks代理端口,在这里是localhost:1081,如果有其他可用socks代理,比如192.168.1.123:1080,可直接使用;
同时请查看登录信息前的信息,如果显示
Warning: remote port forwarding failed for listen port 55555
表示该端口已经被占用,可以用exit退出,换一个端口重试
这样,第二部就完成了,数据节点就建立了一个socks代理:localhost:55555,因为通过-R反向建立了一条通道,此时在服务器中访问localhost:55555,就和在客户端中直接访问localhost:1081是一样的!而根据第一步,客户端的localhost:1081已经被我们变成了一个socks代理。
p.s. windows 的cmd窗口似乎有兼容性问题,最好是将输入法调整为英文EN,不然偶尔有奇怪的事情发生~~
>>>step 3,利用curl直接下载数据
在刚才打开的ssh terminal中输入
alias curlget="curl -O--socks5-hostname localhost:55555" #使用别名curlget来代替后面一长串
curlget whatever_you_want
其中,使用了两个curl的选项:
-O 代表输出成文件
--socks5-hostname localhost:55555 设置socks代理地址,同时用这个代理来解析DNS地址,因为数据节点本身是在内网是无法解析域名的。
curl也可以开启压缩,只不过通常网上下载的都是.zip, .gz这样的压缩包,在下载很大的文件包的时候,就不用倒腾两次了。
3. 总结
1. ssh是很强大的工具,特别是它的端口映射,-L,-R,-D三个选项。可以很方便地来回打洞
2. ssh配合公钥私钥可以比较方便地实现自动化
全文完
作者Author: smutao 时间: 2015-3-7 03:34
很赞! 用过天河的表示赞同。
作者Author: chengdi123000 时间: 2015-3-7 13:13
请问有知道有什么超算上可用的大型并行后处理程序么?paraview需要先打开x-window,nscc的th-1a用不了。后端用vtk的可能都不行,比如VisIt
作者Author: shi891018 时间: 2017-5-19 10:55
谢谢分享~!
欢迎光临 计算化学公社 (http://bbs.keinsci.com/) |
Powered by Discuz! X3.3 |