线上线程堆积导致的oom排查思路

java操作seaweedfs 前置条件是seaweedfs服务已成功启动,具体部署可参考我上篇文章SeaweedFS部署及使用指南 首先导入pom依赖 <dependency> <groupId>net.anumbrella.seaweedfs</groupId> <artifactId>seaweedfs-java-client</artifactId> <version&g. 阅读详情

背景

一个项目文件存储服务选型seaweedfs,一个go 实现的分布式存储系统,项目使用Java作为开发语言,一个场景是客户通过http上传文件到fileService服务,fileService 收到文件之后,调用seaWeedFs-client 上传文件到seaweedfs 服务器,在运行一段时间之后发现大量的文件上传等待线程,最终导致项目oom.

排查oom

第一阶段,既然是oom 考虑的是文件读取到内存值没有正确释放,生产环境执行

ps -aux |grep "file"

定位到servicep id

获取dump文件
jmap -dump:format=b,live,file=/home/app/app.dmump 13245

获取一个近20G 的大文件,没办法只能在服务器上解析。

略

之后重启服务,运行几分钟之后再次获取一个2G大的文件,下载到本地

使用MAT 分析工具,分析得出
大部分是上传线程在等待占用了内存,

接下来分析线程运行情况,

首先看进程13245 下由多少个线程

命令:pstree 13245

[root@nz-travel ~]# pstree 11008
java───42*[{java}]

然后使用

jstack -l 11008

发现大量的waiting 线程

"lettuce-eventExecutorLoop-1-2" #39 daemon prio=5 os_prio=0 cpu=52.93ms elapsed=9153247.42s tid=0x00007f7c50007800 nid=0x32 waiting on condition  [0x00007f7c356e8000]
   java.lang.Thread.State: WAITING (parking)
	at jdk.internal.misc.Unsafe.park(java.base@11.0.14.1/Native Method)
	- parking to wait for  <0x00000000875bde70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(java.base@11.0.14.1/LockSupport.java:194)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.14.1/AbstractQueuedSynchronizer.java:2081)
	at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.14.1/LinkedBlockingQueue.java:433)
	at io.netty.util.concurrent.SingleThreadEventExecutor.takeTask(SingleThreadEventExecutor.java:243)
	at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:64)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(java.base@11.0.14.1/Thread.java:829)

   Locked ownable synchronizers:
	- None

统计waiting 线程的数据

通过关键字筛选

jstack -l 11008 |grep "waiting on condition" -C10

统计数据

jstack -l 11008 |grep "waiting on condition" |wc -l

查看线程开始时间

[root@nz-travel ~]# ps -Lo tid,etime,lstart -p 11008 
    TID     ELAPSED                  STARTED
  11008 105-22:56:41 Thu Dec 22 23:41:33 2022
  11061 105-22:56:40 Thu Dec 22 23:41:34 2022
  11066 105-22:56:40 Thu Dec 22 23:41:34 2022
  11067 105-22:56:40 Thu Dec 22 23:41:34 2022
  11068 105-22:56:40 Thu Dec 22 23:41:34 2022
  11069 105-22:56:40 Thu Dec 22 23:41:34 2022
  11070 105-22:56:40 Thu Dec 22 23:41:34 2022
  11071 105-22:56:40 Thu Dec 22 23:41:34 2022
  11072 105-22:56:40 Thu Dec 22 23:41:34 2022
  11073 105-22:56:40 Thu Dec 22 23:41:34 2022
  11074 105-22:56:40 Thu Dec 22 23:41:34 2022
  11075 105-22:56:40 Thu Dec 22 23:41:34 2022
  11076 105-22:56:40 Thu Dec 22 23:41:34 2022
  11077 105-22:56:40 Thu Dec 22 23:41:34 2022
  11078 105-22:56:40 Thu Dec 22 23:41:34 2022
  11079 105-22:56:40 Thu Dec 22 23:41:34 2022
  11080 105-22:56:40 Thu Dec 22 23:41:34 2022
  11100 105-22:56:40 Thu Dec 22 23:41:34 2022
  11111 105-22:56:34 Thu Dec 22 23:41:40 2022
  11112 105-22:56:34 Thu Dec 22 23:41:40 2022
  11113 105-22:56:34 Thu Dec 22 23:41:40 2022
  11114 105-22:56:33 Thu Dec 22 23:41:41 2022
  11116 105-22:56:30 Thu Dec 22 23:41:44 2022
  11117 105-22:56:30 Thu Dec 22 23:41:44 2022
  11118 105-22:56:30 Thu Dec 22 23:41:44 2022
  11707 105-22:52:50 Thu Dec 22 23:45:24 2022
  11711 105-22:52:50 Thu Dec 22 23:45:24 2022
  11713 105-22:52:50 Thu Dec 22 23:45:24 2022
  11722 105-22:52:47 Thu Dec 22 23:45:27 2022
  11723 105-22:52:47 Thu Dec 22 23:45:27 2022
  11724 105-22:52:47 Thu Dec 22 23:45:27 2022
  11725 105-22:52:46 Thu Dec 22 23:45:28 2022
  11726 105-22:52:46 Thu Dec 22 23:45:28 2022
  11727 105-22:52:38 Thu Dec 22 23:45:36 2022
  11728 105-22:52:38 Thu Dec 22 23:45:36 2022
  11834 105-22:46:17 Thu Dec 22 23:51:57 2022
  11835 105-22:46:10 Thu Dec 22 23:52:04 2022
  11836 105-22:46:10 Thu Dec 22 23:52:04 2022
  11837 105-22:46:10 Thu Dec 22 23:52:04 2022
  11838 105-22:46:10 Thu Dec 22 23:52:04 2022
  11839 105-22:46:10 Thu Dec 22 23:52:04 2022
  11840 105-22:46:08 Thu Dec 22 23:52:06 2022
 284872    22:45:26 Thu Apr  6 23:52:48 2023

筛选某个线程

ps -Lo tid,lstart 1 | grep 26949

分析问题

以上文的命令举例:

lettuce 是关键字, 是Redis连接池的中的线程, 如果发生了线程堆积,从Redis 链接配置,链接池中间件代码分析入手解决问题,

线程等待一般是死锁或者线程等待资源,死锁是jstack 会给出提示比较容易定位问题,线程等待就需要具体代码分析等待的资源情况

线上遇到是三方包使用的grpc 调用服务端接口,但是没有超时逻辑,导致线程一直在等待服务端返回

参考资料:https://www.fancv.com/article/1680877733

【排障手记】WebFlux踩坑记——排查一次WebClient使用中的OOM(java.lang.OutOfMemoryError: Java heap space)异常的血泪史 笔者在使用WebFlux框架的WebClient实现进行高并发代理请求时,遭遇了OOM异常。经历数天时间不断尝试,终于解决问题。 阅读详情

相关推荐

深入理解OOM内存溢出:从原理到实战排查与预防

内存溢出(Out Of Memory,简称OOM)是程序运行时因无法获得足够连续内存空间而引发的错误,其本质常与内存泄漏、大对象创建及不合理的缓存策略有关。理解不同运行时环境(如JVM、V8、Go Runtime)的内存管理模型是诊断OOM的基础,例如JVM的堆、元空间与GC机制,或Node.js V8引擎的老生代限制。掌握这些原理对于构建高可用应用至关重要,能有效应对生产环境中服务崩溃的风险。本文聚焦于实战排查,通过分析`vscode oom -536870904`、`mrds65 oom`等具体案例,提

weixin_30411819的博客 512

一次线上cpu近200%的问题排查

线上问题排查处理

6个日的博客 3264

JVM内存溢出(OOM)全解析:从堆、栈到元空间的排查与实战

内存溢出(OutOfMemoryError)是Java程序运行时的常见故障,其本质是JVM无法在特定内存区域分配所需空间。理解其原理需要从JVM内存模型切入,它精细划分了堆、栈、方法区(元空间)和直接内存等区域,每个区域功能不同,溢出原因也各异。掌握内存溢出排查技术,对于保障系统稳定性和性能优化具有重要价值,尤其在微服务、高并发等应用场景中至关重要。本文聚焦于**内存泄漏**和**元空间**等核心热点的深度剖析,通过系统性的监控、诊断工具(如Heap Dump分析)和实战案例,提供从问题定位到解决方案的完整

weixin_30603633的博客 398

SeaweedFs使用-通过java项目上传

文件上传完成之后直接使用上传文件方法返回的路径,前面拼接上filer的服务的ip和端口号即可直接查看访问。官方提供了java操作文件的工具类。maven项目使用如下配置。创建一个上传文件的工具类SeaweedTemplate。

chenyidong521的博客 2286

seaweedfs-java-client:seaweedfs-java-clinet

SeaweedFS Java客户端 快速开始 创建一个连接管理器 FileSource fileSource = new FileSource (); ConnectionProperties connectionProperties = new ConnectionProperties . Builder () .host( " localhost " ) .port( 9333 ) .maxConnection( 100 ) . build(); // Startup manager and listens for the change fileSource . startup(); 创建文件操作模板 // Template used

seaweedfs适应所有版本的java客户端API

目前github上的seaweedfs-client只适配了低版本的seaweedfs,例如1.3.4版本.而此jar包适配了高版本的seaweedfs

猿辅导二面:线上出现的OOM是如何排查的?

java.lang.OutOfMemoryError: Direct buffer memory(NIO/Netty/ByteBuffer) 原生内存耗尽(JNA、压缩、TLS、线程栈等):NMT(VM.native_memory summary)、应用指标(Netty PooledArena)、-XX:MaxDirectMemorySize。:应用日志、K8s 事件 (kubectl describe pod)、系统日志 (dmesg)、JVM 日志(GC/错误日志)。:Pod 被杀,JVM没栈。

Java架构师之路的博客 543

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 984

一次 OOM 线上排查实录

老项目线上 OOM 踩坑实录!Druid 连接池 SQL 缓存泄漏 + 业务 SQL 拼接双重叠加导致内存溢出,通过堆 dump 定位问题,优化 Druid 配置 + 批量插入预防 OOM。

qq_47449076的博客 392

多周期路径及set_multicycle_path详解

默认情况下,每条路径都被定义为单周期,即源触发器在时钟的任一边沿启动(launch)的数据都应该由目的触发器在时钟的下一上升沿捕获(capture)。 有的设计需要在数据被捕获前提供一些额外的周期,这类路径被称为多周期路径。 一、set_multicycle_path命令 命令格式如下: set_multicycle_path .........

Jackiezhang1993的博客 4万+

HFSS新手避坑指南:从零搭建T形波导功分器(含参数扫描与优化实战)

本文为HFSS新手提供T形波导功分器设计的详细指南,涵盖基础设置、建模技巧、参数扫描与优化实战。重点解析内场分析中的常见陷阱,如单位设置、波端口定义和布尔运算错误,并分享优化设计的关键步骤,帮助工程师快速掌握HFSS在微波器件设计中的应用。

weixin_27442001的博客 138

netty 堆外内存泄露排查思路

这篇文章对于排查使用了 netty 引发的堆外内存泄露问题,有一定的通用性,希望对你有所启发 背景 最近在做一个基于 websocket 的长连中间件,服务端使用实现了 socket.io 协议(基于websocket协议,提供长轮询降级能力) 的 netty-socketio 框架,该框架为 netty 实现,鉴于本人对 netty 比较熟,并且对比同样实现了 socket.io 协议的其他框...

gt9000的博客 2288

Enterprise Architect 中文经典教程

本文使用到的EA工程文件下载 一、Enterprise Architect简介 Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件(Computer Aided Software Engineering)。EA不同于普通的UML画图工具(如VISIO),它将支撑系统开发的全过程。在需求分析阶段,系统分析与设计阶段,系统开发及部署等方面有着强大的支持,...

2万+

线上线程池频繁爆满、任务堆积?复盘我踩过的那些低级且致命的坑

默认的拒绝策略AbortPolicy,直接抛出RejectedExecutionException,粗暴拒绝任务,没有任何重试、兜底、日志记录。线上一旦触发,就是业务报错、数据丢失、流程中断。很多开发自测的时候从来不会压测到极限,所以永远发现不了这个问题,等到线上出事才后悔。实际项目中,一定要自定义拒绝策略:1、拒绝任务时,打印详细日志(任务参数、时间、线程池状态),方便后续排查;2、增加重试机制,非核心任务可以丢弃,核心任务必须兜底重试;

acd12009的博客 413

VisualSFM+MeshLab 三维重建全过程记录

VisualSFM+MeshLab 三维重建全过程记录,从下载到运行出结果,以及其中一些可能出现的小问题。通过这两个软件熟悉一下多目立体视觉重建的流程。

何似莫相逢 3万+

从CORDIC到DDS:手把手拆解《Verilog传奇》第9章的实战项目(附可跑通的代码)

本文详细解析了如何从CORDIC算法到DDS系统的完整实现过程,基于《Verilog传奇》第9章的实战项目,提供了可运行的Verilog代码。内容涵盖CORDIC算法的硬件实现、DDS系统架构设计、完整系统集成与验证,以及实际部署中的性能调优技巧,适合数字IC和FPGA开发者深入学习。

weixin_42623010的博客 413

线上故障如何快速排查?来看这套技巧大全

点击上方蓝色“石杉的架构笔记”,选择“设为星标” 回复“PDF”获取独家整理的学习资料! 长按扫描上方免费领取导读:有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服...

石杉的架构笔记 765

实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)

导读 本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。 背景介绍 在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。 实现步骤 本文只针对包含大部分文字的文档做倾斜矫正,思路来源是大部分文字倾斜后同一行的也在同一条直线,通过拟合直线计算文本倾斜角度,然后旋转来实现文本倾斜矫正。 详细步骤: ①加载倾斜图像 ②灰度转换+腐蚀+膨胀 ③Canny边缘检测 + 霍夫线变换检测直线 ...

Color Space的博客 3398

记一次线上服务假死问题(MongoDB超时和OOM两个坑)

事件的背景是:一个老系统,功能模块很多,包含两个团队的职责(最开始只有一个团队),所以要将这个系统拆分成两个服务,各自团队负责自己的服务,由于业务影响,这次上线只能在23点后通宵进行。 问题一:ECS自建Mongo数据表数据量大,没有建索引,导致查询巨慢,CPU打满。 问题发生在第二天下午,提供给APP的接口响应变慢,后来应用假死(CPU、内存、带宽都检查过没有异常)。因为接口逻辑并不复杂,推断主要耗时就在从Mongo获取上,看Mongo的那台服务器,发现CPU已经打满了,然后就分析Mongo正在执行什么任

Logger 1602

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

线上故障排查:像医生治病一样拯救你的系统

本文系统总结了线上故障排查的方法论,适用于微服务架构、数据库和中间件环境。核心思路分为四步:应急止血→定位根因→修复上线→复盘预防。应急响应阶段强调先止血后治病,提供了回滚、扩容等6种紧急处理手段。根因定位提出"四板斧"框架(监控、日志、链路、变更),并给出数据库和中间件的专项排查指南。修复上线强调从临时方案到根治方案的过渡。最后重点阐述了复盘与预防体系建设,包括监控告警、变更管控等关键环节。文章还提供了Linux、JVM等常用排查命令速查,强调故障处理时要保持冷静、注重数据、记录过程。

m0_65159391的博客 620

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程)

系统OOM(资源不能被释放)导致服务器频繁且长时间FGC导致服务器CPU持续飚高日志中内存溢出:**java.lang.OutOfMemoryError: Java heap space**程序十分卡顿,严重影响用户使用从以下方面,为大家分享此次问题解决流程问题出现现象临时解决方案复现问题定位问题发生原因优化代码优化后进行压测,上线复盘不同的项目导致内存溢出原因是不同的;重要的是排查思路经过不断的耐心的去观察,测试,分析才能定位到问题并最终解决问题。

meser88的博客 8170

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 应用故障排查的具体步骤

Java应用故障排查步骤摘要 排查Java应用故障需分层进行:网络层(连通性)、系统层(CPU/内存)、JVM层(GC/OOM)、应用层(日志/接口)、数据层(DB/缓存)。具体步骤包括: 基础检查:确认进程存活、端口监听; 日志分析:搜索Error/Exception等关键词; 资源监控:通过top、free等命令检查CPU、内存、文件句柄; JVM工具:jstack查线程阻塞,jstat看GC,jmap抓堆内存; 链路追踪:结合APM工具和TraceId定位瓶颈; 常见场景:OOM、死锁、连接池满等对应

weixin_59840429的博客 579

创意工具上线前的配置检查

两周前把一套集成了文本生成与图像处理的创意工具部署到一台 2核 4GB 内存的廉价云服务器上。刚准备开测,后台监控就频繁收到报警。Linux 内核的 OOM Killer 不断出手杀掉主服务进程,显存与物理内存双双爆仓,并发请求在入口堆积,导致响应延迟直奔 30 秒。资源受限的服务不能直接沿用高配本地机器的假设。部署前应为 API 速率、内存、并发和降级路径设定可验证的边界,并根据实际负载调整。

weixin_63764436的博客 5048

线上AI服务token暴涨300%:从内存泄漏到静默失败的全链路排查

在分布式系统和AI应用开发中,内存泄漏和静默失败是两大常见且棘手的工程问题。内存泄漏指程序在运行过程中未能释放不再使用的内存,导致内存占用持续增长,最终可能引发服务崩溃或性能严重下降。其原理通常是对象被意外地长期持有,垃圾回收器无法回收。静默失败则指程序执行过程中发生错误,但未抛出异常或提供明确失败信号,导致系统状态不一致和资源残留。这两类问题的技术价值在于,它们直接影响线上服务的稳定性、资源成本和用户体验。在AI服务场景下,大模型调用涉及大量的上下文数据和token消耗,一旦出现内存泄漏或静默失败,极易引

weixin_30786657的博客 1495
上一篇: docker 快速搭建minio 服务
下一篇: oshi.util.Util.freeMemory 报异常的解决方法.NoSuchMethodError: com.sun.jna.Memory.close()V
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值