2014-07-12 84 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或者簡單地您的數據庫)將作業推送到它,然後等待響應。然後,您只有在每個請求的遠程主機上啓動腳本的開銷。