????????以下是Linux句柄數過多問題的排查與解決方法整理:
一、檢測句柄使用情況
1?.查看系統限制?
單個進程限制:ulimit -n
系統級總限制:cat /proc/sys/fs/file-max
2?.統計進程占用量?
查看指定進程:lsof -p <PID> | wc -l
全局Top占用進程:
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10
通過輸出可快速定位句柄泄漏的進程。
二、常見問題原因
?1.資源未釋放?
????????程序未正確關閉文件、Socket連接或數據庫連接(如MySQL報錯Too many open files)
網絡接口調用量劇增導致句柄累積(尤其是HTTP長連接場景)
2?.配置限制過低?
????????ulimit -n設置的進程最大句柄數低于實際需求
三、解決方案
臨時調整
?????????提升進程限制
????????ulimit -n 65535 ?# 僅對當前會話有效
????????需注意普通用戶可能無法突破系統級硬限制
永久調整
-
?修改用戶級限制?
編輯/etc/security/limits.conf
,添加:
* soft nofile 65535
* hard nofile 65535
重啟后生效
?調整系統級總限制
????????修改/etc/sysctl.conf
,設置:
fs.file-max = 2097152
fs.nr_open = 2097152
程序優化
-
?排查資源泄漏?
結合lsof
輸出分析句柄類型(如頻繁出現CLOSE_WAIT
狀態的TCP連接)使用jstack
等工具檢查Java線程堆棧(若為Java程序) -
?監控工具? 定時統計句柄數變化:
watch -n 60 "lsof -p <PID> | wc -l"
繪制折線圖觀察增長趨勢,關聯接口調用量