关于RHEL6中ulimit的nproc限制
文章目录
当前shell下更改用户可打开进程数
修改limits.conf配置文件生效
当前shell下更改用户可打开进程数
修改limits.conf配置文件生效
[root@kumu ~]# ulimit -a //查看当前配置文件ulimit全局系数
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1829
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@kumu ~]# vim /etc/security/limits.conf
[root@kumu ~]# grep '^*' /etc/security/limits.conf
* soft nproc 10240
* hard nproc 10240
* soft nofile 10240
* hard nofile 10240
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]# ulimit -u //发现nproc并没有像nofile一样而改变
1024
[root@kumu ~]#
经google搜索获知,RHEL6下引入了配置文件/etc/security/limits.d/90-nproc.conf
(参见了@杨德华Devin 文章redhat5 和redhat6 root用户不同的ulimits)
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
[root@kumu ~]#
我们修改这个文件尝试是否因为该文件影响,修改如下
[root@kumu ~]# vim /etc/security/limits.d/90-nproc.conf
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#* soft nproc 1024
* soft nproc 65535
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效,执行如下命令发现修改成功
[root@kumu ~]# ulimit -u
10240
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]#
由此可知,如果要修改配置文件limits.conf中的nproc限制上限是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,但是shell终端下是不受制约的
另外笔者猜想,如果使用*号让全局用户生效是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响
[root@kumu ~]# vim /etc/security/limits.d/90-nproc.conf //恢复系统默认设置
[root@kumu ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
#* soft nproc 65535
[root@kumu ~]# vim /etc/security/limits.conf //只针对某个用户测试(这里使用root)
[root@kumu ~]# grep '^root' /etc/security/limits.conf
root soft nproc 10240
root hard nproc 10240
[root@kumu ~]#
退出当前用户,重新登录即可让之前修改的limits生效,执行如下命令发现修改成功
[root@kumu ~]# ulimit -u
10240
[root@kumu ~]# ulimit -n
10240
[root@kumu ~]#
笔者之前猜想正确,即只有当使用*号让全局用户生效的时候,生效的nproc的值大小是受文件/etc/security/limits.d/90-nproc.conf中nproc值大小制约的,而如果仅仅是针对某个用户,那么就不受该文件nproc值大小的影响。
====================================================================
关于Centos6中ulimit nproc用户进程数的限制
一、缘由:
在启动mongodb的时候,有Warning提示soft rlimits too low,就是用户使用进程数过小,遂调高系统资源关于用户最大进程数的限制ulimit -u。
先暂时使设置生效,ulimit -u 102400,提示: ulimit: max user processes: cannot modify limit: Operation not permitted。
修改/etc/security/limits.conf 为 * soft nproc 102400,退出shell后重新登陆,依然不行。后经Google是/etc/security/limits.d/90-nproc.conf
的限制,在Centos 6中。
二、解决办法:
文件90-nproc.conf中由此解释Default limit for number of user's processes to prevent,可见这个文件默认用来限制用户拥有的最大进程数量。
经查看,每个用户(*)的nproc被限制为65535,故设置100000超过系统最大用户进程数限制。
# Default limit number of user * soft nproc * hard nproc
故需要修改90-nproc.conf为 soft nproc 100000,重新登录后即可生效。
或者,如果只是相对某个单个用户进行限制更改,可以修改/etc/security/limits.conf,将*改成具体用户名也是可以生效的。
比如:
mongod soft nproc 100000
mongod hard nproc 100000
注:楼主曾尝试在90-nproc.conf中设置nofile的值,也是可以生效的,系统以他为标准;但是不建议这么设置。
三、关于linux下用户资源限制limits.conf详解
1、limits.conf文件实际上是linux PAM(认证模块)中pam_limits.so的配置文件,而且只针对单个会话。
2、要使limits.conf文件配置生效,必须确保pam_limits.so文件被加入启动文件中。要查看/etc/pam.d/login文件中有session required /lib/security/pam_limits.so
limits.conf文件格式如下:
<domain> <type> <item> <value>
domain有好几种格式,具体可以用cat limits.conf来查看,不过一般来说,我们都是用的用户名和组名的形式:username|@groupname
设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有的限制。
type:有soft,hard和-,soft指的是当前系统生效的设置值,软限制也可以理解为警告值。hard表名系统中所能设定的最大值。soft的限制不能比hard限制高,
用 – 表明同时设置了soft和hard的值。
item表明需要限制的使用资源类型
core 限制内核文件的大小
data 最大数据大小
fsize 最大文件大小
memlock 最大锁定内存地址空间
nofile 打开文件的最大数目
rss 最大持久设置大小
stack 最大栈大小
cpu 以分钟为单位的最多CPU时间
noproc 进程的最大数目
as 地址空间限制
maxlogins 此用户允许登录的最大数目
=========================================================
一、问题发生的背景:
在一台测试服务器上搭建一套应用环境,正在做着,当我开启了最后一个程序时,终端突然提示说命令不可用了,无论我做什么动作都直接拒绝。当时以为是这个终端出了问题,于是打算再开一个终端,却再也无法登陆上去了。
我就觉得很奇怪,一开始以为是这台服务器挂了,但是当我去平台查看时发现仍然是正常运转的,只是内存使用率较高。此时登陆的用户是root,而我搭建应用环境用的是普通用户,所以我想通过su命令切换回那个用户,当我执行了这个操作时,如题问题就出现了。
为什么root用户可以正常使用,而其他普通用户就不可以了呢?并且,错误提示是“资源暂时不可用”,是不是因为普通用户做了资源使用限制?因为这个问题是在我开了很多进程之后才出现的,所以有理由这样怀疑。
二、解决问题的思路:
通过上网搜索,了解到了能够控制用户资源的文件一般有两个,一是/etc/profile,二是/etc/security/limits.conf。
先来了解一下这两个文件:
1./etc/profile是环境变量配置文件,可能也有ulimit配置,不过在查看了我自己的后,发现这里并没有做特别的limit限制;
2./etc/security/limits.conf
domain:
是指限制的对象,可以是个人,也可以是组,组前面要加@符号,也可以设置为除root用户外的 任何人,用*号表示;
type:
是指类型,soft是当前系统生效的值,hard是系统可以设置的最大值;
item:
项目,是可以对什么项目做限制,如最大进程数,文件最大值;
value:
值,所设置的值的大小。
疑惑的是,在/etc/security/limits.conf配置文件中可以看到,进程数和打开文件数的最大值,已经开得够大了,可是为什么还会出现这种现象呢?
经过查找,发现Centos6.x版本后,还有一个配置文件对ulimit设置生效,就是/etc/security/limits.d/90-nproc.conf,果然,打开文件后发现,默认最大进程数只有1024,明显是不能满足我搭建应用环境的需求的。于是,把1024改成10240后,再执行su qjzh就成功了。同时,可以看到,对root是unlimited的。
解决这个问题的方法有两个:
1.把无用的进程杀掉;
2.把最大进程限制数调大。
另外,可以使用ulimit命令来临时设置各种资源限制,并且通过 ulimit -a 命令可以查看当前用户的各种限制值的大小。
转载请注明:学时网 » 关于RHEL6中ulimit的nproc限制