最近在做接口压力测试的时候发现每次请求失败率都在50%,Jmeter版本5.6,如下图:
刚开始以为是压测服务器资源不够导致应用拒绝链接,然后观察了下执行任务的时候CPU和内存并没有耗尽,于是从应用本身找问题。
该WEB应用是基于Netty构建的,Netty在最外层作为通信网关处理权限验证,权限验证通过后解析URL参数,再根据参数反射调用对应的业务处理类方法。Netty的角色类似Spring MVC中Controller层。
NettyServer的onApplicationEvent方法是很通用的实现,如下图:
尝试加入以下代码支持keep-alive,仍然请求失败,并未起到效果。
childOption(NioChannelOption.) .childOption(NioChannelOption.(StandardSocketOptions.)) channelPipeline.addLast( "idleCheckHandler", new IdleStateHandler(5, 5, 5, TimeUnit.SECONDS));
继续查看HttpServerHandler处理类的channelRead(ChannelHandlerContext ctx, FullHttpRequest request)方法,
在代码的末尾处发现如下代码,正常情况下Http请求响应后立即关闭连接逻辑上是没有问题的。但是一般实际应用过程中,web容器都会设置一个keep-alive时长保持连接,超时后服务器再主动关闭该TCP连接,这样会减少客户端和服务器之间的握手次数,短时间内同一客户端向服务器发送多个HTTP请求可以使用同一个TCP连接通道以保证高效通信。
找到问题所在也就好解决了,方法末尾不要立即关闭连接,改用延迟关闭连接。延迟时间参考springBoot中对tomcat的设置,如下:
server.tomcat.keep-alive-timeout=60000 ;保持每个会话活动的不活动毫秒数
server.tomcat.max-keep-alive-requests=100 ;保持活动会话数,默认值为100
原创类文章未经允许请勿转载:39点博客 » 解决Jmeter压测勾选KeepAlive后请求失败率50%的问题