当前位置:首页 > 公众号精选 > 架构师社区
[导读]作者:vivo互联网服务器团队-ZhangLin一、业务背景目前移动端的使用场景中会用到大量的消息推送,push消息可以帮助运营人员更高效地实现运营目标(比如给用户推送营销活动或者提醒APP新功能)。对于推送系统来说需要具备以下两个特性:消息秒级送到用户,无延时,支持每秒百万推送,单机百万长连接。支持通知、文本、自定义消息透传等展现形式。正是由于以上原因,对于系统的开发和维护带来了挑战。下图是推送系统的简单描述(API->推送模块->手机)。二、问题背景推送系统中长连接集群在稳定性测试、压力测试阶运行一段时间后随机会出现一个进程挂掉的情况,概率较小(频率为一个月左右发生一次),这会影响部分客户...

作者:vivo互联网服务器团队-Zhang Lin

一、业务背景


目前移动端的使用场景中会用到大量的消息推送,push消息可以帮助运营人员更高效地实现运营目标(比如给用户推送营销活动或者提醒APP新功能)。


对于推送系统来说需要具备以下两个特性:

  • 消息秒级送到用户,无延时,支持每秒百万推送,单机百万长连接。

  • 支持通知、文本、自定义消息透传等展现形式。正是由于以上原因,对于系统的开发和维护带来了挑战。下图是推送系统的简单描述(API->推送模块->手机)。



二、问题背景


推送系统中长连接集群在稳定性测试、压力测试阶运行一段时间后随机会出现一个进程挂掉的情况,概率较小(频率为一个月左右发生一次),这会影响部分客户端消息送到的时效。


推送系统中的长连接节点(Broker系统)是基于Netty开发,此节点维护了服务端和手机终端的长连接,线上问题出现后,添加Netty内存泄露监控参数进行问题排查,观察多天但并未排查出问题。


于长连接节点是Netty开发,为便于读者理解,下面简单介绍一下Netty


三、 Netty介绍


Netty是一个高性能、异步事件驱动的NIO框架,基于Java NIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,HBase,Hadoop,Bees,Dubbo等开源组件也基于Netty的NIO框架构建。


四、问题分析


4.1 猜想


最初猜想是长连接数导致的,但经过排查日志、分析代码,发现并不是此原因造成。


长连接数:39万,如下图:



每个channel字节大小1456, 按40万长连接计算,不致于产生内存过大现象。


4.2 查看GC日志


查看GC日志,发现进程挂掉之前频繁full GC(频率5分钟一次),但内存并未降低,怀疑堆外内存泄露。


4.3 分析heap内存情况


ChannelOutboundBuffer对象占将近5G内存,泄露原因基本可以确定:ChannelOutboundBuffer的entry数过多导致,查看ChannelOutboundBuffer的源码可以分析出,是ChannelOutboundBuffer中的数据。


没有写出去,导致一直积压;

ChannelOutboundBuffer内部是一个链表结构。



4.4 从上图分析数据未写出去,为什么会出现这种情况?


代码中实际有判断连接是否可用的情况(Channel.isActive),并且会对超时的连接进行关闭。从历史经验来看,这种情况发生在连接半打开(客户端异常关闭)的情况比较多---双方不进行数据通信无问题。


按上述猜想,测试环境进行重现和测试。

1)模拟客户端集群,并与长连接服务器建立连接,设置客户端节点的防火墙,模拟服务器与客户端网络异常的场景(即要模拟Channel.isActive调用成功,但数据实际发送不出去的情况)。


2)调小堆外内存,持续发送测试消息给之前的客户端。消息大小(1K左右)。


3)按照128M内存来计算,实际上调用9W多次就会出现。



五、问题解决


5.1 启用autoRead机制


当channel不可写时,关闭autoRead;

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { if (!ctx.channel().isWritable()) { Channel channel = ctx.channel(); ChannelInfo channelInfo = ChannelManager.CHANNEL_CHANNELINFO.get(channel); String clientId = ""; if (channelInfo != null) { clientId = channelInfo.getClientId(); }
LOGGER.info("channel is unwritable, turn off autoread, clientId:{}", clientId); channel.config().setAutoRead(false); }}

当数据可写时开启autoRead;

@Overridepublic void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception{ Channel channel = ctx.channel(); ChannelInfo channelInfo = ChannelManager.CHANNEL_CHANNELINFO.get(channel); String clientId = ""; if (channelInfo != null) { clientId = channelInfo.getClientId(); } if (channel.isWritable()) { LOGGER.info("channel is writable again, turn on autoread, clientId:{}", clientId); channel.config().setAutoRead(true); }}

说明:


autoRead的作用是更精确的速率控制,如果打开的时候Netty就会帮我们注册读事件。当注册了读事件后,如果网络可读,则Netty就会从channel读取数据。那如果autoread关掉后,则Netty会不注册读事件。


这样即使是对端发送数据过来了也不会触发读事件,从而也不会从channel读取到数据。当recv_buffer满时,也就不会再接收数据。


5.2 设置高低水位

serverBootstrap.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 8 * 1024 * 1024));
注:高低水位配合后面的isWritable使用

5.3 增加channel.isWritable()的判断


channel是否可用除了校验channel.isActive()还需要加上channel.isWrite()的判断,isActive只是保证连接是否激活,而是否可写由isWrite来决定。

private void writeBackMessage(ChannelHandlerContext ctx, MqttMessage message) { Channel channel = ctx.channel(); //增加channel.isWritable()的判断 if (channel.isActive()
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

功率器件是一种专门用于控制、调节和放大电能的电子元件,主要用于处理大功率电信号或驱动高功率负载,如电机、变压器、照明设备等。

关键字: 功率器件 控制 放大电能

机器人是一种集成了机械、电子、控制、传感、人工智能等多学科先进技术的自动化装备,能够模仿或替代人类进行各种任务的设备。

关键字: 人工智能 电子 控制

伺服电机是一种高精度、高性能的电机,广泛应用于各种自动化控制系统中。控制伺服电机是实现自动化控制的关键环节,不同的控制方式具有不同的特点和适用场景。本文将介绍几种常见的伺服电机控制方式及其特点,并分析在实际应用中应注意的...

关键字: 伺服电机 控制 自动化

大连2023年9月20日 /美通社/ -- 日前,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(以下简称"TÜV莱茵")受...

关键字: 控制 医疗服务 HEALTH 信息安全

 上海2023年9月7日 /美通社/ -- 近期,“国家卫生健康委国际交流与合作中心·因美纳公共卫生教育奖学金”项目(下称,“公共卫生教育奖学金”)完成首批奖学金颁发。该项目是由国家卫生健康委国际...

关键字: BSP 控制 组网 网络建设

张家港2023年8月25日 /美通社/ -- 对于塔机买家,需求的不仅仅是塔机的功能性,还有塔机的耐用性和残值。在这方面,波坦塔机以其卓越的品质和持久的稳定性,成为了一个值得信赖的选择。 当你在考虑购买二手塔机时,你应...

关键字: BSP 控制 变频调速 应力

上海2023年8月25日 /美通社/ -- 云顶新耀(HKEX 1952.HK)是一家专注于创新药和疫苗开发、制造、商业化的生物制药公司,今日宣布中国澳门特别行政区药物监督管理局已正式受理耐赋康®用于治疗IgA肾...

关键字: NDA 控制 新加坡 COM

上海2023年8月17日 /美通社/ -- 全球领先的专业信息、软件解决方案和服务供应商威科集团今天宣布,梦饷科技选择了CCH® Tagetik企业绩效管理(CPM)解决方案来应对全面预算管理需求。梦饷科技选择了...

关键字: TI GE 控制 软件

在电子测量和控制领域,精确信号放大和处理是至关重要的。而三运放仪表放大器作为一种常用的电子元件,因其高增益、低失真和良好的精确度而备受青睐。本文将介绍三运放仪表放大器的基本原理和结构,并探讨如何正确使用。

关键字: 电子测量 三运放仪表放大器 控制

上海2023年8月14日 /美通社/ -- 在创新驱动发展战略的政策指引下,上海外服作为人力资源行业的领跑者,快速响应政策号召,创新服务,打造以数字化平台为载体,以员工旅程为切入点的数智化人力资源工具——"数职...

关键字: 数字化 电子 手机 控制
关闭
关闭