Почему следующий Java NIO API такой медленный по сравнению с netty - PullRequest
1 голос
/ 04 мая 2020

У меня есть следующая реализация JAVA для создания простого веб-сервера с использованием NIO API.

package zion

import java.net._
import java.nio.ByteBuffer
import java.nio.channels._

object NHello {

  import java.nio.CharBuffer
  import java.nio.charset.Charset

  def helloWorldBytes: ByteBuffer = Charset
    .forName("ISO-8859-1")
    .newEncoder
    .encode(CharBuffer.wrap(httpResponse("NHello World\n")))

  def httpResponse(content: String): String = {
    val rn = "\r\n"
    List(
      "HTTP/1.1 200 OK",
      "Content-Type: text/html",
      "Connection: Keep-Alive",
      s"Content-Length: ${content.length()}",
      rn + content
    ).mkString(rn)
  }

  def main(args: Array[String]): Unit = {
    val port    = 8080
    val address = new InetSocketAddress(port)

    // Server Socket Channel
    val serverSocketChannel = ServerSocketChannel.open()
    serverSocketChannel.bind(address)
    serverSocketChannel.configureBlocking(false)

    // Selector
    val selector = Selector.open()
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT)

    while (true) {
      selector.select()
      val iterator = selector.selectedKeys().iterator()
      while (iterator.hasNext) {
        val key = iterator.next()
        if (key.isAcceptable) {
          val channel = serverSocketChannel.accept()
          channel.write(helloWorldBytes)
          channel.close()
        }

      }
      iterator.remove()
    }

    sys.addShutdownHook({
      println("Shutting down...")
      serverSocketChannel.close()
    })

    println("Exiting...")
  }
}

Использование wrk Я получаю несколько тысяч запросов в секунду.

wrk -t12 -c100 -d10s http://127.0.0.1:8080

Это выглядит слишком медленно по сравнению с Нетти. С Netty я могу повысить производительность как минимум в 10-15 раз. Учитывая, что Netty также построен поверх NIO, что я делаю не так?

Существуют ли очевидные оптимизации производительности, которые мне не хватает?

1 Ответ

0 голосов
/ 04 мая 2020

Много, в основном вы используете NIO «блокирующим» способом. Проверьте это:

https://bedrin.livejournal.com/204307.html https://crunchify.com/java-nio-non-blocking-io-with-server-client-example-java-nio-bytebuffer-and-channels-selector-java-nio-vs-io/

...