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

Reply via email to