[undertow-dev] Undertow Http Server - Handling 2 Millions Requests Per Second Per Instance

Antoine Girard antoine.girard at ymail.com
Fri Jun 23 04:00:23 EDT 2017


Also, to come back on the JVM warmup, this will give you enough answers:
https://stackoverflow.com/questions/36198278/why-does-the-jvm-require-warmup

For your, it means that you have to run your tests for a few minutes before
starting your actual measurements.

I am also interested about how Netty / Jetty perform under the same
conditions, please post!

Cheers,
Antoine

On Fri, Jun 23, 2017 at 1:24 AM, Stuart Douglas <sdouglas at redhat.com> wrote:

> Are you actually testing with the 'System.out.println(" Received
> String ==> "+message);'. System.out is incredibly slow.
>
> Stuart
>
> On Fri, Jun 23, 2017 at 7:01 AM, SenthilKumar K <senthilec566 at gmail.com>
> wrote:
> > Sorry , I'm not an expert in JVM .. How do we do Warm Up JVM ?
> >
> > Here is the JVM args to Server:
> >
> > nohup java -Xmx4g -Xms4g -XX:MetaspaceSize=96m -XX:+UseG1GC
> > -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35
> > -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50
> > -XX:MaxMetaspaceFreeRatio=80 -cp undertow-0.0.1.jar  HelloWorldServer
> >
> >
> > --Senthil
> >
> >
> > On Fri, Jun 23, 2017 at 2:23 AM, Antoine Girard <
> antoine.girard at ymail.com>
> > wrote:
> >>
> >> Do you warm up your jvm prior to the testing?
> >>
> >> Cheers,
> >> Antoine
> >>
> >> On Thu, Jun 22, 2017 at 10:42 PM, SenthilKumar K <
> senthilec566 at gmail.com>
> >> wrote:
> >>>
> >>> Thanks Bill n Antoine ..
> >>>
> >>>
> >>> Here is the updated one : ( tried without Kafka API ) .
> >>>
> >>> public class HelloWorldServer {
> >>>
> >>> public static void main(final String[] args) {
> >>> Undertow server = Undertow.builder().addHttpListener(8009,
> >>> "localhost").setHandler(new HttpHandler() {
> >>> @Override
> >>> public void handleRequest(final HttpServerExchange exchange) throws
> >>> Exception {
> >>> if (exchange.getRequestMethod().equals(Methods.POST)) {
> >>> exchange.getRequestReceiver().receiveFullString(new
> >>> Receiver.FullStringCallback() {
> >>>                    @Override
> >>>                    public void handle(HttpServerExchange exchange,
> String
> >>> message) {
> >>>                     System.out.println(" Received String ==>
> "+message);
> >>>                        exchange.getResponseSender().send(message);
> >>>                    }
> >>>                });
> >>> } else {
> >>> exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
> >>> exchange.getResponseSender().send("FAILURE");
> >>> }
> >>> }
> >>> }).build();
> >>> server.start();
> >>> }
> >>> }
> >>>
> >>>
> >>> Oops seems to no improvement :
> >>>
> >>> Running 1m test @ http://localhost:8009/
> >>>   100 threads and 1000 connections
> >>>   Thread Stats   Avg      Stdev     Max   +/- Stdev
> >>>     Latency    25.79ms   22.18ms 289.48ms   67.66%
> >>>     Req/Sec   437.76     61.71     2.30k    80.26%
> >>>   Latency Distribution
> >>>      50%   22.60ms
> >>>      75%   37.83ms
> >>>      90%   55.32ms
> >>>      99%   90.47ms
> >>>   2625607 requests in 1.00m, 2.76GB read
> >>> Requests/sec:  43688.42
> >>> Transfer/sec:     47.08MB
> >>>
> >>>
> >>> :-( :-( ..
> >>>
> >>>
> >>> --Senthil
> >>>
> >>>
> >>> On Fri, Jun 23, 2017 at 1:47 AM, Antoine Girard
> >>> <antoine.girard at ymail.com> wrote:
> >>>>
> >>>> You can use the Receiver API, specifically for that purpose.
> >>>> On the exchange, call: getRequestReceiver();
> >>>>
> >>>> You will get a receiver object:
> >>>>
> >>>> https://github.com/undertow-io/undertow/blob/master/core/
> src/main/java/io/undertow/io/Receiver.java
> >>>>
> >>>> On the receiver you can call: receiveFullString, you have to pass it a
> >>>> callback that will be called when the whole body has been read.
> >>>>
> >>>> Please share your results when you test this further!
> >>>>
> >>>> Cheers,
> >>>> Antoine
> >>>>
> >>>>
> >>>> On Thu, Jun 22, 2017 at 8:27 PM, SenthilKumar K <
> senthilec566 at gmail.com>
> >>>> wrote:
> >>>>>
> >>>>> Seems to Reading Request body is wrong , So what is the efficient way
> >>>>> of reading request body in undertow ?
> >>>>>
> >>>>> --Senthil
> >>>>>
> >>>>> On Thu, Jun 22, 2017 at 11:30 PM, SenthilKumar K
> >>>>> <senthilec566 at gmail.com> wrote:
> >>>>>>
> >>>>>> Hello Undertow Dev Team ,
> >>>>>>
> >>>>>>       I have been working on the use case where i should create
> simple
> >>>>>> http server to serve 1.5 Million Requests per Second per Instance ..
> >>>>>>
> >>>>>>
> >>>>>> Here is the benchmark result of Undertow :
> >>>>>>
> >>>>>> Running 1m test @ http://127.0.0.1:8009/
> >>>>>>   20 threads and 40 connections
> >>>>>>   Thread Stats   Avg      Stdev     Max   +/- Stdev
> >>>>>>     Latency     2.51ms   10.75ms 282.22ms   99.28%
> >>>>>>     Req/Sec     1.12k   316.65     1.96k    54.50%
> >>>>>>   Latency Distribution
> >>>>>>      50%    1.43ms
> >>>>>>      75%    2.38ms
> >>>>>>      90%    2.90ms
> >>>>>>      99%   10.45ms
> >>>>>>   1328133 requests in 1.00m, 167.19MB read
> >>>>>> Requests/sec:  22127.92
> >>>>>> Transfer/sec:      2.79MB
> >>>>>>
> >>>>>> This is less compared to other frameworks like Jetty and Netty ..
> But
> >>>>>> originally Undertow is high performant http server ..
> >>>>>>
> >>>>>> Hardware details:
> >>>>>> Xeon CPU E3-1270 v5 machine with 4 cores ( Clock 100 MHz, Capacity 4
> >>>>>> GHz) , Memory : 32 G , Available memory 31 G.
> >>>>>>
> >>>>>> I would need Undertow experts to review the server code below and
> >>>>>> advice me on tuning to achieve my goal( ~1.5 Million requests/sec ).
> >>>>>>
> >>>>>> Server :
> >>>>>>
> >>>>>> Undertow server = Undertow.builder()
> >>>>>>                .addHttpListener(8009, "localhost")
> >>>>>>                .setHandler(new Handler()).build();
> >>>>>> server.start();
> >>>>>>
> >>>>>>
> >>>>>> Handler.Java
> >>>>>>
> >>>>>>     final Pooled<ByteBuffer> pooledByteBuffer =
> >>>>>>                  exchange.getConnection().
> getBufferPool().allocate();
> >>>>>> final ByteBuffer byteBuffer = pooledByteBuffer.getResource();
> >>>>>>    byteBuffer.clear();
> >>>>>>    exchange.getRequestChannel().read(byteBuffer);
> >>>>>>    int pos = byteBuffer.position();
> >>>>>>    byteBuffer.rewind();
> >>>>>>    byte[] bytes = new byte[pos];
> >>>>>>    byteBuffer.get(bytes);
> >>>>>>    String requestBody = new String(bytes, Charset.forName("UTF-8")
> );
> >>>>>>    byteBuffer.clear();
> >>>>>>    pooledByteBuffer.free();
> >>>>>>    final PostToKafka post2Kafka = new PostToKafka();
> >>>>>> try {
> >>>>>> post2Kafka.write2Kafka(requestBody);  { This API can handle  ~2
> >>>>>> Millions events per sec }
> >>>>>> } catch (Exception e) {
> >>>>>> e.printStackTrace();
> >>>>>> }
> >>>>>>     exchange.getResponseHeaders().put(Headers.CONTENT_TYPE,
> >>>>>> "text/plain");
> >>>>>>     exchange.getResponseSender().send("SUCCESS");
> >>>>>>
> >>>>>>
> >>>>>> --Senthil
> >>>>>
> >>>>>
> >>>>>
> >>>>> _______________________________________________
> >>>>> undertow-dev mailing list
> >>>>> undertow-dev at lists.jboss.org
> >>>>> https://lists.jboss.org/mailman/listinfo/undertow-dev
> >>>>
> >>>>
> >>>
> >>
> >
> >
> > _______________________________________________
> > undertow-dev mailing list
> > undertow-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170623/885be25e/attachment.html 


More information about the undertow-dev mailing list