linux 环境服务发生文件句柄泄漏导致服务不可用

问题描述:

        服务调用远程rest接口 报错,发生too many open files 异常,系统句柄资源耗尽,导致服务不可用。

  

排查经过:

        1、针对报错代码进行本地构建,构造异常,并进行压测。问题未复现

        2、经过讨论分析,问题发生根因为:句柄资源耗尽,那么必然存在进程持续消耗句柄资源,且不进行释放。

        3、因此,开始排查服务进程句柄信息 

# 统计进程句柄总数
lsof -p <PID> | wc -l 
# 统计进程目录句柄总数  若持续增加则存在泄漏
lsof -p <PID> | grep DIR  
# 统计进程delete文件删除句柄总数  若持续增加则存在泄漏
lsof -p <PID> | grep delete

 通过统计观察各个进程的句柄总数,分析查找到问题根源

原因最终确认:

问题代码:loadDirectory函数加载指定目录下所有文件,并返回Path列表。Files.list函数为安全关闭文件句柄,导致该方法频繁调用时未释放目录句柄资源。导致系统句柄资源耗尽

    public static List<Path> loadDirectory(String fileDirectory) {try {final Path pathDirectory = Path.of(fileDirectory);if (Files.isDirectory(pathDirectory)) {return Files.list(pathDirectory).collect(Collectors.toList());} else {throw new NotDirectoryException(fileDirectory);}} catch (IOException e) {log.error("file write error:", e);}return new ArrayList<>(0);}

问题修复 :使用try-resource-with 方式主动关闭资源

public static List<Path> loadDirectory(String fileDirectory) throws CheckingException {try (Stream<Path> stream = Files.list(Paths.get(fileDirectory))) {return stream.collect(Collectors.toList());} catch (IOException e) {log.error("fileDirectory is not directory:", e);throw new CheckingException("can not load directory:" + fileDirectory);}}

问题复盘:创建系统句柄监控,进程句柄如果超过300,则进行告警,超过1000,则提示高危进程

#!/bin/bash
# 高效进程句柄监控脚本 v2.0
THRESHOLD=300       # 单个进程句柄阈值
HIGH_THRESHOLD=2000  # 高危进程阈值
INTERVAL=20          # 监控间隔(秒)
LOG_DIR="logs"
LOG_FILE="${LOG_DIR}/handle_monitor_$(date +%Y%m%d).log"
MAX_LOG_DAYS=30      # 日志保留天数# 创建日志目录
mkdir -p ${LOG_DIR}# 清理旧日志
find ${LOG_DIR} -name "handle_monitor_*.log" -mtime +${MAX_LOG_DAYS} -delete# 日志函数
log() {echo "$(date "+%Y-%m-%d %H:%M:%S") $1" >> ${LOG_FILE}
}# 获取进程FD数量的高效方法
get_fd_count() {local pid=$1if [ -d /proc/$pid/fd ]; thenecho $(ls -1 /proc/$pid/fd 2>/dev/null | wc -l)elseecho 0fi
}# 主监控循环
while true; dolog "===== 开始监控 ====="total_warning=0# 高效获取所有PIDpids=$(find /proc -maxdepth 1 -type d -name '[0-9]*' -printf "%f\n" 2>/dev/null)# 遍历PIDfor pid in $pids; dofd_count=$(get_fd_count $pid)if [[ $fd_count -ge $THRESHOLD ]]; thenproc_name=$(ps -p $pid -o comm= 2>/dev/null || echo "未知进程")log "警告: PID $pid ($proc_name) - $fd_count 个文件描述符"((total_warning++))# 高危进程详细记录if [[ $fd_count -ge $HIGH_THRESHOLD ]]; thenlog "高危进程详情:"lsof -p $pid +c 0 2>/dev/null | head -50 >> ${LOG_FILE}log "(仅显示前50个FD,完整列表请单独检查)"fifidone# 系统级统计sys_stats=$(cat /proc/sys/fs/file-nr 2>/dev/null)log "系统FD统计: ${sys_stats:-无法获取}"log "警告进程总数: $total_warning"log "===== 监控结束 ====="sleep $INTERVAL
done

       使用说明

使用说明:
  1. 保存为 fd_monitor.sh
  2. 赋予执行权限:chmod +x fd_monitor.sh
  3. 后台运行:nohup ./fd_monitor.sh &
  4. 查看日志:tail -f logs/handle_monitor_xxx.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92316.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92316.shtml

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

相关文章

手机录制视频时,硬编码和软编码哪个质量高?(硬件编码、软件编码)

文章目录**1. 画质对比**- **软编码**&#xff1a;- **硬编码**&#xff1a;**2. 性能与功耗**- **软编码**&#xff1a;- **硬编码**&#xff1a;**3. 实际应用中的权衡****4. 现代手机的折中方案****5. 如何选择&#xff1f;****总结**在手机录制视频时&#xff0c; 软编码的…

IPv4与IPv6双栈协议:网络过渡的关键技术

为什么需要IPv4与IPv6共存&#xff1f; 在网络技术的世界中&#xff0c;兼容性问题始终是最大的挑战之一。IPv4和IPv6之间存在根本性的不兼容性&#xff0c;这意味着使用不同协议的设备无法直接通信。这种情况就像是两个人试图用完全不同的语言进行对话一样。 目前的网络现状…

【牛客刷题】数字变换

一、题目描述 给出两个数字a,ba,ba,b,aaa每次可以乘上一个大于1的正整数得到新的aa

MySQL 学习一 存储结构和log

1.InnoDB逻辑存储结构 表空间->段->区->页->行->数据表空间&#xff1a;覆盖了所有的数据和索引&#xff0c;系统表在系统表空间&#xff0c;还有默认表空间等 段&#xff1a;多个段组成表空间 区&#xff1a;多个区组成段&#xff0c;一般每个区的大小通常是1M…

TCP day39

六&#xff1a;C/S和B/S端 C/S&#xff1a;Client, server B/S&#xff1a;Browser server 1.cs 专用客户端 bs 通用客户端 2.协议不同 Cs 标准协议&#xff0c;自定义协议 Bs http 超文本传输 3.cs 功能复杂 bs 功能弱 4.bs 资源都在ser&#xff0c;有ser发送到cli cs 大部分资…

6 种无线传输照片从安卓到 Mac 的方法

将大量照片从安卓设备传输到电脑上&#xff0c;不仅可以备份照片&#xff0c;还能释放设备存储空间。虽然使用 USB 数据线可以在 Windows 电脑上轻松完成传输&#xff0c;但将安卓手机连接到 Mac 并非如此简单。因此&#xff0c;许多用户更倾向于无线传输照片从安卓到 Mac。您可…

在vscode 使用 remote-ssh

vscode安装插件Remote-SSH,直接安装即可 安装完毕之后 在左下角有这个图标 点击之后选择连接到主机然后选择添加新链接之后输入用户名和主机地址 非默认端口使用 -p 端口号之后选择第一个即可如果使用的是密码,直接连接,然后输入密码即可如果使用的密钥,则修改.ssh\config文件中…

RabbitMQ03——面试题

目录 一、mq的作用和使用场景 二、mq的优点 2.1架构设计优势 2.2功能特性优势 2.3性能与可靠性优势 2.4生态系统优势 2.5对比优势 三、mq的缺点 3.1性能与扩展性限制 3.2功能局限性 3.3运维复杂度 3.4与其他消息队列的对比劣势 四、mq相关产品&#xff0c;每种产品…

应用层攻防启示录:HTTP/HTTPS攻击的精准拦截之道

一、七层攻击的复杂性 # CC攻击模拟工具&#xff08;Python实现&#xff09; import requests import threadingtarget_url "https://example.com/search?q"def cc_attack():while True:# 构造恶意搜索请求malicious_query "0" * 1000 # 长查询参数try…

.net 警告【代码 CS1998】此异步方法缺少 “await“ 运算符,将以同步方式运行。

【代码 CS1998】此异步方法缺少 “await” 运算符&#xff0c;将以同步方式运行。请考虑使用 “await” 运算符等待非阻止的 API 调用&#xff0c;或者使用 “await Task.Run(…)” 在后台线程上执行占用大量 CPU 的工作。在 VS 2022 中遇到的 CS1998 编译器警告&#xff0c;表…

【自动驾驶黑科技】基于Frenet坐标系的车道变换轨迹规划系统实现(附完整代码)

1. 代码结构概览该代码实现了一个车道变换轨迹规划系统&#xff0c;包含两个核心模块&#xff1a;道路建模&#xff08;EnhancedRoadModel&#xff09;&#xff1a;基于样条曲线构建道路模型。轨迹规划&#xff08;LaneChangePlanner&#xff09;&#xff1a;根据障碍物状态和道…

uni-calendar自定义签到打卡颜色

uni-calendar自定义签到打卡颜色&#xff0c;只需要将打卡的状态添加到动态类class中即可 效果&#xff1a;在uni-modules >>> components >>> uni-calendar >>> uni-calendar-item.vue文件中&#xff0c;根据info对应的文字或者符号添加不同的clas…

浙江大学PTA程序设计C语言基础编程练习题1-5

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a;开篇说明题目一、厘米换算英寸题目二、然后是几点题目三、 逆序…

catkin build的config设置指南[设置多种make模式或策略]

在本篇文章中&#xff0c;我们来尽可能详细地深入探讨 catkin config 的使用方法。这是掌握 catkin_tools 工作流的关键&#xff0c;能极大地提升你的开发效率和项目的规范性。 catkin config 的核心思想 首先&#xff0c;要理解它的核心思想&#xff1a;为你的 Catkin 工作空间…

Ubuntu挂载和取消挂载

在 Ubuntu 中&#xff0c;挂载&#xff08;Mount&#xff09;和取消挂载&#xff08;Unmount&#xff09;是管理存储设备&#xff08;如硬盘、U盘、ISO镜像等&#xff09;的常见操作。以下是详细指南&#xff1a;1. 挂载&#xff08;Mount&#xff09; 1.1 查看可用存储设备 ls…

Vue开发常用库(含npm安装命令)

Vue开发常用库&#xff08;含npm安装命令&#xff09; 核心生态系统&#xff1a;Vue Router - 官方路由管理器 npm install vue-router4 # Vue 3 npm install vue-router3 # Vue 2Pinia - 新一代状态管理库 npm install piniaVuex - 传统状态管理库 npm install vuexnext …

[硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?

激光光路、模拟电路、数字电路及软件中的信号处理在操作、运算和变换层面存在显著共性&#xff0c;这些共性体现了信号处理的核心逻辑在不同技术领域的通用性。以下是具体分析&#xff1a; 目录 一、共通操作&#xff1a;信号处理的基础动作 1、放大与衰减 2、滤波 3、调制…

Grails(Groovy)框架抛出NoHandlerFoundException而不是返回404 Not Found

本文记录在基于Spring(Boot)框架&#xff08;使用Java语言&#xff09;和Grails框架&#xff08;使用Groovy语言&#xff09;下&#xff0c;开发Controller接口&#xff0c;对不存在的URL请求&#xff0c;接口返回404 not found&#xff0c;而不是抛出NoHandlerFoundException异…

muduo中事件循环线程池的理解

事件循环线程池的理解前置知识reactor模型thread::start()方法的理解创建线程池子线程被唤醒的几种情况子线程被主线程唤醒新连接到来有消息需要发送时&#xff08;多reactor情况时&#xff09;关闭连接时子线程被唤醒执行任务在 上一篇中&#xff0c;我们讨论了关于简单的线程…

AI智能体“上下文工程”实践:来自 Manus 项目的经验总结

转载&#xff1a;https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus 在启动 Manus (manus.im/app) 项目之初&#xff0c;我的团队面临一个关键抉择&#xff1a;究竟是基于开源基础模型训练一个端到端的智能体模型&#xff0c;还是在前沿大…