首页 > 其他分享 >【问题排查】-bash: fork: retry: Resource temporarily unavailable 记录一下

【问题排查】-bash: fork: retry: Resource temporarily unavailable 记录一下

时间:2024-10-25 17:33:55浏览次数:1  
标签:fork 泄漏 retry Resource Java 线程 内存 GC 日志

● 最初现象,ssh 端口异常,登录机器出现如下,执行每一个命令都会有这个错,最终就是关闭终端后无法在连接,只能重启释放资源

● 查看kernel.threads-max(每个进程中最多创建的的线程数目)

● top -H 查看每个线程的资源使用情况 ,发现达到了当前系统限制 30938

● 修改threads-max , sysctl -w kernel.threads-max=3082609

● 恢复正常

● 查看 java 程序日志,发现每次出现问题都是 pod 日志很大的那台机器,怀疑是 java 程序内存泄漏,

  1. 线程泄漏:内存泄漏可能与线程泄漏相关联,即 Java 程序持续创建新的线程却没有正确终止它们,从而耗尽系统资源。在你调高系统线程限制后,线程数下降的现象表明之前存在大量不必要的线程,这些线程可能由于内存泄漏而未被正确回收。
  2. 频繁的垃圾回收(GC):如果大量对象占用内存,JVM 会频繁触发垃圾回收。当内存不足时,GC 可能会无法有效清理,导致更多的线程等待 GC 完成。这些情况都会导致系统资源耗尽。
  3. CPU 负载和内存竞争:内存泄漏导致的高内存占用会增加垃圾回收的频率,导致更高的 CPU 占用,从而可能拖慢整个系统。

你的当前系统情况

从你提供的 top 输出来看,系统中的线程数一度达到 30938,而在你调高线程限制后,线程数明显下降至 900 左右。这个明显的波动可能表明:

  • Java 进程可能在某个时间点通过创建大量线程占用了大量系统资源,但没有正确地回收它们。
  • 当系统限制解除后,这些不必要的线程可能被系统或应用程序终止,导致线程数迅速下降。

如何进一步排查内存泄漏

  1. 监控 Java 内存使用:使用 jmapjstat 来监控 Java 程序的堆内存使用情况。

    jstat -gcutil <PID> 1000
    

    这可以帮助你了解 JVM 的垃圾回收情况,并判断内存泄漏的可能性。

  2. 线程分析:使用 jstack 来捕获线程转储(thread dump),查看是否存在大量处于等待状态的线程未能正确退出。

    jstack <PID> > thread_dump.txt
    

    检查生成的 thread_dump.txt 文件,看看是否有大量相似的线程在等待某种锁或处于挂起状态。

  3. GC 日志:启用 GC 日志来跟踪垃圾回收行为。通过分析 GC 日志,可以发现内存泄漏或频繁 GC 的迹象。
    启用 GC 日志的命令行参数:

    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
    
  4. 内存分析工具:使用 jmap 导出堆转储,并使用工具如 Eclipse MATVisualVM 来分析内存泄漏。

    jmap -dump:format=b,file=heapdump.hprof <PID>
    

    然后使用 Eclipse MAT 等工具分析生成的 .hprof 文件,查找是否有持续增长的对象占用大量内存。

结论

你的系统可能存在 Java 线程泄漏或内存泄漏问题,这导致了大量的线程和内存占用。随着系统资源的耗尽,调高线程限制暂时解决了这个问题,但仍需要深入排查 Java 应用中的内存和线程管理,使用 GC 日志和堆转储分析工具来找出问题的根本原因。
参考连接:
https://ivanzz1001.github.io/records/post/linux/2017/07/31/linux-thread-limit

标签:fork,泄漏,retry,Resource,Java,线程,内存,GC,日志
From: https://www.cnblogs.com/boradviews/p/18502987

相关文章

  • 2024年资源勘探与地下工程技术国际论坛 (REUET 2024) 2024 International Symposium
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍2024年资源勘探与地下工程技术国际论坛(REUET2024)将作为主会议第六届智能控制......
  • Win11系统提示找不到System.Runtime.Caching.resources.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个System.Runtime.Caching.resources.dll文件(......
  • Fork/Join框架
    Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架packageforkjoin;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ForkJoinPool;importjava.util.co......
  • dockerfile中nuget源加载失败Retrying 'FindPackagesByIdAsync' for source 'xxx'
    问题描述:最近jenkins打包总是提示微软源加载不到Retrying'FindPackagesByIdAsync'forsource'https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json'.Anerroroccurredwhilesendingtherequest.解决方案:dockerfile中添加国内源,改用华......
  • fork函数
    frok函数目录frok函数getpidd/getppid函数fork函数 1.一个进程,包括代码、数据和分配给进程的资源。2.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。3.一......
  • Fork-2.1.0 记录
    Fork-2.1.0记录PE64操作系统:Windows(Server2003)[AMD64,64位,GUI]链接程序:Microsoftlinker(11.00)编译器:VisualC#语言:C#库:.NET(v4.0.30319)签名工具:WindowsAuthenticode(2.0)[PKCS#7].NET混淆器:Confuser(1.X)附......
  • 使用try-with-resource 的情况下,resource 进入catch 块或者 finally 块之前,已经关闭了
    在Java中,使用try-with-resources的情况下,资源会在try块执行完毕后自动关闭。具体来说,无论是否发生异常,资源总是在控制流进入catch或finally块之前关闭。关键点:try-with-resources是在try语句中声明和管理实现了AutoCloseable接口的资源,例如InputStream、Output......
  • 使用apatch httpClient, 并且我用了try-with-resource, 我希望在catch 和 finally 中从
    在使用ApacheHttpClient时,如果你使用了try-with-resources语法并希望在catch或finally块中从response对象中读取完整的responseentity,你可能会遇到资源过早关闭的问题。这是因为try-with-resources会在try块结束后自动关闭资源,导致在catch或finally块中无法......
  • Ubuntu20.04安装LabelImg 以及出现(ModuleNotFoundError: No module named libs.resour
    安装Ubuntu系统安装labelImg:sudoaptinstallpyqt5-dev-tools接下来,通过GitHub下载LabelImg:gitclonehttps://github.com/tzutalin/labelImg.gitcdlabelimg-mastercdrequirements/sudopip3install-rrequirements-linux-python3.txt-ihttps://pypi.tuna.tsing......
  • @ImportResource用法
    用法@ImportResource注解用于导入Spring的配置文件,让某个配置文件中的bean生效;SpringBoot里没有Spring的配置文件,自己可以手动编写配置文件,但SpringBoot不能自动识别,此时需要在配置类中引入编写的配置文件注意:这个配置文件生效需要放在配置类上!!举个例子:测试SpringBoo......