Я выполнял некоторые тесты, используя 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 ГБ оперативной памяти.
Спасибо.