linux ulimit的若干坑
一、ulimit简介
ulimit是bash内键命令,它具有一套参数集,用于为由它生成的shell进程及其子进程的资源使用设置限制。可以使用help ulimit查询手册
二、ulimit命令使用
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置linux用户的最大进程数
可以用ulimit - a来显示当前的各种用户进程限制
下面我把某Linux用户的最大进程数设为10000个
ulimit -u 10240
对于需要做许多socket连接并使它们处于打开状态的java应用程序而言,
最好通过使用ulimit -n xx修改每个进程可打开的文件数,缺省值是1024
ulimit -n 4096将每个进程可以打开的文件数目加大到4096,缺省是1024
其他 建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
cpu时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
还有一些常用的选项如下:
ulimit -Hs 64:硬限制资源,线程栈大小为64k
ulimit -Sn 32:软限制资源,32个文件描述符
ulimit -a:显示当前所有limit信息
ulimit -c unlimited:对生成的core文件大小不进行限制
ulimit -f 2048:限制进程可创建的最大文件大小为2048blocks
ulimt -i 32:限制最大可加锁内存大小为kbytes
ulimit -p 512:限制管道缓冲区的大小为512kbytes
ulimit -u 64:限制用户最多可以使用64个进程
注意:这个当中的硬限制是实际的限制,而软限制,是warning限制,只会做出warning;其中ulimit命令本身就有分软硬设置,默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变
三、ulimit的使用方式及作用范围
3.1、在用户的启动脚本里
如果用户使用的是bash,就可以在用户目录下的.bashrc文件中,加入ulimit -u 64,来限制用户最多可以使用64个进程,此外,可以在于.bashrc功能相当的启动脚本中加入ulimit
3.2、应用程序的启动脚本中
编写个简单的启动脚本startmyapp
#/bin/sh
ulimit -n 512
myapp.sh
以这个startmyapp启动myapp.sh时,myapp.sh这个脚本打开的文件句柄数不超过512个
3.3、直接控制台输入
[root@web ~]#ulimit -p 512
限制管道缓冲区为256k
四、ulimit相关配置文件
需要注意一点:/etc/security/limits.d下也可以设置noproc最大进参数的限制:即 /etc/security/limits.d/下的文件覆盖了/etc/security/limits.conf设置的值
主配置文件:/etc/security/limits.conf
分段配置文件:/etc/security/limits.d/*.conf
通过修改系统的/etc/security/limits.conf配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述
格式如下:
#<domain> <type> <item> <value>
名称 含义
domain 表示用户或者组的名字,还可以使用*作为通配符代表所有用户,组名前面加@和用户名区别
type 可以有两个值,soft和hard,soft指的是当前系统生效的设置值,hard表明系统中所能设定的最大值,用-就表示同时设置了soft和hard的值
item 表明需要限定的资源,可以有很多候选值,如stack,cpu等,分别表示最大的堆栈大小,占用 的cpu时间,noproc是代表进程数,nofile是代表文件打开数
value 对应相应的值
编辑保存之后,需要重新登录一次才能生效
4.1、soft和hard一起设置才好使
* soft nofile 1000000
* hard nofile 1000000
如果只是设置一个,那么是不起作用的
4.2、啥时候ulimit的设置才生效
退出当前session,重新登录后或者直接命令行执行
ulimit -n 1000000
ulimit -u unlimited
4.3、nofile不能设置unlimited,noproc可以
如果设置
* soft nofile unlimited
* hard nofile unlimited
那么你将被登录拒绝报错,因此nofile不能设置unlimited
五、修改linux 最大文件限制数 ulimit不生效 排查顺序
5.1、临时修改当前交互终端的limit值
查询当前终端的文件句柄数: ulimit -n 回车,一般的系统默认的1024.
修改文件句柄数为65535,ulimit -n 65535 .此时系统的文件句柄数为65535.
5.2、将ulimit 值添加到/etc/profile文件中(适用于有root权限登录的系统)
为了每次系统重新启动时,都可以获取更大的ulimit值,将ulimit 加入到/etc/profile 文件底部。
echo ulimit -n 65535 >>/etc/profile
source /etc/profile #加载修改后的profile
ulimit -n #显示65535,修改完毕!
5.3、查看环境变量设置是否有问题
OK,好多朋友都以为大功告成了,可以突然发现自己再次登录进来的时候,ulimit的值还是1024,这是为什么呢?
关键的原因是你登录的用户是什么身份,是不是root用户,由于服务器的root用户权限很大,一般是不能用来登录的,都是通过自己本人的登录权限进行登录,并通过sudo方式切换到root用户下进行工作。 用户登录的时候执行sh脚本的顺序:
/etc/profile.d/file
/etc/profile
/etc/bashrc
/mingjie/.bashrc
/mingjie/.bash_profile
由于ulimit -n的脚本命令加载在第二部分,用户登录时由于权限原因在第二步还不能完成ulimit的修改,所以ulimit的值还是系统默认的1024。
解决办法:
修改linux的软硬件限制文件/etc/security/limits.conf.
在文件尾部添加如下代码:
* soft nofile 10240
* hard nofile 10240
5.4、检查linux pam模块设置
经过以上修改,在有些系统中,用一般用户再登陆,仍然没有修改过来,那么需要检查是否有如下文件,如果没有,则要添加如下内容:
# vim /etc/pam.d/sshd
[Add the line]
session required /lib/security/pam_limits.so
5.5、检查SSH服务登陆配置
如果仍然不行,那么需要修改如下文件:
# vim /etc/ssh/sshd_config
[May need to modify or add the line]
UsePrivilegeSeparation no