On Fri, 2014-01-17 at 16:28 +0000, Boxer, Aaron wrote: > I made a simple test: I wrote a few lines of Java using File channel and > transferTo(...) method to read files from my DVD and write to the hard drive. > With this simple test, the transferTo(...) method gets about 4 MB /S > transfer rate to disk. > > Then, I put some timing code into the LengthDelimitedEncoder.transfer(...) > method, and ran my application, which copies files from DVD > to a socket. And the transferTo(...) from file to socket was getting about > 0.7 MB /s . This is a 6 X degradation in performance. > And, if you recall, if the files are already in the OS file cache, I get > about 100 MB/S, so the socket is not slowing me down. > > I have done a little more testing: transferTo from DVD to local socket gets > 3-4 MB/S transfer rate. > I tried using a thread pool, and performance degrades (not surprisingly) as > thread count rises from 1. > > Since DVD seeks are very slow, multiple threads trying to read at the same > time will kill performance. > > But, I am not sure this is the issue here, because I have set > > connManager.setMaxTotal(1); > connManager.setDefaultMaxPerRoute(1); > > > So, there should only be one thread doing the transfer (is this true?) >
Actually HttpAsyncClient uses multiple i/o dispatch threads, one per CPU core. I suppose even with a cap of 1 total connection multiple threads might end up trying to access the same physical device. You can force HttpAsyncClient to use only one i/o dispatch thread by using a custom IOReactorConfig Oleg --------------------------------------------------------------------- To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org For additional commands, e-mail: httpclient-users-h...@hc.apache.org