You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Christopher BROWN <br...@reflexe.fr> on 2017/02/02 21:49:57 UTC

Slow connection and timeouts when using localhost on macOS with Java / HTTP when network disconnected

Hello,

I've noticed (as of today, when running a demo for a customer) that, with
Java 8 (u121) on macOS Sierra, when both wi-fi is disconnected and no
ethernet is available, Java network performance is slow.  The problem
occurs when I have one application (Tomcat) being called by another (Java,
using HTTP Client 4.3.x to connect to Tomcat, and also embedding a Jetty
server, on a different port to Tomcat).  Both applications connect to a
PostgreSQL database using the TCP/IP-based JDBC driver, where the database
is in a VirtualBox VM on the same machine, using NAT to access it locally
on port 5432.

Starting Tomcat (bound to localhost:8080) is slow, as is starting the
embedded Jetty server.  I suspect this is either Java or the MacOS
networking stack being inefficient about resolving "localhost" when there's
no network or DNS (but, I also tried using 127.0.0.1 instead of localhost,
and didn't get any improvement).  Both eventually bind (after about 15
seconds) to server sockets then respond promptly when say accessing content
with a local web browser.  But Java calls to localhost:8080 are so slow,
that they just time out (I could I suppose set a really long timeout, but
performance would be totally unacceptable).

I don't think it's HTTP client's fault, but I can't think of how to set
things up for acceptable performance.  For what it's worth, I've copied a
stacktrace below, but I'm really looking for advice about how to improve
things (I didn't see anything helpful in Java's networking properties, and
the fact that 127.0.0.1 didn't help is odd).  Reconnecting to a network
instantly solves the problem, but that's not always an option (when I
develop during travel, for example).

Any advice ?  Thanks in advance.

java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at
org.apache.http.impl.conn.LoggingInputStream.read(LoggingInputStream.java:87)
at
org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)
at
org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152)
at
org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270)
at
org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at
org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at
org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
at
org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)
at
org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:153)
at
org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
at
org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at
org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:254)
at
org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at
org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at vsh.system.connector.NetworkDriver.ping(NetworkDriver.java:1081)

--
Christopher

Re: Slow connection and timeouts when using localhost on macOS with Java / HTTP when network disconnected

Posted by Christopher BROWN <br...@reflexe.fr>.
Hello,

The problem, if I understand correctly, is to do with the way Java resolves
hostnames, which takes a long time with the default macOS Sierra
configuration.  In short, adding "computername.local" (as display in
Network Preferences when you've got a Mac) beside "localhost", on the
127.0.0.1 entry in /etc/hosts -- as described here:
http://stackoverflow.com/a/41847289 -- fixed the problem.

Hope that helps anyone else discovering this message, even if it's not
directly related to HTTP Client (even although that's where I hit the
problem).

--
Christopher


On 2 February 2017 at 22:49, Christopher BROWN <br...@reflexe.fr> wrote:

> Hello,
>
> I've noticed (as of today, when running a demo for a customer) that, with
> Java 8 (u121) on macOS Sierra, when both wi-fi is disconnected and no
> ethernet is available, Java network performance is slow.  The problem
> occurs when I have one application (Tomcat) being called by another (Java,
> using HTTP Client 4.3.x to connect to Tomcat, and also embedding a Jetty
> server, on a different port to Tomcat).  Both applications connect to a
> PostgreSQL database using the TCP/IP-based JDBC driver, where the database
> is in a VirtualBox VM on the same machine, using NAT to access it locally
> on port 5432.
>
> Starting Tomcat (bound to localhost:8080) is slow, as is starting the
> embedded Jetty server.  I suspect this is either Java or the MacOS
> networking stack being inefficient about resolving "localhost" when there's
> no network or DNS (but, I also tried using 127.0.0.1 instead of localhost,
> and didn't get any improvement).  Both eventually bind (after about 15
> seconds) to server sockets then respond promptly when say accessing content
> with a local web browser.  But Java calls to localhost:8080 are so slow,
> that they just time out (I could I suppose set a really long timeout, but
> performance would be totally unacceptable).
>
> I don't think it's HTTP client's fault, but I can't think of how to set
> things up for acceptable performance.  For what it's worth, I've copied a
> stacktrace below, but I'm really looking for advice about how to improve
> things (I didn't see anything helpful in Java's networking properties, and
> the fact that 127.0.0.1 didn't help is odd).  Reconnecting to a network
> instantly solves the problem, but that's not always an option (when I
> develop during travel, for example).
>
> Any advice ?  Thanks in advance.
>
> java.net.SocketTimeoutException: Read timed out
> at java.net.SocketInputStream.socketRead0(Native Method)
> at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
> at java.net.SocketInputStream.read(SocketInputStream.java:171)
> at java.net.SocketInputStream.read(SocketInputStream.java:141)
> at org.apache.http.impl.conn.LoggingInputStream.read(
> LoggingInputStream.java:87)
> at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(
> SessionInputBufferImpl.java:136)
> at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(
> SessionInputBufferImpl.java:152)
> at org.apache.http.impl.io.SessionInputBufferImpl.readLine(
> SessionInputBufferImpl.java:270)
> at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(
> DefaultHttpResponseParser.java:140)
> at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(
> DefaultHttpResponseParser.java:57)
> at org.apache.http.impl.io.AbstractMessageParser.parse(
> AbstractMessageParser.java:260)
> at org.apache.http.impl.DefaultBHttpClientConnection.
> receiveResponseHeader(DefaultBHttpClientConnection.java:161)
> at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(
> CPoolProxy.java:153)
> at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(
> HttpRequestExecutor.java:271)
> at org.apache.http.protocol.HttpRequestExecutor.execute(
> HttpRequestExecutor.java:123)
> at org.apache.http.impl.execchain.MainClientExec.
> execute(MainClientExec.java:254)
> at org.apache.http.impl.execchain.ProtocolExec.
> execute(ProtocolExec.java:195)
> at org.apache.http.impl.client.InternalHttpClient.doExecute(
> InternalHttpClient.java:184)
> at org.apache.http.impl.client.CloseableHttpClient.execute(
> CloseableHttpClient.java:82)
> at org.apache.http.impl.client.CloseableHttpClient.execute(
> CloseableHttpClient.java:106)
> at vsh.system.connector.NetworkDriver.ping(NetworkDriver.java:1081)
>
> --
> Christopher
>
>