Linux下设置最⼤⽂件打开数nofile及nr_open、file-max
在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“⽆法打开更多进程”,或是coredump过⼤等问题,这些都可以设置资源限制来解决。今天在教某位客户设置最⼤⽂件数⽅法时,搜索⽹上的⽅法时发现各家说法并不⼀致,便写了这篇⽂档。
通常对Linux某个⽤户设置系统资源,我们都已经知道可以⽤ulimit命令来查看和设置。
表 1. ulimit 参数说明
选项
[options]含义例⼦
-H设置硬资源限制,⼀旦设置不能增加。ulimit – Hs 64;限制硬资源,线程栈⼤⼩为 64K。
-S设置软资源限制,设置后可以增加,但是不能超过硬资源设
置。
ulimit – Sn 32;限制软资源,32 个⽂件描述符。
-a显⽰当前所有的 limit 信息。ulimit – a;显⽰当前所有的 limit 信息。
-c最⼤的 core ⽂件的⼤⼩,以 blocks 为单位。ulimit – c unlimited;对⽣成的 core ⽂件的⼤⼩不进⾏限制。
-d进程最⼤的数据段的⼤⼩,以 Kbytes 为单位。ulimit -d unlimited;对进程的数据段⼤⼩不进⾏限制。
-f进程可以创建⽂件的最⼤值,以 blocks 为单位。ulimit – f 2048;限制进程可以创建的最⼤⽂件⼤⼩为 2048 blocks。
-l最⼤可加锁内存⼤⼩,以 Kbytes 为单位。ulimit – l 32;限制最⼤可加锁内存⼤⼩为 32 Kbytes。
-m最⼤内存⼤⼩,以 Kbytes 为单位。ulimit – m unlimited;对最⼤内存不进⾏限制。
-n可以打开最⼤⽂件描述符的数量。ulimit – n 128;限制最⼤可以使⽤ 128 个⽂件描述符。
-p管道缓冲区的⼤⼩,以 Kbytes 为单位。ulimit – p 512;限制管道缓冲区的⼤⼩为 512 Kbytes。
-s线程栈⼤⼩,以 Kbytes 为单位。ulimit – s 512;限制线程栈的⼤⼩为 512 Kbytes。
-t最⼤的 CPU 占⽤时间,以秒为单位。ulimit – t unlimited;对最⼤的 CPU 占⽤时间不进⾏限制。
-u⽤户最⼤可⽤的进程数。ulimit – u 64;限制⽤户最多可以使⽤ 64 个进程。
-v进程最⼤可⽤的虚拟内存,以 Kbytes 为单位。ulimit – v 200000;限制最⼤可⽤的虚拟内存为 200000 Kbytes。
当然我们都知道Linux⼤部分的命令设置都是临时⽣效,⽽且ulimit命令只对当前终端⽣效,如果需要永久⽣效的话,我们有两种⽅法,⼀种是将命令写⾄profile和bashrc中,在有些⽹页中说写到rc.local,其实是不对的;还有⼀种就是在f中添加记录(需重启⽣效,并且在/etc/pam.d/中的seesion有使⽤到limit模块)。接下来讨论的就是在f⽤户最⼤⽂件打开数限制的相关内容。
针对⽤户打开最⼤⽂件数的限制,在f对应的nofile,不管是man⼿册还是⽂件中说明都只是⼀句话“maximum number of open files",它其实对应是单个进程能打开的最⼤⽂件数,通常为了省事,我们想取消它的限制,根据man⼿册中,“values -1, unlimited or infinity indicating no limit”,-1、unlimited、infinity都是表明不做限制,可是当你实际给nofile设置成这个值,等你重启就会发现⽆法登录系统了。
由此可见,nofile是有⼀个上限的,同时⽤ulimit测试:
ulimit其实就是对单⼀程序的限制,进程级别的
file-max是所有时程最⼤的⽂件数
nr_open是单个进程可分配的最⼤⽂件数
[root@server-mysql fs]# ulimit -n unlimited
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[root@server-mysql fs]#
[root@server-mysql fs]# ulimit -n 1048576
[root@server-mysql fs]# ulimit -n 1048577
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[root@server-mysql fs]# cat /proc/sys/fs/nr_open
1048576
[root@server-mysql fs]# echo 1000000>/proc/sys/fs/nr_open
[root@server-mysql fs]# cat /proc/sys/fs/nr_open
1000000
[root@server-mysql fs]# ulimit -n 999999
[root@server-mysql fs]# ulimit -n 1000000
[root@server-mysql fs]# ulimit -n 1000001
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[root@server-mysql fs]# cat file-nr
24960132022
[root@server-mysql fs]# cat file-max
132022
[root@server-mysql fs]# echo 2000000>file-max
[root@server-mysql fs]# cat file-nr
249602000000
man 5 proc:
/proc/sys/fs/file-max
This  file  defines a system-wide limit on the number of open files for all processes.  (See
also  setrlimit(2),  which  can  be  used  by  a  process  to set  the  per-process  limit,
RLIMIT_NOFILE, on the number of files it may open.)  If you get lots of error messages about
running out of file handles, try increasing this value:
echo 100000>/proc/sys/fs/file-max
The kernel constant NR_OPEN imposes an upper limit on the value that may be placed in file-
max.
If  you  increase  /proc/sys/fs/file-max,  be sure to increase /proc/sys/fs/inode-max to3-4
times the new value of/proc/sys/fs/file-max, or you will run out of inodes.
/proc/sys/fs/file-nr
This (read-only) file gives the number of files presently opened.  It  contains  three  num-
bers: the number of allocated file handles; the number of free file handles; and the maximum
number of file handles.  The kernel allocates file handles dynamically, but it doesn’t  free
them  again.  If the number of allocated files is close to the maximum, you should consider
increasing the maximum.  When the number of free file handles is large, you’ve encountered a
peak in your usage of file handles and you probably don’t need to increase the maximum.
ulimit中硬限制是实际的限制,⽽软限制,是warnning限制,只会做出warning,其实ulimit命令本⾝就有分软硬设置,加-H就是硬,加-S就是软。
默认显⽰的是软限制,如果修改的时候没有加上的话,就是两个⼀起改
配置⽂件最前⾯的⼀位是domain,设置为星号代表全局,另外你也可以针对不同的⽤户做出不同的限制
ulimit其实就是对单⼀程序的限制,进程级别的
系统总限制:/proc/sys/fs/file-max
通过 man 5proc到file-max的解释:
file-max指定了系统范围内所有进程可以打开的⽂件句柄的数量限制---kernel-level
可以通过cat查看⽬前的值,echo来⽴刻修改
echo 10000>/proc/sys/fs/file-max
另外还有⼀个,/proc/sys/fs/file-nr
只读,可以看到整个系统⽬前使⽤的⽂件句柄数量
写⼀个简单的for循环得出:
#for  V in `seq  100000  10000000`;do ulimit -n $V;[[ $? != 0 ]]&&break;done
再执⾏ulimit -n ,可以看到1048576就是nofile的最⼤值了,但为什么是这个值?1048576是1024*1024,当然这并没有什么卵⽤。。。再跟踪⼀下我们就会发现这个值其实是由内核参数nr_open定义的:
# cat /proc/sys/fs/nr_open
1048576
到此我们就要说起nr_open,与file-max了,⽹上在说到设置最⼤⽂件数时偶尔有些帖⼦也说到要修改file-max,字⾯上看file-max确实像是对应最⼤⽂件数,⽽在Linux内核⽂档中它们两的解释是:
file-max:
The value in file-max denotes the maximum number of file-
handles that the Linux kernel will allocate. When you get lots
of error messages about running out of file handles, you might
want to increase this limit
执⾏:grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}',可以看到与file-max是相近的;
nr_open:
This denotes the maximum number of file-handles a process can
confallocate. Default value is 1024*1024 (1048576) which should be
enough for most machines. Actual limit depends on RLIMIT_NOFILE
resource limit.
file-max是内核可分配的最⼤⽂件数,nr_open是单个进程可分配的最⼤⽂件数,所以在我们使⽤ulimit或f来设置时,
如果要超过默认的1048576值时需要先增⼤nr_open值(sysctl -_open=100000000或者直接写⼊f⽂件)。
当然百万级别的单进程最⼤file-handle打开数应该也够

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。