介紹
在Linux下有時會遇到Socket/File : Can't open so many files的問題。其實Linux是有檔案句柄限制的,而且Linux預設一般都是1024(阿裡雲主機預設是65535)。在生産環境中很容易到達這個值,是以這裡就會成為系統的瓶頸。
今天早上tomcat應用就報了上述錯誤:
1.檢視方法
使用ulimit -a 或者 ulimit -n
open files (-n) 1024 是linux作業系統對一個程序打開的檔案句柄數量的限制(也包含打開的套接字數量)
這裡隻是對使用者級别的限制,其實還有個是對系統的總限制,檢視系統總線制:
# cat /proc/sys/fs/file-max
man proc,可得到file-max的描述:
/proc/sys/fs/file-max
This file defines a system-wide limit on the number of open files for all processes. (See
also setrlimit(2), which can be used by a process to set the per-process limit,
RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages
about running out of file handles, try increasing this value:
即file-max是設定系統所有程序一共可以打開的檔案數量 。同時一些程式可以通過setrlimit調用,設定每個程序的限制。如果得到大量使用完檔案句柄的錯誤資訊,是應該增加這個值。
也就是說,這項參數是系統級别的。
2.修改方法
臨時生效:
# ulimit -SHn 10000
其實ulimit 指令身是分軟限制和硬限制,加-H就是硬限制,加-S就是軟限制。預設顯示的是軟限制,如果運作ulimit 指令修改時沒有加上-H或-S,就是兩個參數一起改變。
軟限制和硬限制的差別?
硬限制就是實際的限制,而軟限制是警告限制,它隻會給出警告。
永久生效
要想ulimits 的數值永久生效,必須修改配置檔案/etc/security/limits.conf
在該配置檔案中添加
* soft nofile 65535
* hard nofile 65535
* 表示所用的使用者,或者執行以下指令:
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
修改系統總限制
其實上的修改都是對一個程序打開的檔案句柄數量的限制,我們還需要設定系統的總限制才可以。
假如,我們設定程序打開的檔案句柄數是1024 ,但是系統總線制才500,是以所有程序最多能打開檔案句柄數量500。從這裡我們可以看出隻設定程序的打開檔案句柄的數量是不行的。是以需要修改系統的總限制才可以。
echo 6553560 > /proc/sys/fs/file-max
上面是臨時生效方法,重新開機機器後會失效;
永久生效方法:
修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重新開機生效
檢視應用程序打開的檔案句柄數量方法:
[root@pcidata-svr1 ~]# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
統計單個程序打開的檔案句柄數
[root@pcidata-svr1 ~]# lsof -p 1779|wc -l
通過PID再檢視相應的程序
[root@pcidata-svr1 ~]# ps aux|grep 1779
如對您有幫助,支援下呗!
微信
支付寶