首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

服务器内存使用飙升的排查

这几天自己线上的乞丐服务器遇到一个问题,io会瞬间飙升到很高很高,造成内存使用飙升。但是实际上并发量并不大(网络连接数)。知道是哪个进程造成的,但是确实排查代码中没有是么地方会有这么大的读写。...也不知道对方到底发的什么数据导致这么大的内存占用。 之前也处理过类似的问题。麻烦之处在于很好的定位问题,重现实际的操作。没办法,只能针对socket服务特定的端口进行抓包。...服务器问题,无非就是资源不合理的使用,造成服务器内存,cpu,io,流量等相关资源出现非常不正常的波动,资源使用率飙升。对于服务器性能问题的排查,没有其他比较好的办法,只能是通过重现复盘去改进。...特别是如果服务器上跑的东西比较多,一个个的排查相当痛苦。 出现问题,首先看日志。如果是线上的,先想办法恢复服务再排查。 看看登录日志,访问日志是否有异常,确定是否有人扫机器。

22.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Netty Unpooled 内存分配

    Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。 ByteBuf ByteBuf的内部结构如下图: ?...ByteBuf类结构图 ByteBuf分类 Pooled和Unpooled:pooled类型的bytebuf是在已经申请好的内存块取一块内存,而Unpooled是直接通过JDK底层代码申请。...Unsafe和非Unsafe:这里的Unsafe是JDK底层的对象,通过它能够直接操作到内存。 Heap和Direct:一个是在堆上分配,一个是直接内存。Direct不受GC的控制。...ByteBufAllocator类图 UnpooledByteBufAllocator分配heap内存 通过调用heapBuffer方法分配一块heap内存 ?...UnpooledByteBufAllocator分配direct内存 UnpooledByteBufAllocator类的newDirectBuffer方法 ?

    1.8K20

    跟着案例学NettyNetty内存池泄漏问题

    小编说:Netty是Java高性能网络编程的明星框架,本文选自《Netty进阶之路:跟着案例学Netty》一书,书中内容精选自1000多个一线业务实际案例,真正从原理到实践全景式讲解Netty项目实践...进行一段时间的性能测试之后,日志中出现异常,进程内存不断飙升,怀疑存在内存泄漏问题,如图1所示。 ?...从图9可以看出,内存泄漏点是Netty内存池对象PoolChunk,由于请求和响应消息内存分配都来自PoolChunk,暂时还不确认是请求还是响应消息导致的问题。...2.基于非内存池的请求ByteBuf 如果业务使用非内存池模式覆盖Netty默认的内存池模式创建请求ByteBuf,例如通过如下代码修改内存申请策略为Unpooled: ?...本文选自《Netty进阶之路:跟着案例学Netty》一书,作者李林锋 ,在书中“Netty内存池泄漏疑云案例”分析中,更详细介绍了ByteBuf的申请和释放策略,以及Netty 内存池的工作原理。

    2.9K21

    Netty 专栏】深入浅出 Netty 内存管理 PoolArena

    1、深入浅出Netty内存管理 PoolChunk 2、深入浅出Netty内存管理 PoolSubpage 3、深入浅出Netty内存管理 PoolChunkList PoolArena 应用层的内存分配主要通过如下实现...PooledByteBufAllocator.DEFAULT.directBuffer(128); 由于netty通常应用于高并发系统,不可避免的有多线程进行同时内存分配,可能会极大的影响内存分配的效率...poolArena提供了两种方式进行内存分配: PoolSubpage用于分配小于8k的内存; tinySubpagePools:用于分配小于512字节的内存,默认长度为32,因为内存分配最小为16,每次增加...q000没有前置节点,当一个chunk进入到q000列表,如果其内存被完全释放,则不再保留在内存中,其分配的内存被完全回收。...q000中的chunk,当内存利用率为0时,就从链表中删除,直接释放物理内存,避免越来越多的chunk导致内存被占满。

    1.1K20

    Netty】使用 Netty 开发 HTTP 服务器

    文章目录 一、 HTTP 服务器开发 二、 HTTP 服务器代码分析 1 . Netty 开发 HTTP 服务器与 TCP 服务器对比 2 . ChannelInitializer 设置 3 ....执行结果 一、 HTTP 服务器开发 ---- HTTP 服务器案例需求 : ① HTTP 服务器端 : 在服务器端使用 Netty 开发 HTTP 服务器 , 该 HTTP 服务器监听 8888 端口...Netty 开发 HTTP 服务器与 TCP 服务器对比 HTTP 协议的服务器与 TCP 协议的服务器程序区别在于设置的 ChannelInitializer 和 Handler 中对数据的处理方式不同...服务器主程序 package kim.hsl.http; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import..., 即可访问 Netty HTTP 服务器 , 服务器返回 Hello Client 字符串信息 ; ③ 服务器端日志 :

    50510

    Netty 专栏】深入浅出 Netty 内存管理 PoolChunkList

    1、深入浅出Netty内存管理 PoolChunk 2、深入浅出Netty内存管理 PoolSubpage PoolChunkList PoolChunkList负责管理多个chunk的生命周期,在此基础上对内存分配进行进一步的优化...img Paste_Image.png 随着chunk中page的不断分配和释放,会导致很多碎片内存段,大大增加了之后分配一段连续内存的失败率,针对这种情况,可以把内存使用率较大的chunk放到PoolChunkList...当分配完内存后,如果当前chunk的使用量超过maxUsage,则把该chunk从当前链表中删除,添加到下一个链表中。...但是,随便chunk中内存的释放,其内存使用率也会随着下降,当下降到minUsage时,该chunk会移动到前一个列表中,实现如下: boolean free(PoolChunk chunk, long...所以chunk的生命周期不会固定在某个chunkList中,随着内存的分配和释放,根据当前的内存使用率,在chunkList链表中前后移动。

    61410

    Netty 专栏】深入浅出 Netty 内存管理 PoolSubpage

    上一节中分析了如何在poolChunk中分配一块大于pageSize的内存,但在实际应用中,存在很多分配小内存的情况,如果也占用一个page,明显很浪费。...针对这种情况,Netty提供了PoolSubpage把poolChunk的一个page节点8k内存划分成更小的内存段,通过对每个内存段的标记与清理标记进行内存的分配与释放。 ?...,最小为16,说明一个page可以分成8192/16 = 512个内存段,一个long有64位,可以描述64个内存段,这样只需要512/64 = 8个long就可以描述全部内存段了。...,说明如何确定bitmapLength的值: 比如,当前申请大小4096的内存,maxNumElems 和 numAvail 为2,说明一个page被拆分成2个内存段,2 >>> 6 = 0,且2 &...如果当前申请大小32的内存,maxNumElems 和 numAvail 为 256,说明一个page被拆分成256个内存段, 256>>> 6 = 4,说明需要4个long描述256个内存段状态。

    74000

    Netty 堆外内存的管理

    本篇文章我们将进入 Netty 内存管理的学习,在此之前,我们需要了解 Java 堆外内存的基本知识,因为当你在使用 Netty 时,需要时刻与堆外内存打交道。...我们经常看到各类堆外内存泄漏的排查案例,堆外内存使用不当会使得应用出错、崩溃的概率变大,所以在使用堆外内存时一定要慎重,文章将带你一起认识堆外内存,并探讨如何更好地使用它。...文章目录 为什么需要堆外内存 堆外内存的分配 堆外内存的回收 总结 为什么需要堆外内存 在 Java 中对象都是在堆内分配的,通常我们说的JVM 内存也就指的堆内内存,堆内内存完全被JVM 虚拟机所管理...堆外内存与堆内内存相对应,对于整个机器内存而言,除堆内内存以外部分即为堆外内存,如下图所示。堆外内存不受 JVM 虚拟机管理,直接由操作系统管理。 ?...堆外内存和堆内内存各有利弊,这里我针对其中重要的几

    89610

    Netty 专栏】深入浅出 Netty 内存管理 PoolChunk

    多年之前,从C内存的手动管理上升到java的自动GC,是历史的巨大进步。然而多年之后,netty内存实现又曲线的回到了手动管理模式,正印证了马克思哲学观:社会总是在螺旋式前进的,没有永远的最好。...的确,就内存管理而言,GC给程序员带来的价值是不言而喻的,不仅大大的降低了程序员的负担,而且也极大的减少了内存管理带来的Crash困扰,不过也有很多情况,可能手动的内存管理更为合适。...接下去准备几个篇幅对Netty内存管理进行深入分析。 PoolChunk 为了能够简单的操作内存,必须保证每次分配到的内存时连续的。...Netty中底层的内存分配和回收管理主要由PoolChunk实现,其内部维护一棵平衡二叉树memoryMap,所有子节点管理的内存也属于其父节点。 ?...8k内存

    86200

    netty系列之:使用netty搭建websocket服务器

    通过Websocket我们可以实现客户端和服务器端的即时通讯,免除了客户端多次轮循带来的性能损耗。 既然websocket这么优秀,那么怎么在netty中使用websocket呢?...而PingWebSocketFrame和PongWebSocketFrame是两个特殊的frame,他们主要用来做服务器和客户端的探测。...在这个例子中,我们使用netty创建一个websocket server,然后使用浏览器客户端来对server进行访问。 创建websocket server和普通netty服务器的过程没有什么两样。...有了服务器端,客户端该怎么连接呢?...搭建websocket服务器的完整流程,本文中的服务器可以同时处理普通HTTP请求和webSocket请求,但是稍显复杂,有没有更加简单的方式呢?

    5.7K40

    Netty15# 池化内存Normal类型内存分配

    前言 Netty所谓的池化就是先申请了一块大内存,后面需要分配的时候就来我这里分就完了。...以堆外直接内存分配为例,Netty以Chunk为单位16M申请了一块连续内存,这么一大块内存是以平衡二叉树的形式组织起来的。分配的时候就从这颗树上找合适的节点。...池化内存的分配是Netty的最为核心部分,这块的代码很多位运算,不太容易看懂,读的时候需要边调试边分析。...一 平衡二叉树 Normal类型的组织,Netty使用平衡二叉树将申请到的Chunk块组织起来,如下图所示,并使用数组将整个树映射进去,见下文构造函数中memoryMap。 ?...二 平衡二叉树查找更新过程 三次分配示例 Normal类型的内存分配,主要是如何在二叉树中找到匹配的节点的过程,以及该节点的被分配后整个树的状态更新变化。

    70430

    Elasticsearch JVM 堆内存使用率飙升,怎么办?

    这是系列文章的第四篇,主要探讨:Elasticsearch JVM 堆内存使用率飙升,怎么办? 第一篇:Elasticsearch 磁盘使用率超过警戒水位线,怎么办?...第二篇:Elasitcsearch CPU 使用率突然飙升,怎么办? 第三篇:Elasticsearch 断路器报错,怎么办?...2、症状:高 JVM 内存使用率 高 JVM 内存使用率会降低集群性能并触发断路器错误(导致内存熔断)。...导致内存使用率飙升的复杂查询,通常具备如下的特点: size 召回值设置的巨大; 包含分桶值很大的聚合操作或者聚合嵌套很深; 包含极其耗费资源的查询,举例:script 查询、fuzzy 查询、regexp...5、小结 多了解导致 JVM 飙升的操作,业务开发方面及早避免和规避相关操作,做好前置规划和布局很关键。 做好监控和核心指标的预警工作,“防患于未然”。

    3.6K40

    Netty 高性能内存管理设计 (1)

    Netty 作为一款高性能的网络框架,需要处理海量的字节数据,而且 Netty 默认提供了池化对象的内存分配,使用完后归还到内存池,所以一套高性能的内存管理机制是 Netty 必不可少的。...在上节课中我们介绍了原生 jemalloc 的基本原理,而 Netty 高性能的内存管理也是借鉴 jemalloc 实现的,它同样需要解决两个经典的核心问题: 在单线程或者多线程的场景下,如何高效地进行内存分配和回收...如何减少内存碎片,提高内存的有效利用率? 内存规格介绍 Netty 保留了内存规格分类的设计理念,不同大小的内存块采用的分配策略是不同的,具体内存规格的分类情况如下图所示。 ?...在 Netty 中定义了一个 SizeClass 类型的枚举,用于描述上图中的内存规格类型,分别为 Tiny、Small 和 Normal。...但是图中 Huge 并未在代码中定义,当分配大于 16M 时,可以归类为 Huge 场景,Netty 会直接使用非池化的方式进行内存

    55810

    源码分析-使用newFixedThreadPool线程池导致的内存飙升问题

    前言 使用无界队列的线程池会导致内存飙升吗?面试官经常会问这个问题,本文将基于源码,去分析newFixedThreadPool线程池导致的内存飙升问题,希望能加深大家的理解。...看完execute的执行流程,我猜测,内存飙升问题就是workQueue塞满了。接下来,进行阻塞队列源码分析,揭开内存飙升问题的神秘面纱。 阻塞队列源码分析 ?...是不是内存飙升问题水落石出啦。 LinkedBlockingQueue的offer函数 ?...内存飙升问题结果揭晓 newFixedThreadPool线程池的核心线程数是固定的,它使用了近乎于无界的LinkedBlockingQueue阻塞队列。...当核心线程用完后,任务会入队到阻塞队列,如果任务执行的时间比较长,没有释放,会导致越来越多的任务堆积到阻塞队列,最后导致机器的内存使用不停的飙升,造成JVM OOM。

    1.4K21

    深入Netty源码解析内存优化技巧

    应该定义成类变量的不要定义为实例变量 一个类 =》 一个类变量 一个实例 =》一个实例变量 一个类 =》 多个实例 实例越多,浪费越多 当然 netty 会结合这两点! ?...根据接受到的数据动态调整(guess) 下个要分配的Buffer的大小,比如 io.netty.channel.AdaptiveRecvByteBufAllocator 3 零拷贝 逻辑组合代替实际复制...JDK的零拷贝接口 Netty 通过在 DefaultFileRegion 包装了 NIO 的 FileChannel.transferTo() 实现零拷贝:іо.nеttу.сhаnnеl.DеfаultFіlеRеgіоn...os 管理 源码 堆外内存/堆内内存的默认选择 ?...共享有限的资源 实现内存池 开源实现:Apache Commons Pool 程序共享,内存竞争较严重 Netty轻量级对象池实现io.netty.util.Recycler 基于特定场景才创建 内存

    37120
    领券