[JSch-users] Patch for performance issues with rapid connections over forwarded port
Status: Alpha
Brought to you by:
ymnk
From: B. S. S. <sc...@sm...> - 2011-12-30 02:44:47
|
Hi ymnk, In my prior email, I discussed downloading and running a large Web Start Application through a forwarded port, which caused my Session to disconnect. After applying the patch from my prior email, my Sessions would no longer close, but the performance was noticeably slower when compared to performing the same test over a port forward with the native OpenSSH client. The JNLP process involves opening multiple sockets concurrently, and each connection may be very rapidly closed and reopened. I determined that the performance issue was caused by the fact that no new connections are processed for a forwarded port (PortWatcher.run()) until a reply is received from the SSH Server on the prior connection (channel.connect() blocks until the reply is received). I modified ChannelDirectTCPIP.connect() to create the processing thread prior to sending the CHANNEL_OPEN, and connect() returns immediately. The thread will now send the command, wait for the reply, and then continue to process the channel data as always. The performance improvement in my case was dramatic. Here is the patch diff to 0.1.45: ==== BEGIN PATCH ===== Index: src/main/java/com/jcraft/jsch/ChannelDirectTCPIP.java =================================================================== --- src/main/java/com/jcraft/jsch/ChannelDirectTCPIP.java (revision 253) +++ src/main/java/com/jcraft/jsch/ChannelDirectTCPIP.java (working copy) @@ -64,6 +64,27 @@ if(!_session.isConnected()){ throw new JSchException("session is down"); } + if(io.in!=null){ + thread=new Thread(this); + thread.setName("DirectTCPIP["+id+"] "+_session.getHost()+" "+host+":"+port); + if(_session.daemon_thread){ + thread.setDaemon(_session.daemon_thread); + } + thread.start(); + } + } + catch(Throwable e){ + io.close(); + io=null; + Channel.del(this); + if (e instanceof JSchException) { + throw (JSchException) e; + } + } + } + + private void sendConnect(Session _session) throws JSchException{ + try{ Buffer buf=new Buffer(150); Packet packet=new Packet(buf); // send @@ -123,20 +144,8 @@ } connected=true; - - if(io.in!=null){ - thread=new Thread(this); - thread.setName("DirectTCPIP thread "+_session.getHost()); - if(_session.daemon_thread){ - thread.setDaemon(_session.daemon_thread); - } - thread.start(); - } } catch(Exception e){ - io.close(); - io=null; - Channel.del(this); if (e instanceof JSchException) { throw (JSchException) e; } @@ -145,12 +154,13 @@ public void run(){ + try{ + Session _session=getSession(); + sendConnect(_session); Buffer buf=new Buffer(rmpsize); Packet packet=new Packet(buf); int i=0; - try{ - Session _session=getSession(); while(isConnected() && thread!=null && io!=null && ==== END PATCH ===== |