<div dir="ltr">Instead of blocking on IO, read the request asynchronously with callbacks, similar to this:<div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">public void handleRequest(final HttpServerExchange exchange) throws Exception {</div></div><div><span style="font-size:12.8px">  if (exchange.getRequestMethod().</span><wbr style="font-size:12.8px"><span style="font-size:12.8px">equals(Methods.POST)) {</span><br></div><div><span style="white-space:pre">    </span>exchange.getRequestReceiver().receiveFullBytes((exchange, data) -&gt; {</div><div>      // Read succeeded</div><div>      exchange.dispatch(() -&gt; {</div><div>        // Do something with the byte array here</div><div><br></div><div>        // When you are done, call:</div><div>        exchange.dispatch(exchange.getIoThread(), () -&gt; {</div><div><div style="font-size:12.8px">          exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div style="font-size:12.8px"><span style="white-space:pre-wrap">          </span>exchange.getResponseSender().<wbr>send(&quot;SUCCESS&quot;);<span style="font-size:small">        </span></div></div><div style="font-size:12.8px"><span style="font-size:small">        });</span></div><div>      }</div><div>    }, </div><div><div><span style="white-space:pre">    </span>(exchange, exception) -&gt; {</div><div>      // Handle failure</div><div><div style="font-size:12.8px">      exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div style="font-size:12.8px"><span style="white-space:pre-wrap">      </span>exchange.getResponseSender().<wbr>send(&quot;FAILURE&quot;);</div></div><div style="font-size:12.8px">    }</div><div style="font-size:12.8px">}</div><div><br></div></div><div>.... and never EVER (unless &quot;debugging&quot;) write to system out :)</div><div><br></div><div>/Kim</div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-06-22 21:13 GMT+02:00 SenthilKumar K <span dir="ltr">&lt;<a href="mailto:senthilec566@gmail.com" target="_blank">senthilec566@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">At last i modified the code as below and still i see ~50K requests/sec ..<div><br></div><div><div>public class HelloWorldServer {</div><div><br></div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>public static void main(final String[] args) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                </span></div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>Undertow server = Undertow.builder().<wbr>addHttpListener(8009, &quot;localhost&quot;).setHandler(new HttpHandler() {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span>@Override</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span>public void handleRequest(final HttpServerExchange exchange) throws Exception {</div><div><br></div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                </span>if (exchange.isInIoThread()) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>exchange.dispatch(this);</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>return;</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                </span>if (exchange.getRequestMethod().<wbr>equals(Methods.POST)) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>BufferedReader reader = null;</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>StringBuilder builder = new StringBuilder();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>try {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>exchange.startBlocking();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>reader = new BufferedReader(new InputStreamReader(exchange.<wbr>getInputStream()));</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>String line;</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>while ((line = reader.readLine()) != null) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                        </span>builder.append(line);</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>} catch (IOException e) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>e.printStackTrace();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>} finally {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>if (reader != null) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                        </span>try {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                                </span>reader.close();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                        </span>} catch (IOException e) {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                                </span>e.printStackTrace();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                        </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                                </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>String body = builder.toString();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>System.out.println(&quot;Req Body ==&gt; &quot; + body);</div><span class=""><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>exchange.getResponseSender().<wbr>send(&quot;SUCCESS&quot;);</div></span><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                </span>} else {</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                        </span>exchange.getResponseSender().<wbr>send(&quot;FAILURE&quot;);</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                                </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span>}</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>}).build();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>server.start();</div><div><span class="m_-8911555883569344826gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>}</div><div>}</div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 22, 2017 at 11:57 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">Seems to Reading Request body is wrong , So what is the efficient way of reading request body in undertow ?<div><br></div><div>--Senthil</div></div><div class="m_-8911555883569344826HOEnZb"><div class="m_-8911555883569344826h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 22, 2017 at 11:30 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">Hello Undertow Dev Team ,<div><br></div><div>      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 .. </div><div><br></div><div><br></div><div>Here is the benchmark result of Undertow :</div><div><br></div><div><div>Running 1m test @ <a href="http://127.0.0.1:8009/" target="_blank">http://127.0.0.1:8009/</a></div><div>  20 threads and 40 connections</div><div>  Thread Stats   Avg      Stdev     Max   +/- Stdev</div><div>    Latency     2.51ms   10.75ms 282.22ms   99.28%</div><div>    Req/Sec     1.12k   316.65     1.96k    54.50%</div><div>  Latency Distribution</div><div>     50%    1.43ms</div><div>     75%    2.38ms</div><div>     90%    2.90ms</div><div>     99%   10.45ms</div><div>  1328133 requests in 1.00m, 167.19MB read</div><div>Requests/sec:  <b>22127</b>.92</div><div>Transfer/sec:      2.79MB</div></div><div><br></div><div>This is less compared to other frameworks like Jetty and Netty .. But originally Undertow is high performant http server .. </div><div><br></div><div>Hardware details:</div><div><span style="color:rgb(128,128,128);font-family:arial,helvetica,&quot;helvetica neue&quot;,verdana,sans-serif;font-size:14px">Xeon CPU E3-1270 v5 machine with 4 cores ( Clock 100 MHz, Capacity 4 GHz) , Memory : 32 G , Available memory 31 G.</span><br></div><div><br></div><div>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 ).</div><div><br></div><div>Server :</div><div><br></div><div><div>Undertow server = Undertow.builder()</div><div>               .addHttpListener(8009, &quot;localhost&quot;)</div><div>               .setHandler(new Handler()).build();</div><div>server.start();</div></div><div><br></div><div><br></div><div>Handler.Java</div><div><br></div><div><div>    final Pooled&lt;ByteBuffer&gt; pooledByteBuffer =          </div><div>                 exchange.getConnection().getB<wbr>ufferPool().allocate();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>final ByteBuffer byteBuffer = pooledByteBuffer.getResource()<wbr>;</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    byteBuffer.clear();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    exchange.getRequestChannel().<wbr>read(byteBuffer);</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    int pos = byteBuffer.position();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    byteBuffer.rewind();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    byte[] bytes = new byte[pos];</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    byteBuffer.get(bytes);</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    String requestBody = new String(bytes, Charset.forName(&quot;UTF-8&quot;) );</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    byteBuffer.clear();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    pooledByteBuffer.free();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>    final PostToKafka post2Kafka = new PostToKafka();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>try {</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span><b>post2Kafka.write2Kafka(request<wbr>Body);  { This API can handle  ~2 Millions events per sec }</b></div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>} catch (Exception e) {</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                        </span>e.printStackTrace();</div><div><span class="m_-8911555883569344826m_-1097064228982827163m_5540164263429922309gmail-Apple-tab-span" style="white-space:pre-wrap">                </span>}</div><div>    exchange.getResponseHeaders().<wbr>put(Headers.CONTENT_TYPE, &quot;text/plain&quot;);</div><div>    exchange.getResponseSender().s<wbr>end(&quot;SUCCESS&quot;);</div></div><div><br></div><div><br></div><div>--Senthil</div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div><br>______________________________<wbr>_________________<br>
undertow-dev mailing list<br>
<a href="mailto:undertow-dev@lists.jboss.org">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/<wbr>mailman/listinfo/undertow-dev</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><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: +45 26 16 40 23<br>Ph.: +45 33 36 46 60<br>Fax: +45 33 36 46 61</font></span></p></div></span></div>
</div>