服務器異常java.io.IOException: Too many open files(系統最大文件打開數限制)

來源:本站原創 Linux 超過463 views圍觀 0條評論

 

最終方案還是得從程序端解決

 

以下是臨時解決方案

 

后臺服務器(Linux) 在轉音源的時候 報java.io.IOException: Too many open files
在網上查了一些資料 記錄如下:
打開的文件過多,一般來說是由于應用程序對資源使用不當造成,比如沒有及時關閉Socket或數據庫連接等。但也可能應用確實需要打開比較多的文件句柄,而系統本身的設置限制了這一數量。

異常 1
Java.NET.SocketException: Too many open files

    at java.net.PlainSocketImpl.accept(Compiled Code) 
    at java.Net.ServerSocket.implAccept(Compiled Code) 
    at java.net.ServerSocket.accept(Compiled Code) 
    at weblogic.t3.srvr.ListenThread.run(Compiled Code)

異常 2
java.io.IOException:打開的文件過多

    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.(UNIXProcess.java:54)
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.(UNIXProcess.java:54)
    at java.lang.Runtime.execInternal(Native Method)
    at java.lang.Runtime.exec(Runtime.java:551)
    at java.lang.Runtime.exec(Runtime.java:477)
    at java.lang.Runtime.exec(Runtime.java:443)

第一個異常在錯誤影響到基礎 TCP 協議時拋出,而第二個異常則在錯誤影響到 I/O 操作時拋出。

文件打開數過多最壞的情況可以使系統崩潰,到時候只能是重起服務器了。

原因:

操作系統的中打開文件的最大句柄數受限所致,常常發生在很多個并發用戶訪問服務器的時候.因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏.

解決:

  • 盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄.
  • java的垃圾回收不能關閉網絡連接打開的文件句柄,如果沒有執行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關閉.你也可以考慮設置socket的最大打開數來控制這個問題.
  • 對操作系統做相關的設置,增加最大文件句柄數量。
    1. Linux
      在 Linux內核2.4.x中需要修改源代碼,然后重新編譯內核才生效。編輯Linux內核源代碼中的 include/linux/fs.h文件,將 NR_FILE 由8192改為65536,將NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 文件將MAX_INODE 由16384改為262144。或者編輯 /etc/sysctl.conf  文件增加兩行 fs.file-max = 65536 和 fs.inode-max = 262144 。一般情況下,系統最大打開文件數比較合理的設置為每4M物理內存256,比如256M.可以用lsof -p <pid of process>看打開的文件句柄數.
    2. Windows
      最大文件句柄是16,384,你在任務管理器的性能這一項中可以看到當前打開的句柄數.

服務器端修改:

查看系統允許打開的最大文件數

#cat /proc/sys/fs/file-max

查看每個用戶允許打開的最大文件數

ulimit -a

發現系統默認的是open files (-n) 1024,問題就出現在這里。

在系統文件/etc/security/limits.conf中修改這個數量限制,

在文件中加入內容:

* soft nofile 65536 
* hard nofile 65536

注意: 怎么樣才能生效,不需要重啟服務器

1. 用戶環境  退出再進入就生效

2.進程   重啟即先效

例:

cat /proc/117190/limits |grep open
Max open files            55555                55555                files     原來是4096現在是55555.重啟服務即可

另外方法:
1.使用ps -ef |grep java   (java代表你程序,查看你程序進程) 查看你的進程ID,記錄ID號,假設進程ID為12
2.使用:lsof -p 12 | wc -l    查看當前進程id為12的 文件操作狀況
    執行該命令出現文件使用情況為 1052
3.使用命令:ulimit -a   查看每個用戶允許打開的最大文件數
    發現系統默認的是open files (-n) 1024,問題就出現在這里。
4.然后執行:ulimit -n 4096

     將open files (-n) 1024 設置成open files (-n) 4096

這樣就增大了用戶允許打開的最大文件數

 

 

==============增加詳解

 

soft nproc: 可打開的文件描述符的最大數(軟限制)

hard nproc: 可打開的文件描述符的最大數(硬限制)

soft nofile:單個用戶可用的最大進程數量(軟限制)

hard nofile:單個用戶可用的最大進程數量(硬限制)

*             代表針對所有用戶
noproc     是代表最大進程數
nofile     是代表最大文件打開數

cat >>/etc/security/limits.conf<<eof
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
eof

type:有 soft,hard 和 -,soft 指的是當前系統生效的設置值。hard 表明系統中所能設定的最大值。soft 的限制不能比har 限制高。用 – 就表明同時設置了 soft 和 hard 的值。
resource:
core – 限制內核文件的大小
date – 最大數據大小
fsize – 最大文件大小
memlock – 最大鎖定內存地址空間
nofile – 打開文件的最大數目
rss – 最大持久設置大小
stack – 最大棧大小
cpu – 以分鐘為單位的最多 CPU 時間
noproc – 進程的最大數目
as – 地址空間限制
maxlogins – 此用戶允許登錄的最大數目

 

#=============新增

—- 查看Linux系統所有進程情況

  1. # top

—- 查看Linux系統某個應用的進程PID

  1. # ps aux| grep mysql

—- 查看Linux系統某個進程打開的文件句柄數量

  1. # lsof -n | grep 5950 -c
  2. 212

—- 查看Linux系統所有進程以及各進程打開的文件句柄數量

  1. # lsof -n|awk ‘{print $2}’|sort|uniq -c|sort -nr
  2. 212  131133

      第一列是打開的句柄數,第二列是進程號

 

#========新增

too many open files(打開的文件過多)是Linux系統中常見的錯誤,從字面意思上看就是說程序打開的文件數過多,不過這里的files不單是文件的意思,也包括打開的通訊鏈接(比如socket),正在監聽的端口等等,所以有時候也可以叫做句柄(handle),這個錯誤通常也可以叫做句柄數超出系統限制。

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=4003轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏