【Linux命令】ulimit设置最大文件打开数

一、简介

  在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 重启生效

参考网址:https://www.cnblogs.com/pangguoping/p/5791432.html

原文地址:https://www.cnblogs.com/HeiDi-BoKe/p/11654622.html