性能测试的时候程序或者数据运行时会报too many open files,根本原因就是打开的文件超过了系统限制的数量。
1、检查:
1、查询某个进程已经开启的文件句柄
lsof -p 进程pid | wc -l
查看所有进程各自打开的文件数
lsof -n|awk ‘{print $2}’|sort|uniq -c|sort -nr|more
2、查看当前操作系统已经打开的文件总量
cat /proc/sys/fs/file-nr
注:第一个值是已开启的,第二个值是分配但未使用,第三个值是总限制数
3、查看操作系统允许打开的文件总量限制
cat /proc/sys/fs/file-max
4、查看进程可以打开的文件数量限制
ulimit -a
[root@centos ~]# 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) 127851
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) 127851
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
注:open files指限制每个进程可以最大打开的文件数
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、设置文件开启数量限制
1、限制某个用户的
vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
*soft nofile 65535
*hard nofile 65535
注:第一行指root用户的每个进程可开启最大的文件数(软限制,只警告)
第二行指root用户的每个进程可开启最大的文件数(硬限制,无法开启多的文件了)
第三、四行指所有用户的。
设定的值不能超过/proc/sys/fs/nr_open里的值,完全够用了。
2、限制系统文件开启最大数
其实上的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。
假如,我们设置进程打开的文件句柄数是1024 ,但是系统总线制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以
vim /etc/sysctl.conf
fs.file-max = 6815744
执行生效:sysctl -p