ulimit工具是性能调优的简单工具而且也是Linux内置的一个功能,它的目的是用于控制由Shell运行的进程所能使用的系统最大资源。其实在生产环境中部署Linux后通常都会用这个工具去调整一些参数来交付使用,当然这个过程往往都是自动完成的,工具使用很简单,但是它涉及的知识还是比较多的。
1
|
ulimit
-a 查看所有限制,如果不加-H参数则默认显示软限制。
|
这里显示的是系统默认设置,我没有做任何调整。
ulimit用于限制shell启动进程所用的资源,内核文件大小、进程数据块大小、shell进程创建的文件大小、内存锁住大小、最大可用内存大小、最大可用虚拟内存大小、最大文件描述符大小、CPU时间、分配堆栈大小、单个用户的最大线程数量。它支持硬限制和软限制。
上面提到【限制shell】启动进程,其实这也就表明了它的作用范围,它不是用来限制系统的,仅仅是用来限制当前登录shell的用户所启动的进程的。临时调整参数的话仅对当前shell有效,关闭则失效,同时不影响其他shell;当然也可以永久生效这需要修改登录时shell读取的文件。
下面说一下参数含义:
参数 | 含义 |
-H | 设置硬限制, ulimit -Hn 1024 表示硬限制,限制最大文件描述符为1024。硬限制是绝对不能超过这个值。 |
-S | 设置软限制,ulimit -Sn 1024 表示软限制,限制最大文件描述符为1024,软限制不能大于硬限制,在不超过硬限制的前提下,可以超过软限制使用一段时间。超过该时间就自动清除。 |
-a | 限制当前所有的限制信息,默认为软限制。 |
-c | 最大的core文件大小,以blocks为单位。块大小取决于你系统分区使用的块为多大。 |
-d |
进程占用的最大数据段大小,以bytes为单位 |
-f |
进程可以创建的单个文件为多大,以blocks为单位。ulimit -f 100 限制进程最大可以创建100块大小的文件。 |
-i | 可以被挂起或者阻塞的最大信号数量 |
-l | 最大可加锁内存大小,以bytes为单位。这个值对普通用户生效,对管理员不起作用。不过有一个知识需要了解,就是为什么要对内存加锁?抛开虚拟地址空间不说,总之进程和数据都会在物理内存中,只要进程和数据当前都是活动的。不过我们也知道,内存管理有换进换出机制,采用最近最少原则,这些数据暂时性的交换到SWAP分区中,也就是虚拟内存中,而在需要的时候在交换进物理内存。内存加锁就是将数据锁定在物理内存中,避免换进换出。这样可以提高效率,对某些应用需要这样设置,比如数据库、或者对安全性要求高的,但大部分不需要。所以这个参数就是设定进程最大可以锁定多少内存。 |
-m | 进程可用的最大内存数量,以bytes为单位。很多系统设置无效。 |
-n |
进程可以打开的最大文件描述符数量,也就是一个进程可以最多打开多少个文件。 |
-p |
管道缓冲区大小,以bytes为单位。 |
-q | 限制程序使用POSIX消息队列的最大值 |
-r | 限制程序的实时优先级范围,只针对普通用户有效。 |
-s |
线程栈大小,以bytes为单位 |
-t |
进程最多可以占用CPU多久,以秒为单位 |
-u |
用户最大可运行的进程数,只针对普通用户有效。 |
-v |
进程最多可用多少虚拟内存,以bytes为单位 |
如何使用:
临时使用,仅在当前shell中生效,退出失效,且不影响其他shell
1
|
ulimit
-参数 值
|
永久针对某一用户生效
在某一用户的家目录中.bashrc文件中
修改/etc/security/limits.conf文件,不过推荐在/etc/security/limit.d下建立一个.conf的文件在这里写。这样便于管理。在limits.conf文件中有书写格式,参照该格式写就可以。通过第二种方式不但可以对用户还可以针对某一用户组的用户来设置。
作用范围:
上面已经提到过作用范围,这里再次强调一下ulimit的作用范围不是限制系统的,而是限制当前登录shell的用户以及他所启动的进程的。
比如同一个用户,登录了2个shell,在第一个shell中设置了ulimit -n 10,而另外一个保持默认,那么最大文件描述符为10这个限制仅对该用户登录的第一个shell生效。
举例说明:
-f 限制可以创建的最大文件大小
我这里设置了最大为100个blocks,而我要创建的大小为4.9MB,当创建的时候被拒绝。
-m 最大内存使用限制(经测试无效)
无论你是ls还是cat去查看一个4.9M的文件都没有阻拦
其他说明:
比如有些时候你会收到最大文件数量不足的提示,你通过ulimit -n只能查看当前shell的登录用户最大打开多少文件,但是无法得知到底使用了多少,其实系统这个提示是针对所有用户和进程的,你需要另外的方法查看。
现在这个命令是查看当前系统可以打开多少文件描述符,以及目前使用了多少。
1
|
cat
/proc/sys/fs/file-nr
|
1728:当前使用了多少 0:回收了多少 186726:当前系统总共可以打开多少
1
|
cat
/proc/sys/fs/file-max
|
查看系统最大可以打开多少文件描述符,这个值和上面的最后一个值相等。
file-max显然比ulimit -n的值多,这就是它们的区别,file-max表示当前系统可以打开的最大文件数量,它包括所有用户和所有进程,而ulimit -n只是显示当前用户或者说是进程级别可以打开的数量。它们是在不同层次。如果你要修改系统级别的资源限制,就要修改/etc/sysctl.conf文件。
比如fs.file-max=65536 把这个写入到这个文件,那么系统的最大文件描述符数量就是65535了。最后使用sysctl -p使其生效。