Проблемы производительности Netty - PullRequest
0 голосов
/ 11 февраля 2020

Я выполнял некоторые тесты, используя jmeter для Netty и Pippo (с Jetty в качестве встроенного сервера), и заметил странное поведение. С 20 потоками в Jmeter приложение Pippo получило почти 62 000 запросов, в то время как Netty превысил 21 000 запросов. Я перепробовал множество конфигураций, но не смог понять, что происходит, может быть, кто-то может помочь мне выяснить, что я делаю неправильно?

Вот код Пиппо:

@Path("/")
@Component
class SystemController : Controller() {

    @GET("/health")
    @Produces(Produces.JSON)
    fun health(): Map<String, Boolean> {
        return mapOf("status" to true)
    }
}

Вот код Netty:

class ServerBoot {

    private val bossGroup = NioEventLoopGroup(4)
    private val workerGroup = NioEventLoopGroup(8)

    fun bootApplication() {
        log.info("Booting application!")

        val server = ServerBootstrap().apply {
            group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel::class.java)
                .childHandler(object : ChannelInitializer<Channel>() {
                    override fun initChannel(ch: Channel) {
                        val pipeline = ch.pipeline()

                        pipeline.addLast(HttpRequestDecoder())
                        pipeline.addLast(HttpObjectAggregator(1048576))
                        pipeline.addLast(HttpResponseEncoder())

                        pipeline.addLast(object : SimpleChannelInboundHandler<FullHttpRequest>() {
                            override fun channelRead0(ctx: ChannelHandlerContext, msg: FullHttpRequest) {
                                val queryDecoder = QueryStringDecoder(msg.uri())
                                val path = queryDecoder.path()

                                if (path == "/health") {
                                    val contentBuffer = ctx.alloc().buffer().apply {
                                        writeCharSequence("ok", Charsets.UTF_8)
                                    }
                                    val response = DefaultFullHttpResponse(
                                        HttpVersion.HTTP_1_1,
                                        HttpResponseStatus.OK,
                                        contentBuffer
                                    )
                                    ctx.writeAndFlush(response).addListener(CLOSE)
                                } else {
                                    ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(CLOSE)
                                }
                            }
                        })
                    }

                })
                .option(ChannelOption.SO_REUSEADDR, true)
                .childOption(ChannelOption.TCP_NODELAY, true)
        }

        val hostname = "0.0.0.0"
        val port = 8080
        val addr = InetSocketAddress(hostname, port)

        server.bind(addr).addListener { future ->
            if (future.isSuccess) {
                log.info("Netty server started at port: $port")
            } else {
                log.error("Netty server start failed at port: $port!")
            }
        }.syncUninterruptibly()
    }

    companion object {
        private val log: Logger = LoggerFactory.getLogger(ServerBoot::class.java)
    }
}

Оба приложения работают с 512 МБ XMX, приложение Pippo работает с 200 потоками в Threadpool. Моя машина - I7 9700k с 8 ядрами и 16 ГБ оперативной памяти.

Спасибо.

...