<div dir="ltr">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 dir="ltr">&lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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 class=""><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 class=""><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 class=""><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 class=""><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" width="477" height="114"><br></div><div><br></div><div><b>Netty:</b></div><div><img src="cid:ii_15d1c660bc42b0af" alt="Inline image 2" width="477" height="107"><br></div><div><br></div><div><br></div><div>--Senthil<br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 29, 2017 at 7:34 AM, Bill O&#39;Neil <span dir="ltr">&lt;<a href="mailto:bill@dartalley.com" target="_blank">bill@dartalley.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><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="m_3690032083140187580HOEnZb"><div class="m_3690032083140187580h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 28, 2017 at 6:59 PM, 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:0 0 0 .8ex;border-left:1px #ccc solid;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="m_3690032083140187580m_-726484296639338407HOEnZb"><font color="#888888"><br>
Stuart<br>
</font></span><div class="m_3690032083140187580m_-726484296639338407HOEnZb"><div class="m_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>