1. 程式人生 > >解決Linux下“java.net.SocketException: Too many open files”異常

解決Linux下“java.net.SocketException: Too many open files”異常

背景:

專案上線後發現Telnet模組在穩定執行一段時間後會自動斷開,無法登陸,後臺丟擲:“java.net.SocketException: Too many open files”異常。

環境:
Java程式碼 複製程式碼 收藏程式碼
  1. Linux版本:cat /proc/version 
  2. Linux version 2.6.18-164.el5 (mockbuild@x86-003.build.bos.redhat.com) (gcc version 4.1.220080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 1815:51:48 EDT 2009
  3. Weblogic:10.3
  4. JDK:jrockit-jdk1.6
    .0_29-R28.2.2-4.1.0
Linux版本:cat /proc/version

Linux version 2.6.18-164.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 18 15:51:48 EDT 2009

Weblogic:10.3
JDK:jrockit-jdk1.6.0_29-R28.2.2-4.1.0


原因有以下兩個:

1、開啟的Socket客戶端並沒有正常關閉,此處可能是自動超時功能有問題或者網路突然斷開等。

2、Linux預設設定的檔案最大開啟數太小(預設值:1024,使用:ulimit -n 命令檢視)。

基於以上兩點,故從以下三個方面著手解決:1、作業系統Linux 2、應用伺服器Weblogic 3、程式

配置Linux檔案最大開啟數:


Java程式碼 複製程式碼 收藏程式碼
  1. /etc/security/limits.conf:在該檔案的最後加入,最大檔案開啟數: 
  2. * soft nofile 65535
  3. * hard nofile 65535
  4. /etc/pam.d/login:在該檔案的最後加入: 
  5. session required /lib/security/pam_limits.so 
  6. 重新登入後使用命令檢視:ulimit -n,是否和設定保持一致 
/etc/security/limits.conf:在該檔案的最後加入,最大檔案開啟數:

* soft nofile 65535
* hard nofile 65535

/etc/pam.d/login:在該檔案的最後加入:

session required /lib/security/pam_limits.so

重新登入後使用命令檢視:ulimit -n,是否和設定保持一致



3、修改Weblogic最大檔案控制代碼數:(重啟服務後生效)
Java程式碼 複製程式碼 收藏程式碼
  1. bea/wlserver_10.3/common/bin/commEnv.sh 
  2. # limit the number of open file descriptors 
  3. resetFd() { 
  4.   if [ ! -n "`uname -s |grep -i cygwin || uname -s |grep -i windows_nt || \ 
  5.        uname -s |grep -i HP-UX`" ] 
  6.   then 
  7.     ofiles=`ulimit -S -n` 
  8.     maxfiles=`ulimit -H -n` 
  9.     if [ "$?" = "0" -a  `expr ${maxfiles} : '[0-9][0-9]*$'` -eq 0 -a `expr ${ofiles} : '[0-9][0-9]*$'` -eq 0 ]; then    
  10.       ulimit -n 65535
  11.     fi 
  12.   fi 
bea/wlserver_10.3/common/bin/commEnv.sh

# limit the number of open file descriptors
resetFd() {
  if [ ! -n "`uname -s |grep -i cygwin || uname -s |grep -i windows_nt || \
       uname -s |grep -i HP-UX`" ]
  then
    ofiles=`ulimit -S -n`
    maxfiles=`ulimit -H -n`
    if [ "$?" = "0" -a  `expr ${maxfiles} : '[0-9][0-9]*$'` -eq 0 -a `expr ${ofiles} : '[0-9][0-9]*$'` -eq 0 ]; then   
      ulimit -n 65535
    fi
  fi
}


4、優化 Linux TCP 配置:
Java程式碼 複製程式碼 收藏程式碼
  1. /etc/sysctl.conf 
  2. # 2012-04-09 begin 
  3. ## 允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉; 
  4. net.ipv4.tcp_tw_reuse = 1
  5. ## 表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉; 
  6. net.ipv4.tcp_tw_recycle = 1
  7. ##  修改系統預設的 TIMEOUT 時間 
  8. net.ipv4.tcp_fin_timeout = 30
  9. ## 表示當keepalive起用的時候,TCP傳送keepalive訊息的頻度。預設是2小時 
  10. net.ipv4.tcp_keepalive_time = 1800
  11. ## TCP傳送keepalive探測以確定該連線已經斷開的次數 
  12. net.ipv4.tcp_keepalive_probes = 5
  13. ## 探測訊息傳送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連線殺除的時間。 
  14. net.ipv4.tcp_keepalive_intvl = 15
  15. ## 表示SYN佇列的長度,預設為1024,可以容納更多等待連線的網路連線數 
  16. net.ipv4.tcp_max_syn_backlog = 4096
  17. ## 最大檔案控制代碼數 
  18. fs.file-max=65535
  19. # 2012-04-09 end 
  20. # /sbin/sysctl -p 使上述配置生效命令 
/etc/sysctl.conf

# 2012-04-09 begin

## 允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1

## 表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1

##  修改系統預設的 TIMEOUT 時間
net.ipv4.tcp_fin_timeout = 30

## 表示當keepalive起用的時候,TCP傳送keepalive訊息的頻度。預設是2小時
net.ipv4.tcp_keepalive_time = 1800

## TCP傳送keepalive探測以確定該連線已經斷開的次數
net.ipv4.tcp_keepalive_probes = 5

## 探測訊息傳送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連線殺除的時間。
net.ipv4.tcp_keepalive_intvl = 15

## 表示SYN佇列的長度,預設為1024,可以容納更多等待連線的網路連線數
net.ipv4.tcp_max_syn_backlog = 4096

## 最大檔案控制代碼數
fs.file-max=65535

# 2012-04-09 end

# /sbin/sysctl -p 使上述配置生效命令



5、Java Socket程式中,增加如下配置:
Java程式碼 複製程式碼 收藏程式碼
  1. socket.setTcpNoDelay(true); // 關閉Nagle演算法, 立即發包
  2. socket.setKeepAlive(true); 
socket.setTcpNoDelay(true); // 關閉Nagle演算法, 立即發包
socket.setKeepAlive(true);


6、常用Linux命令:(個人備忘)
Java程式碼 複製程式碼 收藏程式碼
  1. 1、檢視程序:ps -ef|grep [java、tomcat、weblogic] 
  2. 2、檢視某埠TCP連線佔用數:netstat -pnt | grep :6666 |wc -l 
  3. 3、檢視某埠TCP連線佔用資訊:lsof -i :6666
  4. 4、檢視TCP連線狀態以及數量:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  5. 5、檢視所有程序佔用的檔案控制代碼數:lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more 
  6. 6、檢視某程序所屬服務:ps -aef|grep 24204
1、檢視程序:ps -ef|grep [java、tomcat、weblogic]
2、檢視某埠TCP連線佔用數:netstat -pnt | grep :6666 |wc -l
3、檢視某埠TCP連線佔用資訊:lsof -i :6666
4、檢視TCP連線狀態以及數量:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
5、檢視所有程序佔用的檔案控制代碼數:lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
6、檢視某程序所屬服務:ps -aef|grep 24204


9、優化結果
總共83把手持裝置,現在24小時作業每天的TCP連線數保持在:70左右。以前一到600多系統就宕機了。

相關推薦

解決Linuxjava.net.SocketException: Too many open files異常

背景:專案上線後發現Telnet模組在穩定執行一段時間後會自動斷開,無法登陸,後臺丟擲:“java.net.SocketException: Too many open files”異常。環境: Java程式碼 Linux版本:cat /proc/version

Linuxtomcat報錯“java.net.SocketException: Too many open files”--MINA2 錯誤解決

轉載: 因為這個問題,我也是經過三次修改後,才徹底解決該問題。我是遇到了錯誤資訊:“Too many open files”和“No buffer space availabel”,從我的專案上看,兩個問題都是因為使用MINA2時,有些資源沒有關閉造成的。但是出現“To

java.net.SocketException: Too many open files問題分析及解決方案

java web應用在執行一段時間之後出現了這麼個問題 java.net.SocketException: Too many open files at java.net.PlainSocketImpl.socketAccept(Native Method)

在liunx經常出現java.net.SocketException: Too many open files錯誤是什麼原因

釋出在Tomcat+linux伺服器上的專案經常報”java.net.SocketException: Too many open files"的錯誤,根據錯誤分析如下 : Linux 系統預設的open files的設定是1024 通過 ulimit -a進行檢視。 core file size     

java.net.SocketException: Too many open files 解決辦法

一早起來,發現伺服器掛了,檢視日子,發現報了一推java.net.SocketException: Too many open files異常。搜尋後才知道,是linux系統對程序開啟的檔案數量是有限制的。 用命令ul

java.net.SocketException: Too many open files

原因: 作業系統的中開啟檔案的最大控制代碼數受限所致,常常發生在很多個併發使用者訪問伺服器的時候。因為為了執行每個使用者的應用伺服器都要載入很多檔案(new 一個socket 就需要一個檔案控制代碼),這就會導致開啟檔案的控制代碼的缺乏。 解決方式: a) 儘量把類打成

【高併發】壓力測試 java.io.IOException: Too many open files解決方案

 對作業系統做相關的設定,增加最大檔案控制代碼數量。Linux在Linux核心2.4.x中需要修改原始碼,然後重新編譯核心才生效。編輯Linux核心原始碼中的 include/linux/fs.h檔案,將 NR_FILE 由8192改為65536,將NR_RESERVED_FILES 由10 改為 128。編

高並發連接導致打開文件過多:java.io.IOException: Too many open files 解決方法

限制 security 打開文件 soft api too limit com inf 用 CentOS 做 API 接口服務器供其他終端調用時,並發量高會報錯:java.io.IOException: Too many open files。 其原因是在 Linux 下

mina通訊,對於高併發的產生:java.io.IOException: Too many open files(開啟檔案控制代碼過多問題)

起因:由於業務系統有多個定時任務定時訪問銀行端,銀行每天也有大量業務訪問業務系統,都是通過mina通訊,部署在測試環境的系統每過一兩天開啟控制代碼過萬,生產的也是一週左右不重啟業務系統就會爆掉。一開始並不清楚到底是哪方面原因導致控制代碼增長這麼快,因為這是一個老系統,經過多次升級,大量的併發、多執行緒,所以只

java.io.FileNotFoundException (Too many open files)

今天kafka叢集報錯,檢視日誌提示 [2018-07-18 17:34:02,672] ERROR Error while rolling log segment for PREPROCESS in dir /mnt/sdc (kafka.server.LogDirFai

HTTP FAILED: java.net.SocketException: socket failed: EMFILE (Too many open files

場景: 在使用Retrofit進行大量請求時,出現異常 異常: HTTP FAILED: java.net.SocketException: socket failed: EMFILE (Too many open files)  解決方案: 在建立連結時,不要頻繁

too many open files linux服務器 golang java

add -m 使用 san awk margin 1.0 占用 sim 1. 現象服務的cpu跑滿(golang實現), 並大量報too many open files錯誤.服務使用systemd來運行,部署在阿裏ecs上.2.分析從日誌來看,cpu的上升主要為到達文件數限

linuxtomcat之too many open files

設置 inux roc spa ava linux 執行 java 使用命令 一、問題表象:   程序日誌報錯:java.io.IOException: Too many open files at 二、解決方案:   1、查看系統允許打開的最大文件數:     ca

解決linuxjava程式碼獲取不到本機ip地址

        今天在部署完預生產環境的時候發現一個問題,在linux下面java程式碼獲取本機ip地址獲取不到。但是我在測試環境上面是能夠獲取到的。先粘下獲取本機ip的程式碼: try{ Enumeration<NetworkInter

Linux解決tomcat出現Too many open files(開啟的檔案過多)問題

當用linux做高併發伺服器時,會遇到"Too many open files"的錯誤。Linux是有檔案控制代碼限制的(open files),而且Linux預設不是很高,一般都是1024,做高併發生產伺服器用其實很容易就達到這個數量。在linux中執行ulimit -a

使用javamail出現java.net.SocketException: Network is unreachable: connect異常 解決方法

在ssh中使用javamail自動傳送郵件,出現異常如下 javax.mail.MessagingException: Could not connect to SMTP host: xxx.xxx.xxx, port: 25; nested exception is:

測並發 Too many open files 問題的解決

ref get http sign pro light 程序 sched pen ulimit -a 查看限制顯示: core file size (blocks, -c) 0 data seg size (kbytes, -d) u

Linux server上too many open files問題

server bsp one 當前 java程序 clas gre work -h 之前測試遇到了"too many open files"的問題。ulimit -Hn 查了下發現server上最大open file數是4096。寫了個簡單的腳本檢測發現進程創建的fd個數在

解決tomcat too many open files問題

限制 spa 8.0 .com nofile tom files 環境 內容 運行環境為 centos7.2 tomcat 為 tomcat 8.0.39.0 ulimit -a ulimit -n 解決的都是 系統的問題 tomcat 報too many

Linux允許打開最大文件句柄數的參數調優-"too many open files"問題

方式 描述 pip lsof 允許 出現 有效 stack awk 都知道Linux系統的特性,一切皆文件,所有在運行zabbix這樣的服務時,其中重要的一個調優就是調整linux系統的最大文件句柄數,解決“too many open files”的問題,增大程序運行允許打