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
英文地址,請注明出處:http://en.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;還是在前沿大…