Linux下文件描述符(文件句柄)限制

1、 文件描述符

Linux的核心思想之一就是"一切皆文件"。即Linux中所有的内容都是以文件的形式保存和管理的,它为不同类型的文件提供了统一的操作接口,对于不同类型的文件,我们都可以使用fopen()/fclose()/fwrite()/fread()等对这些文件进行读写处理。在Linux中,普通文件、目录、链接文件、字符设备、块设备以及网络套接字等等都以文件的形式存在。

文件描述符(文件句柄)是Linux内核为了高效管理已被打开的文件所创建的索引,它是一个非负整数,用于指代被打开的文件。文件打开后,所有对该文件的操作都通过文件描述符进行操作。

文件描述符是系统的重要资源,当打开过多文件时会出现把系统内存耗尽的情况,所以Linux提供了多种维度对文件描述符的使用上限进行限制,以避免该问题。

2、 文件描述符限制

为了有效的对文件描述符进行限制,Linux分别在系统级别、用户级别以及进程级别对文件描述符进行了限制。

2.1 系统级别限制相关参数

2.1.1 file-max

file_max用于限制整个系统能够分配的文件描述符,即当前系统下所有用户下的所有进程,其分配的所有文件描述符之和不能超过该值。
查看当前系统file-max值:

cat /proc/sys/fs/file-max
1048576

实际使用的过程中,在相当高的并发下我们需要提升此值,可通过下面两种方法对此值进行修改。

# 临时修改,机器重启后失效
sysctl -w fs.file-max=102400

# 永久修改(直接在/etc/sysctl.conf文件最后添加一行fs.file-max=102400),执行下面命令使配置生效。
sysctl -p
2.1.2 file-nr
cat /proc/sys/fs/file-nr
6144	0	1048576

file-nr是一个只读文件,它记录了当前系统中文件描述符的使用情况,第一个(6144)是系统已经分配的文件描述符数;第二个(0)是系统已经分配但未使用的文件描述符数;第三个是内核最大能分配的文件描述符数,与file-max一致。我们可以通过查看此数据判断文件描述符是够已经将要用尽和是否需要扩file-max字段。

2.2 用户进程级别限制相关参数

Linux下限制单个进程的可打开最大的文件描述符的主要有nr_open和RLIMIT_NOFILE,其中nr_open对于所有用户下的所有进程的文件描述符限制,而RLIMIT_NOFILE可以设置不同用户下的进程的文件描述符限制。RLIMIT_NOFILE包括soft limit和hard limit两种,可以使用ulimit 查看。

2.2.1 nr_open

nr_open用于限制单个进程可以分配的最大文件描述符,该限制对于系统上所有用户下的所有进程都生效,查看当时如下:

cat /proc/sys/fs/nr_open
1048576

在Linux中该值默认为1024*1024,此值对于大多数进程都已经足够用了,但是如果有需求需要修改该值,其修改方式与file-max修改方式类似:

# 临时修改,机器重启后失效
sysctl -w fs.nr_open=102400

# 永久修改(直接在/etc/sysctl.conf文件最后添加一行fs.nr_open=102400),执行下面命令使配置生效。
sysctl -p
2.2.2 RLIMIT_NOFILE

RLIMIT_NOFILE可以针对特定用户下的进程进行设置。它包括两个值,分别是soft limit和hard limit。

soft limit和hard limit的区别:

  • hard limit只能被root用户或者root进程修改
  • soft limit可以由任何用户或任何进程修改
  • soft limit的值必须小于hard limit。
# 查看soft limit
ulimit -Sn
102400

# 查看hard limit
ulimit -Hn
102400

设置hard limit和soft limit的方法:

# 设置RLIMIT(resorce limit)的通用方法(将下列语句写入/etc/security/limits.conf):
# 第一列:用户或用户组(用户组前面加@),若为所有用户和用户组直接填*
# 第二列:类型(soft/hard)
# 第三列:项(如文件描述符写nofile)
# 第三列:值,该限制的值的大小。
username|@groupname   type  item  limit

* soft nofile 65535
* hard nofile 65535

https://ivanzz1001.github.io/records/post/linuxops/2018/03/20/linux-openfile-max#11-nr_open说明
https://blog.csdn.net/wangkai_123456/article/details/78481698

猜你喜欢

转载自blog.csdn.net/u014630623/article/details/88929118