一、簡介
在Linux下有時會遇到Socket/File : Can't open so many files的問題。其實Linux是有文件句柄限制的,而且Linux默認一般都是1024(阿里雲主機默認是65535)。在生產環境中很容易到達這個值,因此這里就會成為系統的瓶頸。
二、查看方法
1)查看當前系統最大打開數詳細信息ulimit -a
[root@localhost ~]# 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) 63405 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65535 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) 63405
virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
open files (-n)65535是linux操作系統對一個進程打開的文件句柄數量的限制(也包含打開的套接字數量)這里只是對用戶級別的限制,還有是對系統的總限制(下面介紹)。
2)只查看當前系統最大文件打開數ulimit -n
[root@localhost ~]# ulimit -n 65535
3)查看當前進程的打開文件數和最大文件數
比如我們 查看tomcat的打開文件數和最大文件數,先查詢出tomcat的進程號,然后在通過進程號查詢進程打開文件數
[root@VM_0_10_centos ~]# ps -ef | grep tomcat | grep -v "grep" | awk '{print $2}'
21820 [root@VM_0_10_centos ~]# ls /proc/21820/fd | wc -l 70 [root@VM_0_10_centos ~]# cat /proc/21820/limits | grep open Max open files 100002 100002 files
4)查看系統總限制
[root@VM_0_10_centos ~]# cat /proc/sys/fs/file-max 183930
即file-max是設置系統所有進程一共可以打開的文件數量 。同時一些程序可以通過setrlimit調用,設置每個進程的限制。如果得到大量使用完文件句柄的錯誤信息,是應該增加這個值。該項參數是系統級別的。
三、修改方法
1.臨時生效
[root@VM_0_10_centos ~]# ulimit -SHn 65535
ulimit分為軟限制和硬限制。-H代表硬限制,-S代表軟限制。默認是軟限制,如果運行ulimit 命令修改時沒有加上-H或-S,則兩個參數一起改變。
硬限制就是實際的限制,而軟限制是警告限制,它只會給出警告。
2.永久生效
永久生效,需要修改配置文件/etc/security/limits.conf ,在配置文件中加入如下兩行
echo "* soft nofile 65535" >> /etc/security/limits.conf echo "* hard nofile 65535" >> /etc/security/limits.conf
* 代表所有用戶
3.修改系統總限制
如我們設置進程打開的文件句柄數是1024 ,但是系統總線制才500,所以所有進程最多能打開文件句柄數量500。從這里我們可以看出只設置進程的打開文件句柄的數量是不行的。所以需要修改系統的總限制才可以。
1)臨時生效
echo 6553560 > /proc/sys/fs/file-max
2)永久生效
修改 /etc/sysctl.conf, 加入 fs.file-max = 6553560 重啟生效