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

Bill O'Neil bill at dartalley.com
Thu Jun 22 17:21:50 EDT 2017


Take out the
if (exchange.isInIoThread()) {
  exchange.dispatch(this);
  return;
}

How are you testing it? Are you sure you are sending enough requests a
second? Also try commenting out the kafka part just to see the speed. If it
does increase then we knows in on the undertow side.

It also doesn't look like you used the method receiveFullBytes I suggested
from the link.

On Thu, Jun 22, 2017 at 3:13 PM, SenthilKumar K <senthilec566 at gmail.com>
wrote:

> At last i modified the code as below and still i see ~50K requests/sec ..
>
> 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.isInIoThread()) {
> exchange.dispatch(this);
> return;
> }
> if (exchange.getRequestMethod().equals(Methods.POST)) {
> BufferedReader reader = null;
> StringBuilder builder = new StringBuilder();
> try {
> exchange.startBlocking();
> reader = new BufferedReader(new InputStreamReader(exchange.
> getInputStream()));
> String line;
> while ((line = reader.readLine()) != null) {
> builder.append(line);
> }
> } catch (IOException e) {
> e.printStackTrace();
> } finally {
> if (reader != null) {
> try {
> reader.close();
> } catch (IOException e) {
> e.printStackTrace();
> }
> }
> }
> String body = builder.toString();
> System.out.println("Req Body ==> " + body);
> exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
> exchange.getResponseSender().send("SUCCESS");
> } else {
> exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
> exchange.getResponseSender().send("FAILURE");
> }
> }
> }).build();
> server.start();
> }
> }
>
> On Thu, Jun 22, 2017 at 11:57 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170622/52f206e3/attachment.html 


More information about the undertow-dev mailing list