Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
Thanks Oleg. Also I was not able to understand what does setExpectContinueEnabled mean? Should this be enabled or disabled for performance improvements? On Fri, Jun 26, 2015 at 1:22 AM, Oleg Kalnichevski wrote: > On Thu, 2015-06-25 at 12:33 -0700, Check Peck wrote: > > Thanks Oleg. Got the idea now. Basically earlier, I was not using setting > > any timeout value on Http request but I was setting the timeout value on > my > > Future and by default the timeout value on http request was -1 so it was > > waiting for most of the time and that's why I was seeing lot of > TIME_WAIT. > > I have made the code changes like this now: > > > > This is the request factory I am setting on my RestTemplate now. I wanted > > to check with you to see, do you think these settings are ok for better > > performance? > > > > private ClientHttpRequestFactory clientHttpRequestFactory() { > > HttpComponentsClientHttpRequestFactory requestFactory = new > > HttpComponentsClientHttpRequestFactory(); > > RequestConfig requestConfig = > > > RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000) > > > > .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build(); > > SocketConfig socketConfig = > > SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build(); > > > > PoolingHttpClientConnectionManager > > poolingHttpClientConnectionManager = new > > PoolingHttpClientConnectionManager(); > > poolingHttpClientConnectionManager.setMaxTotal(800); > > > poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700); > > > > CloseableHttpClient httpClientBuilder = > > HttpClientBuilder.create() > > > > > .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig) > > .setDefaultSocketConfig(socketConfig).build(); > > > > requestFactory.setHttpClient(httpClientBuilder); > > return requestFactory; > > } > > > > Settings look reasonable to me. > > Oleg > > > > - > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org > For additional commands, e-mail: httpclient-users-h...@hc.apache.org > >
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
On Thu, 2015-06-25 at 12:33 -0700, Check Peck wrote: > Thanks Oleg. Got the idea now. Basically earlier, I was not using setting > any timeout value on Http request but I was setting the timeout value on my > Future and by default the timeout value on http request was -1 so it was > waiting for most of the time and that's why I was seeing lot of TIME_WAIT. > I have made the code changes like this now: > > This is the request factory I am setting on my RestTemplate now. I wanted > to check with you to see, do you think these settings are ok for better > performance? > > private ClientHttpRequestFactory clientHttpRequestFactory() { > HttpComponentsClientHttpRequestFactory requestFactory = new > HttpComponentsClientHttpRequestFactory(); > RequestConfig requestConfig = > RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000) > > .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build(); > SocketConfig socketConfig = > SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build(); > > PoolingHttpClientConnectionManager > poolingHttpClientConnectionManager = new > PoolingHttpClientConnectionManager(); > poolingHttpClientConnectionManager.setMaxTotal(800); > poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700); > > CloseableHttpClient httpClientBuilder = > HttpClientBuilder.create() > > .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig) > .setDefaultSocketConfig(socketConfig).build(); > > requestFactory.setHttpClient(httpClientBuilder); > return requestFactory; > } > Settings look reasonable to me. Oleg - To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org For additional commands, e-mail: httpclient-users-h...@hc.apache.org
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
Thanks Oleg. Got the idea now. Basically earlier, I was not using setting any timeout value on Http request but I was setting the timeout value on my Future and by default the timeout value on http request was -1 so it was waiting for most of the time and that's why I was seeing lot of TIME_WAIT. I have made the code changes like this now: This is the request factory I am setting on my RestTemplate now. I wanted to check with you to see, do you think these settings are ok for better performance? private ClientHttpRequestFactory clientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000) .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build(); SocketConfig socketConfig = SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build(); PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(); poolingHttpClientConnectionManager.setMaxTotal(800); poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700); CloseableHttpClient httpClientBuilder = HttpClientBuilder.create() .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig) .setDefaultSocketConfig(socketConfig).build(); requestFactory.setHttpClient(httpClientBuilder); return requestFactory; } On Fri, Jun 5, 2015 at 1:04 AM, Oleg Kalnichevski wrote: > On Thu, 2015-06-04 at 15:32 -0700, Check Peck wrote: > > @Michael: Thanks for your suggestion. Can you explain me why do you > think, > > it's a TCP issue? I was assuming may be the way I am using RestTemplate > in > > my code might not be right and that's why it might be resulting in > > TIME_WAIT connections a lot on the machine where I have my code deployed > > which makes Http Call to my RestService? In the company I am working > here, > > they have their own Parent POM in which they have spring dependency, the > > latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8 > > uses new version of HttpClient or not. I did check the first github link > > you provided but I was not able to find "ivy.xml" file in 3.2.x branch so > > cannot confirm that. May be you know some other way to confirm that. I > can > > use Spring 3.2.8 version max here. And also, do you see any issues with > the > > way I am using RestTemplate here, I am just using default way of making > > HttpClient calls, may be I need to have some sort of extra parameter to > > resolve this issue? Are there anything I need to set while making > > RestTemplate calls like "Connection: close" or "keep-alive" anything like > > this? And also do you think the way I am using RestTemplate will > reuse/pool > > my client connections or not? > > > > @Stefan: I am using RestTemplate in default way as shown in my above > code. > > I am assuming, it will be reusing/pooling my connections right? I did > > google the issue and I found out lot of things, like lowering down the > > "tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned > > here in this article: > > > > http://www.fromdual.com/huge-amount-of-time-wait-connections > > > > But I was trying to confirm whether it might be related to how I am using > > RestTemplate or it is a OS issue? If I can confirm it's an OS issue, > then I > > will look into that and if let's say the way I am using RestTemplate is > not > > right, then I might try improving my code to see whether the problem goes > > away or not. I am thinking may be the way I am using RestTemplate is not > > right? May be I need to have "keep-alive" options on? > > > > Connections in TIME_WAIT are perfectly normal depending on your OS > systems and do not represent an issue with HttpClient resource > management. > > For details see > > http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions > > Oleg > > > > > > On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø < > > stefan.lan...@gmail.com> wrote: > > > > > I presume you are reusing/pooling your client connections, right? > > > Also - you could tune your OS to shutdown connections faster. You can > > > easily google you issue. > > > > > > Stefan > > > > > > 2015-06-04 17:51 GMT+02:00 Check Peck : > > > > > > > I am using Spring RestTemplate to make a HTTP Calls to my > RestService. I > > > am > > > > using spring framework 3.1.1 version of RestTemplate. I cannot > upgrade > > > this > > > > since that's what we are using in our company. > > > > > > > > Now machine which is running my code (which uses RestTemplate) to > make > > > call > > > > to my RestService, I see lot of TIME_WAIT connections opened on that > > > > particular machine? > > > > > > > > - Is there any reason why it happe
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
On Thu, 2015-06-04 at 15:32 -0700, Check Peck wrote: > @Michael: Thanks for your suggestion. Can you explain me why do you think, > it's a TCP issue? I was assuming may be the way I am using RestTemplate in > my code might not be right and that's why it might be resulting in > TIME_WAIT connections a lot on the machine where I have my code deployed > which makes Http Call to my RestService? In the company I am working here, > they have their own Parent POM in which they have spring dependency, the > latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8 > uses new version of HttpClient or not. I did check the first github link > you provided but I was not able to find "ivy.xml" file in 3.2.x branch so > cannot confirm that. May be you know some other way to confirm that. I can > use Spring 3.2.8 version max here. And also, do you see any issues with the > way I am using RestTemplate here, I am just using default way of making > HttpClient calls, may be I need to have some sort of extra parameter to > resolve this issue? Are there anything I need to set while making > RestTemplate calls like "Connection: close" or "keep-alive" anything like > this? And also do you think the way I am using RestTemplate will reuse/pool > my client connections or not? > > @Stefan: I am using RestTemplate in default way as shown in my above code. > I am assuming, it will be reusing/pooling my connections right? I did > google the issue and I found out lot of things, like lowering down the > "tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned > here in this article: > > http://www.fromdual.com/huge-amount-of-time-wait-connections > > But I was trying to confirm whether it might be related to how I am using > RestTemplate or it is a OS issue? If I can confirm it's an OS issue, then I > will look into that and if let's say the way I am using RestTemplate is not > right, then I might try improving my code to see whether the problem goes > away or not. I am thinking may be the way I am using RestTemplate is not > right? May be I need to have "keep-alive" options on? > Connections in TIME_WAIT are perfectly normal depending on your OS systems and do not represent an issue with HttpClient resource management. For details see http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions Oleg > > On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø < > stefan.lan...@gmail.com> wrote: > > > I presume you are reusing/pooling your client connections, right? > > Also - you could tune your OS to shutdown connections faster. You can > > easily google you issue. > > > > Stefan > > > > 2015-06-04 17:51 GMT+02:00 Check Peck : > > > > > I am using Spring RestTemplate to make a HTTP Calls to my RestService. I > > am > > > using spring framework 3.1.1 version of RestTemplate. I cannot upgrade > > this > > > since that's what we are using in our company. > > > > > > Now machine which is running my code (which uses RestTemplate) to make > > call > > > to my RestService, I see lot of TIME_WAIT connections opened on that > > > particular machine? > > > > > > - Is there any reason why it happens with RestTemplate or the way I am > > > using it? > > > - Also, what is the connection between TIME_WAIT and HTTP Client calls to > > > my RestService? I am not able to understand this as well. Does HTTP Calls > > > has any significance on TIME_WAIT? There might be some theoretical > > > explanation for this I guess. > > > > > > Below is how I am using RestTemplate in my code base: > > > > > > public class DataClient implements Client { > > > > > > private final RestTemplate restTemplate = new RestTemplate(); > > > private ExecutorService executor = > > > Executors.newFixedThreadPool(10); > > > > > > // for synchronous call > > > @Override > > > public String getSyncData(DataKey key) { > > > String response = null; > > > Future handler = null; > > > try { > > > handler = getAsyncData(key); > > > response = handler.get(key.getTimeout(), > > > TimeUnit.MILLISECONDS); > > > } catch (TimeoutException ex) { > > > // log an exception > > > handler.cancel(true); > > > } catch (Exception ex) { > > > // log an exception > > > } > > > > > > return response; > > > } > > > > > > // for asynchronous call > > > @Override > > > public Future getAsyncData(DataKey key) { > > > Future future = null; > > > > > > try { > > > Task task = new Task(key, restTemplate); > > > future = executor.submit(task); > > > } catch (Exception ex) { > > > // log an exception > > > } > > > > > > return future; > > > } > > > } > > > > > > And below is my simple Task class > >
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
@Michael: Thanks for your suggestion. Can you explain me why do you think, it's a TCP issue? I was assuming may be the way I am using RestTemplate in my code might not be right and that's why it might be resulting in TIME_WAIT connections a lot on the machine where I have my code deployed which makes Http Call to my RestService? In the company I am working here, they have their own Parent POM in which they have spring dependency, the latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8 uses new version of HttpClient or not. I did check the first github link you provided but I was not able to find "ivy.xml" file in 3.2.x branch so cannot confirm that. May be you know some other way to confirm that. I can use Spring 3.2.8 version max here. And also, do you see any issues with the way I am using RestTemplate here, I am just using default way of making HttpClient calls, may be I need to have some sort of extra parameter to resolve this issue? Are there anything I need to set while making RestTemplate calls like "Connection: close" or "keep-alive" anything like this? And also do you think the way I am using RestTemplate will reuse/pool my client connections or not? @Stefan: I am using RestTemplate in default way as shown in my above code. I am assuming, it will be reusing/pooling my connections right? I did google the issue and I found out lot of things, like lowering down the "tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned here in this article: http://www.fromdual.com/huge-amount-of-time-wait-connections But I was trying to confirm whether it might be related to how I am using RestTemplate or it is a OS issue? If I can confirm it's an OS issue, then I will look into that and if let's say the way I am using RestTemplate is not right, then I might try improving my code to see whether the problem goes away or not. I am thinking may be the way I am using RestTemplate is not right? May be I need to have "keep-alive" options on? On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø < stefan.lan...@gmail.com> wrote: > I presume you are reusing/pooling your client connections, right? > Also - you could tune your OS to shutdown connections faster. You can > easily google you issue. > > Stefan > > 2015-06-04 17:51 GMT+02:00 Check Peck : > > > I am using Spring RestTemplate to make a HTTP Calls to my RestService. I > am > > using spring framework 3.1.1 version of RestTemplate. I cannot upgrade > this > > since that's what we are using in our company. > > > > Now machine which is running my code (which uses RestTemplate) to make > call > > to my RestService, I see lot of TIME_WAIT connections opened on that > > particular machine? > > > > - Is there any reason why it happens with RestTemplate or the way I am > > using it? > > - Also, what is the connection between TIME_WAIT and HTTP Client calls to > > my RestService? I am not able to understand this as well. Does HTTP Calls > > has any significance on TIME_WAIT? There might be some theoretical > > explanation for this I guess. > > > > Below is how I am using RestTemplate in my code base: > > > > public class DataClient implements Client { > > > > private final RestTemplate restTemplate = new RestTemplate(); > > private ExecutorService executor = > > Executors.newFixedThreadPool(10); > > > > // for synchronous call > > @Override > > public String getSyncData(DataKey key) { > > String response = null; > > Future handler = null; > > try { > > handler = getAsyncData(key); > > response = handler.get(key.getTimeout(), > > TimeUnit.MILLISECONDS); > > } catch (TimeoutException ex) { > > // log an exception > > handler.cancel(true); > > } catch (Exception ex) { > > // log an exception > > } > > > > return response; > > } > > > > // for asynchronous call > > @Override > > public Future getAsyncData(DataKey key) { > > Future future = null; > > > > try { > > Task task = new Task(key, restTemplate); > > future = executor.submit(task); > > } catch (Exception ex) { > > // log an exception > > } > > > > return future; > > } > > } > > > > And below is my simple Task class > > > > class Task implements Callable { > > > > private final RestTemplate restTemplate; > > private final DataKey key; > > > > public Task(DataKey key, RestTemplate restTemplate) { > > this.key = key; > > this.restTemplate = restTemplate; > > } > > > > public String call() throws Exception { > > ResponseEntity response = null; > > > > String url = "some_url_created_by_using_key"; > > > > // handling all try catch
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
I presume you are reusing/pooling your client connections, right? Also - you could tune your OS to shutdown connections faster. You can easily google you issue. Stefan 2015-06-04 17:51 GMT+02:00 Check Peck : > I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am > using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this > since that's what we are using in our company. > > Now machine which is running my code (which uses RestTemplate) to make call > to my RestService, I see lot of TIME_WAIT connections opened on that > particular machine? > > - Is there any reason why it happens with RestTemplate or the way I am > using it? > - Also, what is the connection between TIME_WAIT and HTTP Client calls to > my RestService? I am not able to understand this as well. Does HTTP Calls > has any significance on TIME_WAIT? There might be some theoretical > explanation for this I guess. > > Below is how I am using RestTemplate in my code base: > > public class DataClient implements Client { > > private final RestTemplate restTemplate = new RestTemplate(); > private ExecutorService executor = > Executors.newFixedThreadPool(10); > > // for synchronous call > @Override > public String getSyncData(DataKey key) { > String response = null; > Future handler = null; > try { > handler = getAsyncData(key); > response = handler.get(key.getTimeout(), > TimeUnit.MILLISECONDS); > } catch (TimeoutException ex) { > // log an exception > handler.cancel(true); > } catch (Exception ex) { > // log an exception > } > > return response; > } > > // for asynchronous call > @Override > public Future getAsyncData(DataKey key) { > Future future = null; > > try { > Task task = new Task(key, restTemplate); > future = executor.submit(task); > } catch (Exception ex) { > // log an exception > } > > return future; > } > } > > And below is my simple Task class > > class Task implements Callable { > > private final RestTemplate restTemplate; > private final DataKey key; > > public Task(DataKey key, RestTemplate restTemplate) { > this.key = key; > this.restTemplate = restTemplate; > } > > public String call() throws Exception { > ResponseEntity response = null; > > String url = "some_url_created_by_using_key"; > > // handling all try catch here > response = restTemplate.exchange(url, HttpMethod.GET, null, > String.class); > > return response.getBody(); > } > } > > And here is netstat details on my box which is running my code to make HTTP > Calls to my RestService. I am always seeing very high number of TIME_WAIT > connections. > > 72 ESTABLISHED > 2 FIN_WAIT1 > 17 LISTEN >3405 TIME_WAIT > -- BEKK Open http://open.bekk.no TesTcl - a unit test framework for iRules http://testcl.com
Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
Am 2015-06-04 um 17:51 schrieb Check Peck: I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this since that's what we are using in our company. Now machine which is running my code (which uses RestTemplate) to make call to my RestService, I see lot of TIME_WAIT connections opened on that particular machine? - Is there any reason why it happens with RestTemplate or the way I am using it? - Also, what is the connection between TIME_WAIT and HTTP Client calls to my RestService? I am not able to understand this as well. Does HTTP Calls has any significance on TIME_WAIT? There might be some theoretical explanation for this I guess. [...] And here is netstat details on my box which is running my code to make HTTP Calls to my RestService. I am always seeing very high number of TIME_WAIT connections. 72 ESTABLISHED 2 FIN_WAIT1 17 LISTEN 3405 TIME_WAIT This is rather a TCP issue. As far as I can see, Spring Web 3.1.x uses version 4.1 of HttpClient [1] and this one is unsupported. I do not know wether 4.4 is ABI compatible with 4.1 but you should update the HttpClient in your POM and retry, maybe your problem will go away. I have found a quite good explanation about the issue you are experiencing [2], [3], it might be worth to discuss this with your admins. Michael [1] https://github.com/spring-projects/spring-framework/blob/3.1.x/org.springframework.web/ivy.xml#L63 [2] http://superuser.com/a/173542/222550 [3] http://www4.cs.fau.de/Projects/JX/Projects/TCP/tcpstate.html - To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org For additional commands, e-mail: httpclient-users-h...@hc.apache.org
What is the relation between TIME_WAIT and HTTP Client calls to a RestService?
I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this since that's what we are using in our company. Now machine which is running my code (which uses RestTemplate) to make call to my RestService, I see lot of TIME_WAIT connections opened on that particular machine? - Is there any reason why it happens with RestTemplate or the way I am using it? - Also, what is the connection between TIME_WAIT and HTTP Client calls to my RestService? I am not able to understand this as well. Does HTTP Calls has any significance on TIME_WAIT? There might be some theoretical explanation for this I guess. Below is how I am using RestTemplate in my code base: public class DataClient implements Client { private final RestTemplate restTemplate = new RestTemplate(); private ExecutorService executor = Executors.newFixedThreadPool(10); // for synchronous call @Override public String getSyncData(DataKey key) { String response = null; Future handler = null; try { handler = getAsyncData(key); response = handler.get(key.getTimeout(), TimeUnit.MILLISECONDS); } catch (TimeoutException ex) { // log an exception handler.cancel(true); } catch (Exception ex) { // log an exception } return response; } // for asynchronous call @Override public Future getAsyncData(DataKey key) { Future future = null; try { Task task = new Task(key, restTemplate); future = executor.submit(task); } catch (Exception ex) { // log an exception } return future; } } And below is my simple Task class class Task implements Callable { private final RestTemplate restTemplate; private final DataKey key; public Task(DataKey key, RestTemplate restTemplate) { this.key = key; this.restTemplate = restTemplate; } public String call() throws Exception { ResponseEntity response = null; String url = "some_url_created_by_using_key"; // handling all try catch here response = restTemplate.exchange(url, HttpMethod.GET, null, String.class); return response.getBody(); } } And here is netstat details on my box which is running my code to make HTTP Calls to my RestService. I am always seeing very high number of TIME_WAIT connections. 72 ESTABLISHED 2 FIN_WAIT1 17 LISTEN 3405 TIME_WAIT