记一次线程爆满导致服务器崩溃的问题排查

2023-10-29 05:36

本文主要是介绍记一次线程爆满导致服务器崩溃的问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记一次线程爆满导致服务器崩溃的问题排查

重启服务器

  • 重启后,ssh连接发现下面问题

  • fork faild:Cannot allocate memory

  • 在这里插入图片描述

  • 以为是内存满了

  • 于是,free -h,查看内存情况,还有,观察一段时间后,内存没多大变化

  • 在这里插入图片描述

修改最大线程数

  • 经过各种百度,都说可以通过修改服务器的最大线程数来解决,于是我也这么干了。当时做的时候没有截图,所以下面截图是网上找的,凑合看看。

  • 查看最大进程数 sysctl kernel.pid_max

  • 在这里插入图片描述

  • ps -eLf | wc -l查看 进 程数

  • 修改最大 进 程数后系统恢复

  • echo 1000000 > /proc/sys/kernel/pid_max
    
  • 永久生效

  • echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf
    sysctl -p
    

查找线程最大的java程序

  • 上一步扩大了线程数量后,感觉有点不对,因为之前没有这么配置都可以正常运行,为什么突然服务器挂了呢?肯定是有程序在作怪。
    于是决定找出占用线程最多的程序。回顾最近几天,服务器中只部署了几个springboot程序。问题一定出在它们之中。

  • 查看线程数量前20的java程序

  • ps -Lef |awk ‘{sum[$2]++}END{for(pid in sum) print pid, sum[pid]}’|sort -nr -k 2|head -n 20
    
  • [root@se-test-lky01 ~]# ps -Lef |awk '{sum[$2]++}END{for(pid in sum) print pid, sum[pid]}'|sort -nr -k 2|head -n 20
    16074 3100
    31386 1226
    20120 1072
    19548 985
    9697 829
    3005 796
    641 344
    19016 324
    16924 315
    17870 300
    6417 293
    8351 171
    7332 168
    18259 167
    19821 161
    16311 157
    18433 151
    18048 136
    14347 104
    2559 100
    
  • 观察一段时间后,发现进程id为16074的java程序的线程数不断增长。

导出问题程序的线程日志

  • [root@se-test-lky01 ~]#jstack 16074 >thread_dump.log
    
  • 分析日志,发现下面情况,线程数量不断增加,代码位置在FtpMonitorProcess.java:85

  • "Thread-4655" #4774 prio=5 os_prio=0 tid=0x00007f84aa2fe000 nid=0xd408b waiting for monitor entry [0x00007f802b704000]java.lang.Thread.State: BLOCKED (on object monitor)at cn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)- waiting to lock <0x00000006c09c1888> (a java.lang.Class for cn.cloudwalk.bat.util.http.FtpUtil)at cn.cloudwalk.bat.schedule.ftp.process.FtpMonitorProcess$1.run(FtpMonitorProcess.java:85)at java.lang.Thread.run(Thread.java:748)"Thread-4654" #4773 prio=5 os_prio=0 tid=0x00007f84aa2fc000 nid=0xd408a waiting for monitor entry [0x00007f802b805000]java.lang.Thread.State: BLOCKED (on object monitor)at cn.cloudwalk.bat.util.http.FtpUtil.connect(FtpUtil.java:246)- waiting to lock <0x00000006c09c1888> (a java.lang.Class for cn.cloudwalk.bat.util.http.FtpUtil)at cn.cloudwalk.bat.schedule.ftp.process.FtpMonitorProcess$2.run(FtpMonitorProcess.java:114)
    at java.lang.Thread.run(Thread.java:748)
    

找到问题代码

  • 发现这个方法每次被调用就会创建一个新的线程。而这个方法是被定时任务调用的,每10秒调用一次。

  • 问题就出在ftp没有配置,所以线程内执行ftp操作时,线程阻塞,没能释放。若ftp可用,则不会出现线程阻塞问题。

  • 这就是问题根源。

  • 	private void listDeviceFiles() {new Thread(new Runnable() {@Overridepublic void run() {logger.debug("开始获取[ftp-设备]文件...");try {String workDir = ftpConfig.getWorkdir();// 连接FTPClient ftpClient = FtpUtil.connect(ftpConfig);ftpClient.changeWorkingDirectory(workDir);ftpClient.changeWorkingDirectory(SubscribeDataTypeEnum.DEVICE_INFO.getKey().toString());FTPFile[] files = ftpClient.listFiles();for(FTPFile file : files) {decomposeFile(file,ftpClient);}ftpClient.logout();} catch (Exception e) {logger.error("ftp获取文件名出错:" + e.getMessage());}}}).start();}
    

解决方案

  • 不建议手动创建线程,改用使用线程池。

这篇关于记一次线程爆满导致服务器崩溃的问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298580

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La