3种方法教你在Linux中修改打开文件数量限制

系统 Linux
当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字。主内存的一个特殊区域是为文件句柄预留的,这个区域的大小决定了一次可以打开多少个文件。

[[357472]]

 当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字。主内存的一个特殊区域是为文件句柄预留的,这个区域的大小决定了一次可以打开多少个文件。

[[357473]]

Linux上的进程受到许多限制,这些限制也阻碍它们正确地执行,而且每个进程都有几个与之相关的限制。shell限制程序可以同时打开的文件句柄的数量。

系统环境

Centos7

为什么要限制打开文件的数量?

因为操作系统需要内存来管理每个文件,所以可以打开的文件数可能会受到限制。由于程序也可以关闭文件处理程序,它可以创建任意大小的文件,直到所有可用磁盘空间都已满为止。在这种情况下,安全性的一个方面是通过施加限制来防止资源耗尽。

可以看到Linux系统中打开的文件描述符的最大数量,如下所示: 

  1. [root@localhost ~]# cat /proc/sys/fs/file-max   
  2. 180965 

<以上代码可复制粘贴,可往左滑>

该值显示用户每次登录会话可以打开的文件数,你会注意到,结果可能会因系统而异。出于某些原因,可能需要增加限制集的值。这就是为什么Linux系统提供了修改这些限制的可能性(增加或减少),方法是更改每个进程和每个系统打开文件数的最大值。

方法一:使用ulimit命令

ulimit命令可用来增加在shell中打开文件的数量。这个命令是系统内置命令,因此它只影响bash和从它启动的程序。ulimit语法如下: 

  1. ulimit  [选项] [限制数值] 

<以上代码可复制粘贴,可往左滑>

下面选项决定了什么是有限的:

  •  -a 显示当前所有限制的报告
  •  -f (文件限制)限制shell能创建文件的大小
  •  -n 限制打开的文件描述符的数量。
  •  -H和-S 它们分别被设置为硬限制和软限制。硬限制可能不会随之增加,但软限制可能会增加。如果没有提供任何选项,ulimit将同时设置硬限制和软限制。

查看当前打开文件的软限制,可以使用下面命令: 

  1. [root@localhost ~]# ulimit -a |grep open  
  2. open files                      (-n) 1024  
  3. 或者  
  4. [root@localhost ~]# ulimit -n  
  5. 1024 

<以上代码可复制粘贴,可往左滑>

如果需要查看硬限制,适应下面命令: 

  1. [root@localhost ~]# ulimit -Hn  
  2. 4096 

<以上代码可复制粘贴,可往左滑>

下面修改打开文件的数量: 

  1. [root@localhost ~]# ulimit -n 2048 

<以上代码可复制粘贴,可往左滑>

然后来查看一下: 

  1. [root@localhost ~]# ulimit -Hn  
  2. 2048  
  3. [root@localhost ~]# ulimit -Sn  
  4. 2048 

<以上代码可复制粘贴,可往左滑>

发现,设置ulimit 值的时候,没有指定-H或者-S,两个限制都会设定相同的值。

现在的问题是,如果退出登录或者重新启动计算机,该值将被重置。请记住,要使生效,需要编辑用户的.bashrc或者.bash_profile配置文件,通过将ulimit命令行添加到文件的末尾,可以使参数生效。 

  1. [root@localhost ~]# echo "ulimit -n 2048" >> ~/.bashrc 

<以上代码可复制粘贴,可往左滑>

方法二:使用PAM模块

最好通过名为pam_limits的PAM模块实现这种限制。需要通过编辑/etc/security/limits.conf文件来配置它。这个文件包含四个基本字段:

domain:描述了在哪些实体中应用限制。它可以是user、group(组名前面加@表示组)或匹配所有用户,使用(*)通配符。通配符不适应与root用户。

type:这里表示限制为硬限制还是软限制?硬限制是由系统管理员添加的,在任何情况下都不能超过,而用户可以临时超过软限制。还可以使用破折号-来表示一个限制是硬的和软的。请注意,软限制可以增加到硬限制的值

type:它指定被限制条目的类型。可以是core(限制核心文件大小(KB)),data(最大数据大小(KB)),fsize(最大文件大小(KB)),nofile(打开的文件描述符的最大数目),nproc(最大进程数),等类型。更多类型可以使用man limits.conf查看。

type: 这里使填写应用限制的数值。

下面实例可以对照了解一下。 

  1. [root@localhost ~]# tail -12 /etc/security/limits.conf   
  2.  
  3.  
  4. #*               soft    core            0  
  5. #*               hard    rss             10000  
  6. #@student        hard    nproc           20  
  7. #@faculty        soft    nproc           20  
  8. #@faculty        hard    nproc           50  
  9. #ftp             hard    nproc           0  
  10. #@student        -       maxlogins       4  
  11. # End of file 

<以上代码可复制粘贴,可往左滑>

要编辑所有用户打开文件的最大数量,可以在文件末尾添加以下行: 

  1. [root@localhost ~]# vim /etc/security/limits.conf   
  2. * hard nofile 20000  
  3. * soft nofile 15000 

<以上代码可复制粘贴,可往左滑>

之后,需要编辑文件/etc/pam.d/login配置文件,在最后添加以下一条内容: 

  1. [root@localhost ~]# vim /etc/pam.d/login   
  2. session    required pam_limits.so 

<以上代码可复制粘贴,可往左滑>

保存文件。然后退出登录,或者重启系统。可以看到软限制和硬限制的值都修改成功了: 

  1. [root@localhost ~]# ulimit -Sn  
  2. 15000  
  3. [root@localhost ~]# ulimit -Hn  
  4. 20000 

<以上代码可复制粘贴,可往左滑>

方法三:

查看系统最大打开文件描述符数量: 

  1. [root@localhost ~]# cat /proc/sys/fs/file-max   
  2. 180965 

<以上代码可复制粘贴,可往左滑>

临时设置该值: 

  1. [root@localhost ~]# echo "1000000" > /proc/sys/fs/file-max  

<以上代码可复制粘贴,可往左滑>

永久性设置,需要在/etc/sysctl.conf中设置,并让它生效: 

  1. [root@localhost ~]# echo "fs.file-max = 1000000>> /etc/sysctl.conf   
  2. [root@localhost ~]# sysctl -p  
  3. fs.file-max = 1000000 

<以上代码可复制粘贴,可往左滑>

总结

所有进程打开的文件描述符数量不能超过/proc/sys/fs/file-max。单个进程打开的文件描述符数不能超过user limit中nofile的soft limit。nofile的soft limit不能超过其hard limit。 

 

责任编辑:庞桂玉 来源: 良许Linux
相关推荐

2021-11-26 09:10:19

Linux文件命令

2020-11-13 09:14:23

Linux重复文件命令行

2009-06-02 08:44:52

微软Windows 7操作系统

2021-12-28 00:21:29

Windows 10Windows微软

2011-12-26 10:35:03

Windows系统Linux系统

2011-12-26 10:28:59

Linux学习环境Linux系统

2022-05-31 16:00:46

Go 编程语言复制文件Go 标准库

2010-05-27 18:18:14

MySQL修改root

2019-06-04 15:34:05

WindowsLinuxLinux命令

2018-11-13 11:09:46

Linux服务器指标限制

2020-12-26 14:48:21

UbuntuLinuxDeb文件

2024-01-10 08:20:50

Linux编辑器pico

2010-03-29 15:57:34

2009-05-07 14:18:21

2016-12-01 18:49:39

LinuxISO提取和复制文件

2019-01-03 15:43:25

Linux内存shell

2018-12-19 19:30:46

JavaScript创建对象前端

2011-03-15 14:16:27

2022-11-18 15:09:29

2021-01-27 10:56:05

Linux运维Linux系统
点赞
收藏

51CTO技术栈公众号