我还在runsubmit.com上发布了这个问题,这是一个 SE 网络之外的网站,用于解决 SAS 相关问题。
在工作中,我使用了 2 台 sas 服务器。当我通过 proc 上传将 sas 数据集从一个传输到另一个时,它的传输速度约为 2.5MB/s。但是,如果我将一台服务器上的驱动器映射为网络驱动器并复制并粘贴文件,它的运行速度会快得多,大约为 80MB/s(通过相同的千兆连接)。
谁能建议可能导致此问题的原因以及我可以做些什么来解决它或作为解决方法?
我还使用了第三台服务器,它无法在其他两个服务器上映射网络驱动器——SAS 是唯一可用的从该服务器传输文件的方法,因此我需要一个基于 SAS 的解决方案。尽管这一次的单个传输以 2.5MB/s 的速度运行,但我发现可以同时进行多个传输,每个传输速度为 2.5MB/s。
通过文件名和数据步骤的 SAS FTP 会比使用 proc 上传更快吗?接下来我可能会尝试,但我不想使用它——我们只有 SAS 9.1.3,所以 SFTP 不可用。
更新 - 更多细节:
- 我正在连接到一个生成器,我认为它使用“SAS 专有加密”(基于我记得在日志中看到的内容)。
- 在第一种情况下,上传是 Windows 客户端 -> Windows 远程,在第二种情况下是 Unix 客户端 -> Windows 远程。
- 所讨论的 SAS 数据集被压缩(即通过 SAS,而不是某些外部压缩实用程序)。
- 使用 proc upload 以二进制模式传输外部文件 (.bz2) 时,传输速率相似。
- 所有服务器都有由企业级控制器处理的非常快速的磁盘阵列(RAID 10 中至少 8 个驱动器)
潜在的解决方案
- 并行 PROC UPLOAD - 可能足够快,但 CPU 非常繁重
- PROC COPY - 比 PROC UPLOAD 快得多,CPU 开销要少得多
- SAS FTP - 不安全、未知速度、未知 CPU 开销
更新 - 测试结果
- Parallel PROC UPLOAD:涉及大量设置*和大量 CPU,但运行良好。
- PROC COPY:每个会话的传输速率与 proc 上传完全相同,并且使用了更多的 CPU 时间。
- FTP:大约快 20 倍,最少的 CPU(100MB/s 对 2.5MB/s 每个并行 proc 上传)。
*我最初尝试了以下方法:
本地会话 -> 源服务器上的远程会话 -> 目标服务器上的 n 个远程会话 -> 重组目标服务器上的 n 个片段
尽管这导致 n 次同时传输,但它们均以原始速率的 1/n 运行,可能是由于源服务器上的 CPU 瓶颈。为了让它以 n 倍于单次传输的带宽工作,我必须将其设置为:
本地会话 -> 源服务器上的 n 个远程会话 -> 目标服务器上每个远程会话 1 个 -> 重新组合目标服务器上的 n 个片段
SAS FTP 代码
filename source ftp '\dir1\dir2'
host='servername'
binary dir
user="&username" pass="&password";
let work = %sysfunc(pathname(work));
filename target "&work";
data _null_;
infile source('dataset.sas7bdat') truncover;
input;
file target('dataset.sas7bdat');
put _infile_;
run;