<div dir="ltr">Hi Douglas ,   Here is the code for Undertow <a href="https://github.com/senthilec566/undertow">https://github.com/senthilec566/undertow</a> and Netty <a href="https://github.com/senthilec566/microHttp">https://github.com/senthilec566/microHttp</a> . Both tested in default settings..<div><br></div><div>Both Undertow and Netty respond SUCCESS or FAILURE.</div><div><br></div><div>I&#39;d love to optimize undertow code and rerun the test case if required...</div><div><br></div><div>Another test result:</div><div><br></div><div><div>Undertow:</div><div>./wrk -c 10000 -d 10m -t 300 -s scripts/post_data.lua -R 500000  <a href="http://undertow:8009/">http://undertow:8009/</a></div><div>Running 10m test @ <a href="http://undertow:8009/">http://undertow:8009/</a></div><div>  300 threads and 10000 connections</div><div>Thread Stats   Avg      Stdev     Max   +/- Stdev</div><div>    Latency     3.70m     2.07m    7.40m    57.73%</div><div>    Req/Sec   449.71      6.45   474.00     74.93%</div><div>  80640669 requests in 10.00m, 9.91GB read</div><div>  Socket errors: connect 0, read 353, write 0, timeout 448</div><div>Requests/sec: <b>134457</b>.31</div><div>Transfer/sec:     16.93MB</div><div> </div><div>Netty:</div><div>./wrk -c 10000 -d 10m -t 300 -s scripts/post_data.lua -R 500000  <a href="http://netty:8009/">http://netty:8009/</a></div><div>Running 10m test @ <a href="http://netty:8009/">http://netty:8009/</a></div><div>  300 threads and 10000 connections</div><div>Thread Stats   Avg      Stdev     Max   +/- Stdev</div><div>    Latency     2.76m     1.54m    5.70m    57.83%</div><div>    Req/Sec   763.90     73.21     1.12k    69.15%</div><div>  137216075 requests in 10.00m, 12.14GB read</div><div>  Socket errors: connect 0, read 0, write 0, timeout 42</div><div>Requests/sec: <b>228796</b>.63</div><div>Transfer/sec:     20.73MB</div><div><div><br><div><br></div><div>--Senthil</div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 10, 2017 at 3:12 AM, Stuart Douglas <span dir="ltr">&lt;<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">Also it looks like you are sending more data in the undertow response. Mb/s is very similar, while req/sec is lower.<span class="gmail-HOEnZb"><font color="#888888"><div dir="auto"><br></div><div dir="auto">Stuart</div></font></span></div><div class="gmail-HOEnZb"><div class="gmail-h5"><div class="gmail_extra"><br><div class="gmail_quote">On 10 Jul. 2017 9:39 am, &quot;Stuart Douglas&quot; &lt;<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div>Are they both using the same number of threads? Also what are you doing in the handler? Are you calling dispatch? Dispatch is relativity slow in these micro benchmarks, as it dispatches to a thread pool.</div><div dir="auto"><br></div><div dir="auto">Stuart<br><div class="gmail_extra" dir="auto"><br><div class="gmail_quote">On 9 Jul. 2017 4:34 am, &quot;SenthilKumar K&quot; &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail-m_1728524435566013923m_4267930746010062603quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">Yet to try that .. My testcase  did not cover tuning no of threads .. but even if we try to increase number of threads I believe both framework performance would improve !! Different thoughts ?? <div dir="auto"><br></div><div dir="auto">Anyway I like to add another test case by changing threads !! </div><div dir="auto"><br></div><div dir="auto">--Senthil</div></div><div class="gmail-m_1728524435566013923m_4267930746010062603elided-text"><div class="gmail_extra"><br><div class="gmail_quote">On Jul 8, 2017 9:38 PM, &quot;Kim Rasmussen&quot; &lt;<a href="mailto:kr@asseco.dk" target="_blank">kr@asseco.dk</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div dir="auto">Have you tried playing around with the number of io and worker threads?</div><br><div class="gmail_quote"><div>lør. 8. jul. 2017 kl. 17.28 skrev SenthilKumar K &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Any comments on <b>Undertow Vs Netty</b> ? Am i doing wrong benchmark testing  ?? Should i change benchmark strategy ?<div><br></div><div>--Senthil</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 7, 2017 at 3:14 PM, SenthilKumar K <span>&lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Sorry for delay in responding to this thread!<div><br></div><div>Thanks to everyone who helped me to Optimize Undertow Server.</div><div><br></div><div>Here is the comparison after benchmarking my use case against Netty:</div><div><br></div><div><b><font color="#38761d" size="4">Undertow Vs Netty :</font></b><br></div><div><br></div><div>Test Case 1 : </div><div>Simple Request Response ( No Kafka ):</div><div><br></div><div><b><font color="#0000ff">Undertow:</font></b></div><div><div>Running 10m test @ <a href="http://198.18.134.13:8009/" target="_blank">http://198.18.134.13:8009/</a></div><div>  500 threads and 5000 connections</div><span><div>  Thread Stats   Avg      Stdev     Max   +/- Stdev</div></span><div>    Latency     <b>3.52m </b>    2.64m    8.96m    54.63%</div><div>    Req/Sec   376.58    103.18     0.99k    80.53%</div><div>  111628942 requests in 10.00m, 13.72GB read</div><div>  Socket errors: connect 0, read 28, write 0, timeout 2</div><div>Requests/sec: <b>186122.56</b></div><div>Transfer/sec:     23.43MB</div></div><div><br></div><div><div><b><font color="#0000ff">Netty:</font></b></div><div>Running 10m test @ <a href="http://198.18.134.13:8009/" target="_blank">http://198.18.134.13:8009/</a></div><div>500 threads and 5000 connections</div><span><div>Thread Stats   Avg      Stdev     Max   +/- Stdev</div></span><div>    Latency     <b>3.77m</b>     2.10m    7.51m    57.73%</div><div>    Req/Sec   518.63     31.78   652.00     70.25%</div><div>  155406992 requests in 10.00m, 13.82GB read</div><div>  Socket errors: connect 0, read 49, write 0, timeout 0</div><div>Requests/sec: <b>259107</b>.30</div><div>Transfer/sec:     24.17MB</div></div><div><br></div><div><br></div><div><b>Test Case 2:</b></div><div>Request --&gt; Read --&gt; Send it Kafka :</div><div><br></div><div><b><font color="#0000ff">Undertow:</font></b></div><div><div>Running 10m test @ <a href="http://198.18.134.13:8009/" target="_blank">http://198.18.134.13:8009/</a></div><div>500 threads and 5000 connections</div><span><div>Thread Stats   Avg      Stdev     Max   +/- Stdev</div></span><div>    Latency     <b>4.37m </b>    2.46m    8.72m    57.83%</div><div>    Req/Sec   267.32      5.17   287.00     74.52%</div><div>  80044045 requests in 10.00m, 9.84GB read</div><div>  Socket errors: connect 0, read 121, write 0, timeout 0</div><div>Requests/sec: <b>133459.79</b></div><div>Transfer/sec:     16.80MB</div></div><div><br></div><div><b><font color="#0000ff">Netty:</font></b></div><div><div>Running 10m test @ <a href="http://198.18.134.13:8009/" target="_blank">http://198.18.134.13:8009/</a></div><div>500 threads and 5000 connections</div><span><div>Thread Stats   Avg      Stdev     Max   +/- Stdev</div></span><div>    Latency     <b>3.78m </b>    2.10m    7.55m    57.79%</div><div>    Req/Sec   516.92     28.84   642.00     69.60%</div><div>  154770536 requests in 10.00m, 13.69GB read</div><div>  Socket errors: connect 0, read 11, write 0, timeout 101</div><div>Requests/sec: <b>258049.39</b></div><div>Transfer/sec:     23.38MB</div></div><div><br></div><div><br></div><div><br></div><div>CPU Usage:</div><div><b>Undertow:</b></div><div><img src="cid:ii_15d1c6595f909fe6" alt="Inline image 1" style="width: 667px; max-width: 100%;"><br></div><div><br></div><div><b>Netty:</b></div><div><img src="cid:ii_15d1c660bc42b0af" alt="Inline image 2" style="width: 667px; max-width: 100%;"><br></div><div><br></div><div><br></div><div>--Senthil<br></div></div><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073HOEnZb"><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 29, 2017 at 7:34 AM, Bill O&#39;Neil <span>&lt;<a href="mailto:bill@dartalley.com" target="_blank">bill@dartalley.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>1. Can you run the benchmark with the kafka line commented out at first and then again with it not commented out?</div><div>2. What rates were you getting with Jetty and Netty?</div><div>3. Are you running the tests from the same machine or a different one? If its the same machine and its using 20 threads they will be contending with undertows IO threads.</div><div>4. You can probably ignore the POST check if thats all your going to accept and its not a public api.</div><div><br></div><div><span><div>import io.undertow.server.HttpHandler<wbr>;</div><div>import io.undertow.server.HttpServerE<wbr>xchange;</div><div>import io.undertow.util.Headers;</div><div>import io.undertow.util.Methods;</div><div> </div><div>public class DLRHandler implements HttpHandler {</div><div> </div><div>    final public static String _SUCCESS=&quot;SUCCESS&quot;;</div><div>    final public static String _FAILURE=&quot;FAILURE&quot;;</div><div>    final PostToKafka post2Kafka = new PostToKafka();</div><div> </div><div>    @Override</div><div>    public void handleRequest( final HttpServerExchange exchange) throws Exception {</div><div>        if (exchange.getRequestMethod().e<wbr>quals(Methods.POST)) {</div><div>              exchange.getRequestReceiver().<wbr>receiveFullString(( exchangeReq, data) -&gt; {</div></span><div>                  //post2Kafka.write2Kafka(data)<wbr>; // write it to Kafka</div><div>                  exchangeReq.getResponseHeaders<wbr>().put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div>                  exchangeReq.getResponseSender(<wbr>).send(_SUCCESS);</div><span><div>              },</div><div>             (exchangeReq, exception) -&gt; {</div><div>                 exchangeReq.getResponseHeader<wbr>s().put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div>                 exchangeReq.getResponseSender<wbr>().send(_FAILURE);</div><div>            });</div><div>         }else{</div><div>             throw new Exception(&quot;Method GET not supported by Server &quot;);</div><div>         }</div><div>    }</div><div>}</div></span></div></div><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073m_3690032083140187580HOEnZb"><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073m_3690032083140187580h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 28, 2017 at 6:59 PM, Stuart Douglas <span>&lt;<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The multiple dispatches() are unnecessary (well the second one to the<br>
IO thread is definitely unnecessary, the first one is only required if<br>
post2Kafka.write2Kafka(data); is a blocking operation and needs to be<br>
executed in a worker thread).<br>
<span class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073m_3690032083140187580m_-726484296639338407HOEnZb"><font color="#888888"><br>
Stuart<br>
</font></span><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073m_3690032083140187580m_-726484296639338407HOEnZb"><div class="gmail-m_1728524435566013923m_4267930746010062603m_1207721472223032927m_-4931409617143771152m_-1599784569265107073m_3690032083140187580m_-726484296639338407h5"><br>
On Wed, Jun 28, 2017 at 5:42 PM, SenthilKumar K &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt; wrote:<br>
&gt; After modifying the code below i  could see the improvement ( not much<br>
&gt; slightly ) in server - 65k req/sec.<br>
&gt;<br>
&gt; import io.undertow.server.HttpHandler<wbr>;<br>
&gt; import io.undertow.server.HttpServerE<wbr>xchange;<br>
&gt; import io.undertow.util.Headers;<br>
&gt; import io.undertow.util.Methods;<br>
&gt;<br>
&gt; public class DLRHandler implements HttpHandler {<br>
&gt;<br>
&gt;     final public static String _SUCCESS=&quot;SUCCESS&quot;;<br>
&gt;     final public static String _FAILURE=&quot;FAILURE&quot;;<br>
&gt;     final PostToKafka post2Kafka = new PostToKafka();<br>
&gt;<br>
&gt;     @Override<br>
&gt;     public void handleRequest( final HttpServerExchange exchange) throws<br>
&gt; Exception {<br>
&gt;         if (exchange.getRequestMethod().e<wbr>quals(Methods.POST)) {<br>
&gt;                 exchange.getRequestReceiver()<wbr>.receiveFullString((<br>
&gt; exchangeReq, data) -&gt; {<br>
&gt;                   exchangeReq.dispatch(() -&gt; {<br>
&gt;                       post2Kafka.write2Kafka(data); // write it to Kafka<br>
&gt;                       exchangeReq.dispatch(exchange<wbr>Req.getIoThread(), () -&gt;<br>
&gt; {<br>
&gt;<br>
&gt; exchangeReq.getResponseHeaders<wbr>().put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);<br>
&gt;                           exchangeReq.getResponseSender<wbr>().send(_SUCCESS);<br>
&gt;                       });<br>
&gt;                   });<br>
&gt;               },<br>
&gt;              (exchangeReq, exception) -&gt; {<br>
&gt;                  exchangeReq.getResponseHeaders<wbr>().put(Headers.CONTENT_TYPE,<br>
&gt; &quot;text/plain&quot;);<br>
&gt;                  exchangeReq.getResponseSender(<wbr>).send(_FAILURE);<br>
&gt;             });<br>
&gt;          }else{<br>
&gt;              throw new Exception(&quot;Method GET not supported by Server &quot;);<br>
&gt;          }<br>
&gt;     }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; Pls review this and let me know if i&#39;m doing anything wrong here ...<br>
&gt; --Senthil<br>
&gt;<br>
&gt; On Fri, Jun 23, 2017 at 1:30 PM, Antoine Girard &lt;<a href="mailto:antoine.girard@ymail.com" target="_blank">antoine.girard@ymail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Also, to come back on the JVM warmup, this will give you enough answers:<br>
&gt;&gt;<br>
&gt;&gt; <a href="https://stackoverflow.com/questions/36198278/why-does-the-jvm-require-warmup" rel="noreferrer" target="_blank">https://stackoverflow.com/ques<wbr>tions/36198278/why-does-the-jv<wbr>m-require-warmup</a><br>
&gt;&gt;<br>
&gt;&gt; For your, it means that you have to run your tests for a few minutes<br>
&gt;&gt; before starting your actual measurements.<br>
&gt;&gt;<br>
&gt;&gt; I am also interested about how Netty / Jetty perform under the same<br>
&gt;&gt; conditions, please post!<br>
&gt;&gt;<br>
&gt;&gt; Cheers,<br>
&gt;&gt; Antoine<br>
&gt;&gt;<br>
&gt;&gt; On Fri, Jun 23, 2017 at 1:24 AM, Stuart Douglas &lt;<a href="mailto:sdouglas@redhat.com" target="_blank">sdouglas@redhat.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Are you actually testing with the &#39;System.out.println(&quot; Received<br>
&gt;&gt;&gt; String ==&gt; &quot;+message);&#39;. System.out is incredibly slow.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Stuart<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Fri, Jun 23, 2017 at 7:01 AM, SenthilKumar K &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;<br>
&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt; Sorry , I&#39;m not an expert in JVM .. How do we do Warm Up JVM ?<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Here is the JVM args to Server:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; nohup java -Xmx4g -Xms4g -XX:MetaspaceSize=96m -XX:+UseG1GC<br>
&gt;&gt;&gt; &gt; -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPer<wbr>cent=35<br>
&gt;&gt;&gt; &gt; -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50<br>
&gt;&gt;&gt; &gt; -XX:MaxMetaspaceFreeRatio=80 -cp undertow-0.0.1.jar  HelloWorldServer<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; --Senthil<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; On Fri, Jun 23, 2017 at 2:23 AM, Antoine Girard<br>
&gt;&gt;&gt; &gt; &lt;<a href="mailto:antoine.girard@ymail.com" target="_blank">antoine.girard@ymail.com</a>&gt;<br>
&gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Do you warm up your jvm prior to the testing?<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Cheers,<br>
&gt;&gt;&gt; &gt;&gt; Antoine<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; On Thu, Jun 22, 2017 at 10:42 PM, SenthilKumar K<br>
&gt;&gt;&gt; &gt;&gt; &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;<br>
&gt;&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Thanks Bill n Antoine ..<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Here is the updated one : ( tried without Kafka API ) .<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; public class HelloWorldServer {<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; public static void main(final String[] args) {<br>
&gt;&gt;&gt; &gt;&gt;&gt; Undertow server = Undertow.builder().addHttpList<wbr>ener(8009,<br>
&gt;&gt;&gt; &gt;&gt;&gt; &quot;localhost&quot;).setHandler(new HttpHandler() {<br>
&gt;&gt;&gt; &gt;&gt;&gt; @Override<br>
&gt;&gt;&gt; &gt;&gt;&gt; public void handleRequest(final HttpServerExchange exchange) throws<br>
&gt;&gt;&gt; &gt;&gt;&gt; Exception {<br>
&gt;&gt;&gt; &gt;&gt;&gt; if (exchange.getRequestMethod().e<wbr>quals(Methods.POST)) {<br>
&gt;&gt;&gt; &gt;&gt;&gt; exchange.getRequestReceiver().<wbr>receiveFullString(new<br>
&gt;&gt;&gt; &gt;&gt;&gt; Receiver.FullStringCallback() {<br>
&gt;&gt;&gt; &gt;&gt;&gt;                    @Override<br>
&gt;&gt;&gt; &gt;&gt;&gt;                    public void handle(HttpServerExchange exchange,<br>
&gt;&gt;&gt; &gt;&gt;&gt; String<br>
&gt;&gt;&gt; &gt;&gt;&gt; message) {<br>
&gt;&gt;&gt; &gt;&gt;&gt;                     System.out.println(&quot; Received String ==&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; &quot;+message);<br>
&gt;&gt;&gt; &gt;&gt;&gt;                        exchange.getResponseSender().s<wbr>end(message);<br>
&gt;&gt;&gt; &gt;&gt;&gt;                    }<br>
&gt;&gt;&gt; &gt;&gt;&gt;                });<br>
&gt;&gt;&gt; &gt;&gt;&gt; } else {<br>
&gt;&gt;&gt; &gt;&gt;&gt; exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE,<br>
&gt;&gt;&gt; &gt;&gt;&gt; &quot;text/plain&quot;);<br>
&gt;&gt;&gt; &gt;&gt;&gt; exchange.getResponseSender().s<wbr>end(&quot;FAILURE&quot;);<br>
&gt;&gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt;&gt; &gt;&gt;&gt; }).build();<br>
&gt;&gt;&gt; &gt;&gt;&gt; server.start();<br>
&gt;&gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt;&gt; &gt;&gt;&gt; }<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Oops seems to no improvement :<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Running 1m test @ <a href="http://localhost:8009/" rel="noreferrer" target="_blank">http://localhost:8009/</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;   100 threads and 1000 connections<br>
&gt;&gt;&gt; &gt;&gt;&gt;   Thread Stats   Avg      Stdev     Max   +/- Stdev<br>
&gt;&gt;&gt; &gt;&gt;&gt;     Latency    25.79ms   22.18ms 289.48ms   67.66%<br>
&gt;&gt;&gt; &gt;&gt;&gt;     Req/Sec   437.76     61.71     2.30k    80.26%<br>
&gt;&gt;&gt; &gt;&gt;&gt;   Latency Distribution<br>
&gt;&gt;&gt; &gt;&gt;&gt;      50%   22.60ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;      75%   37.83ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;      90%   55.32ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;      99%   90.47ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;   2625607 requests in 1.00m, 2.76GB read<br>
&gt;&gt;&gt; &gt;&gt;&gt; Requests/sec:  43688.42<br>
&gt;&gt;&gt; &gt;&gt;&gt; Transfer/sec:     47.08MB<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; :-( :-( ..<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; --Senthil<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; On Fri, Jun 23, 2017 at 1:47 AM, Antoine Girard<br>
&gt;&gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:antoine.girard@ymail.com" target="_blank">antoine.girard@ymail.com</a>&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; You can use the Receiver API, specifically for that purpose.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; On the exchange, call: getRequestReceiver();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; You will get a receiver object:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; <a href="https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/io/Receiver.java" rel="noreferrer" target="_blank">https://github.com/undertow-io<wbr>/undertow/blob/master/core/src<wbr>/main/java/io/undertow/io/Rece<wbr>iver.java</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; On the receiver you can call: receiveFullString, you have to pass it<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; a<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; callback that will be called when the whole body has been read.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Please share your results when you test this further!<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Cheers,<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Antoine<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; On Thu, Jun 22, 2017 at 8:27 PM, SenthilKumar K<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; Seems to Reading Request body is wrong , So what is the efficient<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; way<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; of reading request body in undertow ?<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; --Senthil<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; On Thu, Jun 22, 2017 at 11:30 PM, SenthilKumar K<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Hello Undertow Dev Team ,<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;       I have been working on the use case where i should create<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; simple<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; http server to serve 1.5 Million Requests per Second per Instance<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; ..<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Here is the benchmark result of Undertow :<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Running 1m test @ <a href="http://127.0.0.1:8009/" rel="noreferrer" target="_blank">http://127.0.0.1:8009/</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;   20 threads and 40 connections<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;   Thread Stats   Avg      Stdev     Max   +/- Stdev<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;     Latency     2.51ms   10.75ms 282.22ms   99.28%<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;     Req/Sec     1.12k   316.65     1.96k    54.50%<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;   Latency Distribution<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;      50%    1.43ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;      75%    2.38ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;      90%    2.90ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;      99%   10.45ms<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;   1328133 requests in 1.00m, 167.19MB read<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Requests/sec:  22127.92<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Transfer/sec:      2.79MB<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; This is less compared to other frameworks like Jetty and Netty ..<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; But<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; originally Undertow is high performant http server ..<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Hardware details:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Xeon CPU E3-1270 v5 machine with 4 cores ( Clock 100 MHz, Capacity<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; 4<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; GHz) , Memory : 32 G , Available memory 31 G.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; I would need Undertow experts to review the server code below and<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; advice me on tuning to achieve my goal( ~1.5 Million requests/sec<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; ).<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Server :<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Undertow server = Undertow.builder()<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;                .addHttpListener(8009, &quot;localhost&quot;)<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;                .setHandler(new Handler()).build();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; server.start();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Handler.Java<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;     final Pooled&lt;ByteBuffer&gt; pooledByteBuffer =<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; exchange.getConnection().getBu<wbr>fferPool().allocate();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; final ByteBuffer byteBuffer = pooledByteBuffer.getResource()<wbr>;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    byteBuffer.clear();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    exchange.getRequestChannel().r<wbr>ead(byteBuffer);<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    int pos = byteBuffer.position();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    byteBuffer.rewind();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    byte[] bytes = new byte[pos];<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    byteBuffer.get(bytes);<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    String requestBody = new String(bytes, Charset.forName(&quot;UTF-8&quot;)<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; );<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    byteBuffer.clear();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    pooledByteBuffer.free();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;    final PostToKafka post2Kafka = new PostToKafka();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; try {<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; post2Kafka.write2Kafka(request<wbr>Body);  { This API can handle  ~2<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Millions events per sec }<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; } catch (Exception e) {<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; e.printStackTrace();<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; }<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;     exchange.getResponseHeaders()<wbr>.put(Headers.CONTENT_TYPE,<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; &quot;text/plain&quot;);<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;     exchange.getResponseSender().<wbr>send(&quot;SUCCESS&quot;);<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; --Senthil<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; undertow-dev mailing list<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; <a href="mailto:undertow-dev@lists.jboss.org" target="_blank">undertow-dev@lists.jboss.org</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailma<wbr>n/listinfo/undertow-dev</a><br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt; undertow-dev mailing list<br>
&gt;&gt;&gt; &gt; <a href="mailto:undertow-dev@lists.jboss.org" target="_blank">undertow-dev@lists.jboss.org</a><br>
&gt;&gt;&gt; &gt; <a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailma<wbr>n/listinfo/undertow-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
______________________________<wbr>_________________<br>
undertow-dev mailing list<br>
<a href="mailto:undertow-dev@lists.jboss.org" target="_blank">undertow-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailma<wbr>n/listinfo/undertow-dev</a><br>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
______________________________<wbr>_________________<br>
undertow-dev mailing list<br>
<a href="mailto:undertow-dev@lists.jboss.org" target="_blank">undertow-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailma<wbr>n/listinfo/undertow-dev</a></blockquote></div></div><div dir="ltr">-- <br></div><div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><div><span style="font-family:verdana,sans-serif;font-size:13px">Med venlig hilsen / Best regards</span></div><div><p><b><span lang="EN-GB" style="font-size:10pt"><font color="#000066"><font face="verdana, sans-serif"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)">Kim Rasmussen</span></font></font></span></b><b><span lang="EN-GB" style="color:rgb(0,51,102)"><font face="verdana, sans-serif"><br></font></span></b><span lang="EN-GB" style="font-size:10pt;color:rgb(102,102,102)"><font face="verdana, sans-serif">Partner, IT Architect</font></span></p><p><b><span lang="EN-GB" style="font-size:10pt;color:rgb(102,102,102)"><font face="verdana, sans-serif">Asseco Denmark A/S</font></span></b><span lang="EN-GB" style="font-size:10pt;color:rgb(102,102,102)"><font face="verdana, sans-serif"><b><br></b>Kronprinsessegade 54<br>DK-1306 Copenhagen K<br>Mobile: <a href="tel:+45%2026%2016%2040%2023" value="+4526164023" target="_blank">+45 26 16 40 23</a><br>Ph.: <a href="tel:+45%2033%2036%2046%2060" value="+4533364660" target="_blank">+45 33 36 46 60</a><br>Fax: <a href="tel:+45%2033%2036%2046%2061" value="+4533364661" target="_blank">+45 33 36 46 61</a></font></span></p></div></span></div>
</blockquote></div></div>
</div><br>______________________________<wbr>_________________<br>
undertow-dev mailing list<br>
<a href="mailto:undertow-dev@lists.jboss.org" target="_blank">undertow-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/undertow-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/mailma<wbr>n/listinfo/undertow-dev</a><br></blockquote></div><br></div></div></div>
</blockquote></div></div>
</div></div></blockquote></div><br></div></div>