天天看點

java:too many open files 解決辦法

文章目錄

    • 産生原因
    • 解決方法
    • 我遇到的問題

産生原因

Linux 中,檔案是一個位元組序列。這種簡單但強大的定義和它的實作使得系統中的所有東西都可以用檔案來表示。這裡提示的打開檔案過多,不僅僅是普通的檔案,也包括通訊連結socket,監聽端口。這個錯誤通常是句柄數超出系統限制。

引起的原因就是程序在某個時刻打開了超過系統限制的檔案數量以及通訊連結數。

  • 通過指令

    ulimit -a

    可以檢視目前系統設定的最大句柄數是多少:
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15065
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15065
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

           

open files那一行就代表系統目前允許單個程序打開的最大句柄數,這裡是1024。

  • 使用指令

    lsof -p 程序id

    可以檢視單個程序所有打開的檔案詳情,
$lsof -p 18260
COMMAND   PID USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
java    18260 root  cwd       DIR              253,0        95 51010140 /usr/local/www/auth-provider
java    18260 root  rtd       DIR              253,0       236       64 /
java    18260 root  txt       REG              253,0      8534 50882672 /usr/java/jdk1.8.0_191-amd64/jre/bin/java
java    18260 root  mem       REG              253,0    283312 17363896 /usr/java/jdk1.8.0_191-amd64/jre/lib/amd64/libsunec.so
java    18260 root  mem       REG              253,0     93944 17363886 /usr/java/jdk1.8.0_191-amd64/jre/lib/amd64/libnio.so
java    18260 root  mem       REG              253,0     68192    51221 /usr/lib64/libbz2.so.1.0.6
java    18260 root  mem       REG              253,0    157424    51208 /usr/lib64/liblzma.so.5.2.2
…	…	…	…	…	…	…	…

           
  • 使用指令

    lsof -p 程序id | wc -l

    可以統計程序打開了多少檔案
$ lsof -p 18260| wc -l
317
           

如果檔案數過多使用

lsof -p 程序id

指令無法完全檢視的話,可以使用

lsof -p 程序id > openfiles.log

将執行結果内容輸出到日志檔案中檢視。

解決方法

  • 增大允許打開的檔案數——指令方式
ulimit -n 2048
           

這樣就可以把目前使用者的最大允許打開檔案數量設定為2048了,但這種設定方法在重新開機後會還原為預設值。

ulimit -n指令

非root使用者隻能設定到4096。想要設定到更大需要sudo權限或者root使用者。

  • 增大允許打開的檔案數——修改系統配置檔案

修改配置檔案

/etc/security/limits.conf

在最後加入

* soft nofile 4096  
* hard nofile 4096  
           

或者隻加入

* - nofile 8192
           

最前的 * 表示所有使用者,可根據需要設定某一使用者,例如

roy soft nofile 8192  
roy hard nofile 8192  
           

注意”nofile”項有兩個可能的限制措施。就是項下的hard和soft。 要使修改過得最大打開檔案數生效,必須對這兩種限制進行設定。 如果使用”-“字元設定, 則hard和soft設定會同時被設定。

  • 檢查程式問題

如果你對你的程式有一定的解的話,應該對程式打開檔案數(連結數)上限有一定的估算,如果感覺數字異常,請使用第一步的lsof -p 程序id > openfiles.log指令,獲得目前占用句柄的全部詳情進行分析。

我遇到的問題

在分析 lsof 傳回的詳情中,發現socket資料一直增加,覺得是某個資源未釋放,導緻的。在http請求方面使用

hutool-v4.5.0版本

,此版本的http請求工具類有缺陷。更新至最新,即可解決。

部分内容摘自:https://blog.csdn.net/qq_18298439/article/details/83896777