Hi Alexey,
Thanks for the response.
Our threads make external web service calls and make some expensive DB queries. So, they are often in the waiting state like sleep(1000). We are testing the max threads under production load and trying to find the best number.
I looked around some Grizzly source code and noticed that there is an internal queue for managing requests which have not been allotted a thread. How can we configure the queue size and other queue properties?
Our application is behind haproxy load balancer, which disables keep alive. So, our Java app doesn't need to have keep alive. I disabled keep alive in Java as I believed that we will get performance gain since Haproxy when forwarding the request adds Connection: Close to the request.
Regards,Vivek
Date: Fri, 21 Oct 2011 15:43:58 +0200
From: oleksiy.stashok_at_oracle.com
To: users_at_grizzly.java.net
Subject: Re: Concurrent connections using Grizzly/Jersey
Hi Vivek,
Answering
my own email. We were able to fix it and scale to 50 worker
threads by using the following code snippet
You're right, by increasing the thread-pool size you can increase
number of requests Jersey/Grizzly will be able to process
simultaneously.
Though it makes sense only if request processing is expensive (like
in your case sleep(1000)), otherwise we recommend to keep
thread-pool size = number of CPU/cores. It's similar to how Scott
suggests to configure Glassfish [1], see "Tune the HTTP threads"
section.
Also I'd not recommend to set
grizzlyWebServer.getSelectorThread().setMaxKeepAliveRequests(0);
it's going to disable HTTP keep-alive mechanism, which may have
significant impact on server perf.
Thanks.
WBR.
Alexey.
[1]
http://weblogs.java.net/blog/sdo/archive/2007/12/a_glassfish_tun.html
GrizzlyWebServer grizzlyWebServer =
new GrizzlyWebServer(8080);
grizzlyWebServer.getSelectorThread().setMaxKeepAliveRequests(0);
grizzlyWebServer.setCoreThreads(30);
grizzlyWebServer.setMaxThreads(50);
ServletAdapter jerseyAdapter = new
ServletAdapter();
jerseyAdapter.addInitParameter("com.sun.jersey.config.property.packages",
"com.test");
jerseyAdapter.setServletInstance(new
ServletContainer());
grizzlyWebServer.addGrizzlyAdapter(jerseyAdapter,
new String[]{"/"});
grizzlyWebServer.start();
Please let me know if we can embed
grizzly while using jersey in a better way.
Thanks,
Vivek
> To:
users_at_grizzly.java.net
> From: bird_sky_at_hotmail.com
> Subject: Concurrent connections using Grizzly/Jersey
> Date: Thu, 20 Oct 2011 21:18:11 +0000
>
> Hi,
>
> We are embedding Grizzly in our code and are facing
concurrent
> connections in production. We are unable to scale
beyond 7-8 concurrent
> requests. I believe the problem lies in the way we are
using Grizzly
> and appreciate any help you can offer. I am able to
replicate the
> problem with the following sample code.
>
> Please suggest what we are doing wrong and how can we
use grizzly to
> scale up to many more concurrent requests.
>
> ==========Main.java==========
> import com.sun.grizzly.http.SelectorThread;
> import
com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Map;
> public class Main {
> public static void main(String[] args) throws
InterruptedException
> {
> Map<String, String> initParams=new
HashMap<String, String>();
>
initParams.put("com.sun.jersey.config.property.packages",
> "com.test");
> try {
> SelectorThread threadSelector =
>
GrizzlyWebContainerFactory.create("
http://localhost:8080/",
> initParams);
> } catch (IOException e) {
> e.printStackTrace();
> }
> }
> }
> ========Default.java=========
> package com.test;
> import javax.ws.rs.GET;
> import javax.ws.rs.Path;
> import javax.ws.rs.Produces;
>
> @Path("{path:.*}")
> public class Default {
> @GET
> @Produces( "text/plain" )
> public String getMessage() {
> try {
> // Adding sleep to simulate some background processing
> Thread.sleep(1000);
> } catch (InterruptedException e) {
> e.printStackTrace();
> }
> return "Hello World";
> }
> }
> =========================