你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在 Linux 中修改打开文件数量限制

[复制链接]
gaosmile 发布时间:2020-12-14 23:15
当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字。主内存的一个特殊区域是为文件句柄预留的,这个区域的大小决定了一次可以打开多少个文件。
微信图片_20201214231308.png
Linux上的进程受到许多限制,这些限制也阻碍它们正确地执行,而且每个进程都有几个与之相关的限制。shell限制程序可以同时打开的文件句柄的数量。2 A( K- j* P* X! `% w, E+ }6 E
系统环境
Centos7
为什么要限制打开文件的数量?
因为操作系统需要内存来管理每个文件,所以可以打开的文件数可能会受到限制。由于程序也可以关闭文件处理程序,它可以创建任意大小的文件,直到所有可用磁盘空间都已满为止。在这种情况下,安全性的一个方面是通过施加限制来防止资源耗尽。
可以看到Linux系统中打开的文件描述符的最大数量,如下所示:
[root@localhost ~]# cat /proc/sys/fs/file-max , K' ^% L2 N" ?! q& E* l
1809654 ]4 ]' l$ r% N  |  l! ]
<以上代码可复制粘贴,可往左滑>  ?  O/ S; G, w/ d
该值显示用户每次登录会话可以打开的文件数,你会注意到,结果可能会因系统而异。出于某些原因,可能需要增加限制集的值。这就是为什么Linux系统提供了修改这些限制的可能性(增加或减少),方法是更改每个进程和每个系统打开文件数的最大值。
: Q2 [% K- b/ S; o' K1 \4 f
方法一:使用ulimit命令
ulimit命令可用来增加在shell中打开文件的数量。这个命令是系统内置命令,因此它只影响bash和从它启动的程序。ulimit语法如下:
ulimit  [选项] [限制数值]
$ T; W3 J$ w; B$ S
<以上代码可复制粘贴,可往左滑>下面选项决定了什么是有限的:
  • -a 显示当前所有限制的报告
  • -f (文件限制)限制shell能创建文件的大小
  • -n 限制打开的文件描述符的数量。
  • -H和-S 它们分别被设置为硬限制和软限制。硬限制可能不会随之增加,但软限制可能会增加。如果没有提供任何选项,ulimit将同时设置硬限制和软限制。
    " e- V; Z* s1 o0 K1 G+ }
查看当前打开文件的软限制,可以使用下面命令:[root@localhost ~]# ulimit -a |grep open: L- h. C+ H/ `$ s3 B% g
open files                      (-n) 1024
6 p% k9 K* `( t! @或者
( R+ ?6 ~) M, X  c2 y[root@localhost ~]# ulimit -n
7 x1 [& f/ m0 J- Z1024
$ Z, h8 Q" p& i) Y* z! v
<以上代码可复制粘贴,可往左滑>如果需要查看硬限制,适应下面命令:[root@localhost ~]# ulimit -Hn0 O/ ]9 F6 r8 I. z; m7 Z
4096
2 I* |2 Y3 D8 Q, t5 X- P' V4 U1 Z
<以上代码可复制粘贴,可往左滑>下面修改打开文件的数量:[root@localhost ~]# ulimit -n 2048! @: L' P2 u+ }$ h  P9 _
<以上代码可复制粘贴,可往左滑>然后来查看一下:[root@localhost ~]# ulimit -Hn: _) T+ `2 W4 B5 p' R' B
2048
4 I3 t. g, e7 T9 Z' b4 `[root@localhost ~]# ulimit -Sn
( _: P, V; y, ^7 O: o2048  R, \* N( B. y. W/ u
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231314.png
发现,设置ulimit 值的时候,没有指定-H或者-S,两个限制都会设定相同的值。
( K+ Q4 b! ?& b1 x% v7 t3 l
现在的问题是,如果退出登录或者重新启动计算机,该值将被重置。请记住,要使生效,需要编辑用户的.bashrc或者.bash_profile配置文件,通过将ulimit命令行添加到文件的末尾,可以使参数生效。
[root@localhost ~]# echo "ulimit -n 2048" >> ~/.bashrc
/ }4 j0 `2 P, h7 _% I
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231316.png

: Q' P  s0 Q7 J; l8 r0 Q5 R
方法二:使用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: 这里使填写应用限制的数值。
下面实例可以对照了解一下。
[root@localhost ~]# tail -12 /etc/security/limits.conf
  k1 g* y0 d0 [" h( l#
3 F, j* _$ [! b  |0 u/ o#
# Q6 ~& e) c7 _1 v: x& j4 m2 ?+ _
1 m5 {' R, z- ?9 ?( g" `% ~#*               soft    core            0
) S- g& b  ]" g4 J; m) U2 u#*               hard    rss             10000
! w; c1 U+ _( h1 ?+ X#@student        hard    nproc           20( `2 e' k; r7 v$ o3 }( U$ c0 f2 {
#@faculty        soft    nproc           20
8 d7 W- K) _3 |#@faculty        hard    nproc           50
0 H% P4 s: C: s#ftp             hard    nproc           0) B) v7 X" R6 ^# }
#@student        -       maxlogins       44 I  O) x0 c* [, u: x, z1 b

4 K7 j2 _- N1 m- r# End of file
1 {0 W5 \% B3 }; h0 Z  Y
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231319.png

" p# t+ t" W9 T9 r+ }0 J! p要编辑所有用户打开文件的最大数量,可以在文件末尾添加以下行:
[root@localhost ~]# vim /etc/security/limits.conf ' v3 S- U; f; k" d
* hard nofile 20000& ?( t! W* s7 o* {/ R" d
* soft nofile 15000& f2 E1 X! X5 \' ?
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231322.png
6 a# H+ O1 s$ Z  h* I- ^1 d% g6 y
之后,需要编辑文件/etc/pam.d/login配置文件,在最后添加以下一条内容:
[root@localhost ~]# vim /etc/pam.d/login
7 E7 G; V* \8 S  Q1 c0 fsession    required pam_limits.so
9 I& s' \3 Y$ o8 Q% @
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231325.png
4 F) B/ T/ e% Y( h& T
保存文件。然后退出登录,或者重启系统。可以看到软限制和硬限制的值都修改成功了:
[root@localhost ~]# ulimit -Sn: @, ?2 e( Z8 F) a5 C0 r9 U
15000# r5 w7 m' `: K9 t# N3 P
[root@localhost ~]# ulimit -Hn- F- U1 f+ a" E1 v* B* M
200004 W4 h( c7 s* E3 u3 F
<以上代码可复制粘贴,可往左滑>5 O6 E. h* O6 f# w
方法三:查看系统最大打开文件描述符数量:[root@localhost ~]# cat /proc/sys/fs/file-max ) b5 E. d0 }5 E+ Y8 x) S
1809657 v. t* l1 r* m7 i+ I
<以上代码可复制粘贴,可往左滑>临时设置该值:[root@localhost ~]# echo "1000000" > /proc/sys/fs/file-max
6 ?# _0 A0 ]' |" `" R+ z: d* W
<以上代码可复制粘贴,可往左滑>
微信图片_20201214231331.png

. C3 H7 T% r$ _) p; Q  o; L! X永久性设置,需要在/etc/sysctl.conf中设置,并让它生效:
[root@localhost ~]# echo "fs.file-max = 1000000" >> /etc/sysctl.conf 6 d3 u3 u" M! p" [) b+ Y
[root@localhost ~]# sysctl -p( {1 h* b3 D6 ], \4 C9 O
fs.file-max = 1000000
" f- t% t5 U! `( S
<以上代码可复制粘贴,可往左滑># \6 x3 V7 Y  g4 B' Q: n+ T
总结
所有进程打开的文件描述符数量不能超过/proc/sys/fs/file-max。单个进程打开的文件描述符数不能超过user limit中nofile的soft limit。nofile的soft limit不能超过其hard limit。
& V8 c5 G( f# ]
赞 收藏 评论0 发布时间:2020-12-14 23:15

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版