首页 > 系统相关 >高并发下Netty4底层bug导致直接内存溢出分析

高并发下Netty4底层bug导致直接内存溢出分析

时间:2022-12-27 19:33:03浏览次数:42  
标签:netty capacity ChannelOutboundBuffer 内存 memory bug Netty4


事故记录:

10点游戏开服,迅速冲破2300+单区同时在线

18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障

发现,由于直接内存被占满,一直在Full GC ,并且回收不掉,所以完全不处理玩家请求,通知运维重启服务器,临时解决。

高并发下Netty4底层bug导致直接内存溢出分析_ci

2.考虑了下是不是把RPC连接数量改成了8条,超时改长了了导致,试着把数量减少,超时改成2个小时,发现直接内存随着时间推移还在增加。

3.把内存数据dump了一份下来,发现是netty底层占用比例大大超出了正常水平。

高并发下Netty4底层bug导致直接内存溢出分析_ci_02

高并发下Netty4底层bug导致直接内存溢出分析_数据_03

  • 输出缓冲区ChannelOutboundBuffer

,Recycler 占了很大比例,问了度娘,没什么有用的信息,找Google,用关键词" ChannelOutboundBuffer out of Direct memory full gc"

搜到一篇文章,发现和我遇到的情况基本一致 ,

Direct memory exhausted after sending many notifications

Recycler could cache infinite resources

Fix a bug where Recycler's capacity can increase beyond its maximum #3203

 Netty.4.0.24.final版本有个bug,原因是因为缓冲区的数据如果超过了max_capacity的话,if(size==maxCapacity){....}永远不会成立,所以内存占用会无限扩增导致。

高并发下Netty4底层bug导致直接内存溢出分析_ci_04

更新netty 4.0.25 final版本,继续观察。

可以参考 这篇文章 ​​Netty使用案例 -发送队列积压导致内存泄漏(一)​​

标签:netty,capacity,ChannelOutboundBuffer,内存,memory,bug,Netty4
From: https://blog.51cto.com/u_4176761/5973441

相关文章

  • linux下的内存查看(virt,res,shr,data的意义)
    其实在认真阅读了这篇名为“​​计算内存使用​​​”的文章之后,还是处于半迷糊状态。这位作者就说Linux下面没有特别好的显示内存占用的工具,虽然有top和free,但都说得不清楚......
  • Netty4 读写水位控制分析
    服务器上看看默认是多少ConfigurehighandlowwritewatermarksSetsane WRITE_BUFFER_HIGH_WATER_MARK andWRITE_BUFFER_LOW_WATER_MARKServerBootstrapbootstrap=......
  • 如何相对高效解决代码测评、训练过程中遇到的 Bug——博主自我介绍
    ????声明:作为全网AI领域干货最多的博主之一,❤️不负光阴不负卿❤️????​​????Followme????​​,一起Get更多有趣AI????????本文、最近才整理不久、敬请查阅......
  • Arthas 查询服务器内存数据
    1、打开Arthas所在位置eg:/home2、java-jararthas-boot.jar运行jar包3、选择要执行的javajar包eg:14、执行查看命令vmtool--actiongetInstances--classNameco......
  • 【C语言】memcpy() 内存拷贝不重叠
    前言本篇博客就来介绍下关于C语言常用的内存函数之memcpy()函数。 ......
  • SetProcessWorkingSetSize减少内存占用?啥也不是
    结论:别用这个函数,他会把内存写不下的写到硬盘的虚拟内存中去(注:硬盘中的虚拟内存默认在系统盘里)贴一段博客园名称pdfw的代码点击查看代码[System.Runtime.InteropServ......
  • [C++] C++中关于内存的初解
    内存四区1.代码区存放函数体的二进制代码,由操作系统进行管理。代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码就可以。代码是只读的,只读的......
  • 操作系统 内存碎片 cache替换算法 虚拟地址逻辑地址线性地址物理地址
    采用分区式存储管理的系统,在储存分配过程中产生的、不能供用户作业使用的主存里的小分区称成“内存碎片”。内存碎片分为内部碎片和外部碎片。内部碎片内部碎片就是已经被分......
  • 学习下Redis内存模型
    作者:京东零售吴佳前言redis,对于一个java开发工程师来讲,其实算不得什么复杂新奇的技术,但可能也很少人去深入了解学习它的底层的一些东西。下面将通过对内存统计、内存划......
  • 学习下Redis内存模型
    作者:京东零售吴佳前言redis,对于一个java开发工程师来讲,其实算不得什么复杂新奇的技术,但可能也很少人去深入了解学习它的底层的一些东西。下面将通过对内存统计、内存划分、......