2014-07-12 46 views
2

我在rails上使用ruby并使用net-ssh gem将ssh放入另一台机器,运行一些脚本,将脚本输出回到rails中,然后在我的站点上提供该输出。这将需要发生很多,实际上这是我网站的核心。加速红宝石ssh握手

脚本本身花费的时间很少,但响应时间范围在瞬间到15秒之间。 SSH握手需要可变时间。

这里是我的Ruby代码做SSH:

res = [] 
Net::SSH.start(host, user, :password => pass) do |ssh| 
    # execute container 
    ssh.exec("run script") do |ch, stream, data| 
     res.push(data) 
    end 
end 
res = res.join("") 
render text: res 

任何想法如何使这个超级快?

我想知道是否应该保持ssh连接在任何时候都打开,并且每次需要运行脚本时都会添加新线程(这将会很多)。我已经看到人们谈论ControlMaster,但不知道如何做到这一点。

+0

从应用服务器到ssh服务器使用命令行'ssh'时,你是否会得到相同的偶尔减速?它们之间的网络可靠吗? – Matt

回答

0

如果这是您网站的核心,您可能不想依赖SSH和exec。

另一种方法是在外部主机上使用Ruby/Rails而不是SSH,并通过更标准的Web API或像zeromq这样的消息传递系统将作业直接推送到Ruby。创建一致的Service-oriented architecture。否则,您应该维护从Ruby的SSH连接作为background daemon中的长时间运行任务,然后通过IPC(如zeromq或http或者简单地您的数据库)将作业推送到它,然后等待响应。然后,您只有在每个请求的远程主机上启动脚本的开销。