前段时间去面试滴滴,面试官问了一些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的使用方式及作用范围
在用户的启动脚本里
如果用户使用的是bash,就可以在用户目录下的.bashrc文件中,加入ulimit -u 64,来限制用户最多可以使用64个进程,此外,可以在于.bashrc功能相当的启动脚本中加入ulimit
应用程序的启动脚本中
编写个简单的启动脚本startmyapp
#/bin/sh
ulimit -n 512
myapp.sh
以这个startmyapp启动myapp.sh时,myapp.sh这个脚本打开的文件句柄数不超过512个
直接控制台输入
[root@web ~]#ulimit -p 512
限制管道缓冲区为256k
ulimit作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit限制的是当前shell进程以及其派生的子进程
举例来说,如果用户同时运行了两个shell终端进程,只在其中一个环境中执行了ulimit -s 100,则该shell进程里创建文件的大小收到相应的限制,而同时另一个shell终端包括其上运行的子程序都不会受到其影响
ulimit相关配置文件
主配置文件:/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 对应相应的值
编辑保存之后,需要重新登录一次才能生效