Write by lyc at 2018-8-31
Modify by lyc at 2020-1-4
参考博文:
一台Linux服务器最多能支撑多少个TCP连接?
linux 最大文件打开数nofile及nr_open、file-max说明

CentOS7 文件描述符

进程每打开一个文件(Linux 下一切皆文件,包括 Socket),都会消耗一定的内存资源。

如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。

所以 Linux 系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。

三个级别限制的修改方式:

  • 系统级:当前系统可打开的最大数量,通过 fs.file-max 参数可修改
  • 用户级:指定用户可打开的最大数量,修改 /etc/security/limits.conf
  • 进程级:单个进程可打开的最大数量,通过 fs.nr_open 参数可修改

1.系统级-文件描述符 fs.file-max

file-max 中的值表示最大文件数,处理Linux内核将分配的。当你得到很多的时候对于文件句柄耗尽的错误消息,您可能会想要增加这个极限。

1
2
3
4
5
6
7
8
9
10
# 查看
$ cat /proc/sys/fs/file-max
1000000

# 配置
$ vim /etc/sysctl.conf
fs.file-max = 1000000

# 生效
$ sysctl -p

2.用户级-文件描述符 limits

2.1 文件描述符 limits

  • 文件描述符 nofile 操作系统==同时==最大打开的文件数量限制。
  • 操作系统进程数 nproc 操作系统==同时==最大打开的进程数限制。
  • linux 默认值open filesmax user processes为 1024,即操作系统默认最多只允许同时打开 1024 个文件,处理 1024 个用户进程。

2.2 配置文件描述符

/etc/security/limits.conf 配置语法说明

/etc/security/limits.conf 是 Linux资源使用配置文件,用来限制用户对系统资源的使用,语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<domain>  <type>  <item>  <value>

<domain> 表示要限制的用户,可以是:
1.用户名
2.组名(组名前面加'@'以区别用户名)
3.*(表示所有用户)

<type> 有两个值:
1.soft 表示警告的设定,可以超过这个设定值,但是超过会有警告信息
2.hard 表示严格的设定,必定不能超过这个设定的值

<item> 表示可选的资源,如下:
1.core:限制内核文件的大小
2.data:最大数据大小
3.fsize:最大文件大小
4.memlock:最大锁定内存地址空间
5.nofile:打开文件的最大数目
6.rss:最大持久设置大小
7.stack:最大栈大小
8.cpu:以分钟为单位的最多CPU时间
9.nproc:进程的最大数目
10.as:地址空间限制

<value> 表示要限制的值

临时配置

1
2
$ ulimit -SHn 102400   # 配置软硬文件描述符
$ ulimit -SHu 102400 # 配置软硬进程数

持久化配置

/etc/security/limits.conf最后增加:

1
2
3
4
*    soft    nofile    102400
* hard nofile 102400
* soft nproc 102400
* hard nproc 102400
  • nofile 软硬链接文件描述符
  • nproc 软硬链接进程数

ulimit -a 查看当前配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ 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) 15245
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 102400 # 文件描述符限制值
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 102400 # 进程数限制值
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

ulimit -n

  • ulimit 命令本身就有分软硬设置,加-H 就是硬,加-S 就是软默认显示的是软限制
  • soft 限制指的是当前系统生效的设置值。 hard 限制值可以被普通用户降低。但是不能增加。 soft 限制不能设置的比 hard 限制更高。 只有 root 用户才能够增加 hard 限制值。
1
2
3
4
5
6
7
8
9
10
# 查看文件描述符
$ ulimit -n
$ ulimit -Sn # 等于ulimit -n
$ ulimit -Hn

# 查看进程数
$ ulimit -u
$ ulimit -Su
$ ulimit -Hu
-H hard硬链接

参数解释:

  • -n 文件描述符
  • -u 进程数
  • -S soft软链接

3.进程级-文件描述符 fs.nr_open

nr_open: 这表示一个进程可以拥有的最大文件句柄数分配。默认值为 1024*1024 (1048576)
对大多数机器来说足够了。实际的限制取决于RLIMIT_NOFILE 资源限制。

因为这个值默认就有 1024*1024 (1048576) ,所以一般不需要另做配置。

1
2
3
4
5
6
7
8
9
10
# 查看
$ cat /proc/sys/fs/nr_open
1048576

# 配置
$ vim /etc/sysctl.conf
fs.nr_open = 1048576

# 生效
$ sysctl -p