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

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

重启服务器

  • 重启后,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.mzph.cn/news/122354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP 同城服务共享茶室软硬件结合小程序开发的注意事项?

在现在共享经济的兴起时代&#xff0c;同城服务共享茶室作为一种新型的商业模式&#xff0c;越来越受到人们的关注。为了提高用户体验和服务质量&#xff0c;开发一款基于PHP的同城服务共享茶室软硬件结合的小程序成为了必要的选择。本文将详细介绍在开发过程中需要注意的事项。…

鸡尾酒学习——环游世界

1、材料&#xff1a;白朗姆、龙舌兰、威士忌、金酒、伏特加、蓝橙力娇酒、柠檬汁、红石榴糖浆、橙汁、冰块&#xff1b; 2、口感&#xff1a;酸苦涩口味&#xff0c;下层感觉是在喝橙汁&#xff0c;上层在喝酒&#xff0c;适合喜欢喝橙汁以及酒的人&#xff0c;恰巧我不喜欢这两…

Android WMS——ViewRootImpl分析(六)

一、简介 ViewRootImpl是View中的最高层级,属于所有View的根(但ViewRootImpl不是View,只是实现了ViewParent接口),维护了整个视图结构,并作为输入事件的分发器和绘图管道的输入端点,承担着输入事件分发、窗口管理、视图绘制和系统事件响应等关键角色。对于Android应用程…

机器学习(五)如何理解机器学习三要素

1.8如何理解机器学习三要素 统计学习模型策略算法 模型&#xff1a;规律yaxb 策略&#xff1a;什么样的模型是好的模型&#xff1f;损失函数 算法&#xff1a;如何高效找到最优参数&#xff0c;模型中的参数a和b 1.8.1模型 机器学习中&#xff0c;首先要考虑学习什么样的…

锐捷EG易网关 phpinfo.view.php 信息泄露

致未经身份验证获取敏感信息 访问漏洞url&#xff1a; /tool/view/phpinfo.view.php漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何…

GZ035 5G组网与运维赛题第3套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

利用 JSqlParser 防止 SQL 注入

高手文章《jsqlparser:实现基于SQL语法分析的SQL注入攻击检查》介绍了利用 JSqlParser 防止 SQL 注入&#xff0c;写得很好&#xff0c;只不过有两个问题&#xff0c;代码比较复杂&#xff0c;我于是作了简化&#xff0c;只有两个类&#xff1b;其次检测比较严格&#xff0c;连…

前端 :用HTML ,JS写一个 双色球彩票中将机制,因为时间不够,加上本人懒没有用CSS美化界面,多包涵

1.HTML <body><div id"content"><div id "top"><div id "username">用户号码&#xff1a;</div><div id "qiu"><span id "red">红球&#xff1a;</span><input id…

面试准备中........

一、Linux 计算机网络相关&#xff1a; 1.OSI七层模型 应用层 &#xff1a;给用户提供操作界面 表示层&#xff1a;数据的表示&#xff1a;将字符转化为2进制或将2进制转化为字符。加密&#xff1a;对称加密和非对称加密&#xff0c;ssh协议。压缩&#xff1a;将文件压缩。…

JAVASE--继承

在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它允许一个类继承另一个类的特征和行为。在实现继承时&#xff0c;可以使用以下步骤&#xff1a; 1. 创建一个新的子类&#xff0c;它将继承父类的特征和行为。2. 在子类的定义中使用关键字“extends”来指定它的…

EtherNet/IP转profienrt协议网关连接EtherNet/IP协议的川崎机器人配置方法

EthernetIP 协议一般用于采集机器人&#xff0c;控制器等设备的数据。 下面介绍通过远创智控YC-EIPM-PN网关把EtherNet/IP协议的川崎机器人通过西门子1500PLC的控制方法。有些 EIP 的从站设备提供了 EDS 文件&#xff0c;可以从EDS 文件中获取点位信息。这些信息是需要填写到网…

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM差…

高等数学前置知识——二次函数

文章目录 二次函数1.1 二次函数1.2 二次函数的图像1.2.1 a > 0 时1.2.2 a < 0 时1.2.3 二次函数的平移1.2.4 普通二次型函数图像总结 1.3 其他形式的二次函数1.3.1 顶点式1.3.2 交点式 1.4 二次函数与直线的交点 二次函数 1.1 二次函数 二次函数的定义&#xff1a;y a…

bbr 的 “最优操作点”

最近做一组测试&#xff0c;我复现了一组结果准备阐释另一个事。先看这个测试结果&#xff1a; 常规的一个 wrk2(expected_latency_timing 改为 actual_latency_timing 计数) 压 nginx 的测试&#xff0c;调整 -R 参数&#xff0c;Req/sec 同步增加&#xff0c;当 Req/sec 不…

在el-dialog中使用tinymce 点击工具栏下拉框被遮挡

在el-dialog中使用tinymce控件时&#xff0c;会出现点击工具栏下拉框出现在弹窗下一层&#xff0c;审查元素之后发现是tinymce的下拉框z-index优先级低于el-dialog的z-index导致的&#xff0c;所以需要增加tinymce的下拉框的z-index值。 通过审查元素得到&#xff0c;需要修改t…

数据结构与算法之LRU: 实现 LRU 缓存算法功能 (Javascript版)

关于LRU缓存 LRU - Lease Recently Used 最近使用 如果内存优先&#xff0c;只缓存最近使用的&#xff0c;删除 ‘沉睡’ 数据 核心 api: get set 分析 使用哈希表来实现, O(1)必须是有序的&#xff0c;常用放在前面&#xff0c;沉睡放在后面, 即&#xff1a;有序&#xff0…

nodejs+vue全国公考岗位及报考人数分析

传统的搜索引擎尽管解决了信息搜索问题&#xff0c;但无法进行有效的数据分析和优质资源的获取。并且&#xff0c;人们的需求不同&#xff0c;数据的要求也不同。为了解决这一问题&#xff0c;定向抓取数据的爬虫诞生了。它的诞生把人们从重复性的劳动中解放出来&#xff0c;节…

scratch绘制彩虹灯柱 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch绘制彩虹灯柱 一、题目要求 1、准备工作 2、功能实现 二、案例分析

use renv with this project create a git repository

目录 1-create a git repository 2-Use renv with this project 今天在使用Rstudio过程中&#xff0c;发现有下面两个新选项&#xff08;1&#xff09;create a git repository (2) Use renv with this project. 选中这两个选项后&#xff0c;创建新项目&#xff0c;在项目目…

在DOS或Windows环境中,使用工具Debug

进行调试&#xff08;debugging&#xff09;汇编代码需要使用汇编调试器。在DOS或Windows环境中&#xff0c;你可以使用工具如Turbo Debugger或Debug。下面是一般的步骤来在DOS/Windows下使用Debug工具调试汇编代码&#xff1a; 打开命令提示符&#xff08;Command Prompt&…