Netty性能压测偶现消息发送时延毛刺案例

阿里云幸运券

问题描述

业务使用Netty发送消息,性能压测过程中偶现一些消息发送耗时超过1S,采集了问题发生时CPU使用率,发现CPU占用率并不高,资源不是瓶颈。怀疑是代码BUG,相关性能统计代码如下所示:

    int sendBytes = ((ByteBuf)msg).readableBytes();

    long beginTime = System.currentTimeMillis();

    ChannelFuture writeFuture = ctx.writeAndFlush(msg);

    writeFuture.addListener((f) ->

    {

        long costTime = System.currentTimeMillis() - beginTime;

        if (costTime > 1000)

            logger.warn("Send msg cost time is : " + costTime);

        totalSendBytes.getAndAdd(sendBytes);

    });

问题分析

Netty消息发送耗时大,可能原因如下:

发生了导致STW的GC,从现象看问题发生时单个消息发送耗时大于1S,可能是Full GC导致的,需要采集GC日志或者通过内存工具进行分析。除了GC导致的应用暂停,JIT优化、取消偏向锁等也会导致应用暂停。因此建议定位问题时临时加上 -XX:+PrintGCApplicationStoppedTime、-XX:+PrintSafepointStatistics -XX: PrintSafepointStatisticsCount=1来统计其它导致应用暂停的原因

业务ChannelHandler的outbound操作发生了条件阻塞,导致Netty的NioEventLoop线程被意外阻塞,无法执行消息发送操作

对端消息读取慢,或者一段时间内没有读取消息(例如发生了Full GC),导致发送端tcp缓冲区积压,消息无法发送。通过netstat命令查看Recv-Q和Send-Q状态,可以判断tcp缓冲区是否有消息积压

定位结果

按照上面的思路进行排查,发现业务的ChannelHandler对消息发送做了拦截,在执行拦截逻辑时,依赖某个外部条件,如果检测不满足,则sleep 1S再次检测,直到条件满足,才会继续执行后续ChannelHandler,这导致了Netty的NioEventLoop线程被随机阻塞,表现出来的现象就是偶现的消息发送超过1S。

问题总结

无论在任何情况下,业务的ChannelHandler都不能执行诸如sleep、wait、发起同步网络读写、数据库操作、同步读写本地磁盘文件等可能导致NioEventLoop线程被阻塞的操作

代码中尽量不要通过while循环 + sleep这种方式来检测条件是否满足,建议采用事件触发或者异步回调的方式,当某个事件触发时,订阅或者注册该事件的监听器可以被唤醒并执行

腾讯云代金券

原文链接

https://mp.weixin.qq.com/s/CHkgku2uGgci25kmc7L86Q

服务推荐

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用[1]和引用,Netty是一个高性能的网络应用框架,用于快速开发可扩展的服务器和客户端。在进行Netty压测时,可以使用JMeter作为压测工具。 以下是使用JMeter进行Netty压测的步骤: 1. 下载和安装JMeter:可以从JMeter官方网站(https://jmeter.apache.org/)下载JMeter,并按照官方文档进行安装。 2. 创建测试计划:打开JMeter,创建一个新的测试计划。右键点击测试计划,选择"添加" -> "Threads (Users)" -> "Thread Group",设置线程数、循环次数等参数。 3. 添加Netty请求:在测试计划中,右键点击线程组,选择"添加" -> "Sampler" -> "TCP Sampler"。在TCP Sampler的配置中,设置服务器地址和端口号,并选择请求类型(如GET、POST等)。 4. 配置请求参数:在TCP Sampler的配置中,可以设置请求的参数,如请求头、请求体等。 5. 添加监听器:右键点击线程组,选择"添加" -> "Listener" -> "View Results Tree"。这将显示每个请求的结果,包括响应时间、响应码等信息。 6. 运行测试计划:点击JMeter工具栏上的"运行"按钮,开始运行测试计划。JMeter将模拟多个用户同时发送请求到Netty服务器,并记录每个请求的响应情况。 7. 分析结果:在运行完测试计划后,可以通过查看监听器中的结果来分析压测性能指标,如响应时间、吞吐量等。 请注意,以上步骤仅为示例,实际使用时可能需要根据具体情况进行调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值