本帖最后由 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配合公钥私钥可以比较方便地实现自动化
全文完
|