在开发运维的时候我们常常会遇到类似“Socket/File: Can’t open so many files”,“无法打开更多进程”,或是coredump过大等问题,这些都可以设置资源限制来解决。今天在教某位客户设置最大文件数方法时,搜索网上的方法时发现各家说法并不一致,便写了这篇文档。 通常对Linux某个用户设置系统资源,我们都已经知道可以用ulimit命令来查看和设置。 表 1. ulimit 参数说明
当然我们都知道Linux大部分的命令设置都是临时生效,而且ulimit命令只对当前终端生效,如果需要永久生效的话,我们有两种方法,一种是将命令写至profile和bashrc中,在有些网页中说写到rc.local,其实是不对的;还有一种就是在limits.conf中添加记录(需重启生效,并且在/etc/pam.d/中的seesion有使用到limit模块)。接下来讨论的就是在limits.conf用户最大文件打开数限制的相关内容。 针对用户打开最大文件数的限制, 在limits.conf对应的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]# echo 2000000 >file-max [root@server-mysql fs]# cat file-nr 2496 0 2000000
man 5 proc:
ulimit中硬限制是实际的限制,而软限制,是warnning限制,只会做出warning,其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软。 默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改 配置文件最前面的一位是domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制
写一个简单的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- 执行: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 file-max是内核可分配的最大文件数,nr_open是单个进程可分配的最大文件数,所以在我们使用ulimit或limits.conf来设置时, 如果要超过默认的1048576值时需要先增大nr_open值(sysctl -w fs.nr_open=100000000或者直接写入sysctl.conf文件)。 当然百万级别的单进程最大file-handle打开数应该也够
|
|
来自: just_person > 《待分类》