ulimit是什么?
ulimit命令用于控制shell程序的资源
如果你在某个shell下直接执行一条命令,那么这个新进程一般就继承了shell的资源限制。
ulimit能干什么?
- 设置可以生成的core文件最大为多少。
这里的单位是page,想看page的大小可以通过# getconf PAGE_SIZE
,一般为4K。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26# ls
file_test file_test.c
# ulimit -c unlimited
# ./file_test
段错误 (核心已转储)
# ll
总用量 144
-rw------- 1 gean gean 385024 5月 7 15:29 core
-rwxr-xr-x 1 gean gean 19224 5月 7 14:52 file_test
-rw-r--r-- 1 gean gean 2380 5月 7 14:51 file_test.c
# ulimit -c 10
# ./file_test
段错误 (核心已转储)
# ll
总用量 36
-rw------- 1 gean gean 12288 5月 7 15:30 core
-rwxr-xr-x 1 gean gean 19224 5月 7 14:52 file_test
-rw-r--r-- 1 gean gean 2380 5月 7 14:51 file_test.c
# ulimit -c 0
# rm core
# ./file_test
段错误
# ll
总用量 24
-rwxr-xr-x 1 gean gean 19224 5月 7 14:52 file_test
-rw-r--r-- 1 gean gean 2380 5月 7 14:51 file_test.c - 设置进程数据段最大为多少。
这里的单位是KB,想知道进程会占用多大的数据段可以通过# cat /proc/[pid]/status |grep VmData
我的程序数据段大小为176KB。1
2
3
4
5
6
7# ulimit -d
180
# ./file_test
^C
# ulimit -d 170
# ./file_test
段错误 - 设置调度优先级最大为多少。
这里的优先级为nice,值范围为-19~20。值越小优先级越高。
所以当使用# ulimit -e
时可设置的值最大为39。当设置为35时,优先级最高为-15。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# ulimit -e
39
# nice -n -19 ./file_test
^C
# ulimit -e 35
# nice -n -19 ./file_test
nice: 无法设置优先级: 权限不够
^C
# nice -n -15 ./file_test
^C
# ulimit -e 20
# nice -n -1 ./file_test
nice: 无法设置优先级: 权限不够
^C
# nice -n 0 ./file_test
^C - 设置可以创建的文件最大为多少。
这里的单位是page。1
2
3
4
5
6
7
8
9# ulimit -f
unlimited
# ./file_test
# ll test/file_test
-rw-r--r-- 1 gean gean 7000 5月 7 17:19 test/file_test
# ulimit -f 1
# rm test/*
# ./file_test
文件大小超出限制 - 设置可以挂起的信号最多是多少。
不懂,以后更新
- 设置可以锁住的物理内存的最大值。
不懂,以后更新
- 设置可以使用的常驻内存的最大值。
不懂,以后更新
- 设置进程可以同时打开多少文件。
可以通过ll /proc/[pid]/fd
查看进程会占用多少fd。1
2
3
4
5
6
7
8# ulimit -n
1024
# ./file_test
^C
# ulimit -n 3
# ./file_test
bash: start_pipeline: pgrp pipe: Too many open files
./file_test: error while loading shared libraries: libc.so.6: cannot open shared object file: Error 24 - 设置管道缓冲区最大为多少。
不懂,以后更新
- 设置POSIX消息队列中的最大字节数。
不懂,以后更新
- 设置最大实时调度优先级。
不懂,以后更新
- 设置最大堆栈大小。
可以通过# ulimit -s [size(KB)]
设置。
设置完成后我们可以通过# cat /proc/[pid]/maps
查看stack用了多少((尾地址-首地址)/1024)。 - 设置最大cpu时间。
这里单位是秒,我设为2秒,果然被杀死。
这里注意如果你的程序不占用cpu时间超过2秒就不会被杀死。1
2
3# ulimit -t 2
# dd if=/dev/zero of=test/file_test bs=1024 count=2621440
已杀死 - 设置用户进程的最大数目。
可以通过# ulimit -u [count]
命令来设置
测试时发现不能创建到[count]这么多,因为原本就有进程在跑,或者还有其他限制。但是该设置是有效果的。
附上测试程序:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include<stdio.h>
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t pid;
int i=0;
while(1)
{
pid = fork();
if(pid == 0)
break;
else if(pid == -1)
{
perror("create error");
break;
}
printf("%d process\n",i++);
}
} - 设置虚拟内存的大小。
可以通过# cat /proc/[pid]/status|grep VmPeak
查看程序占用的虚拟内存。1
2
3# ulimit -v 2000
# ./file_test
./file_test: error while loading shared libraries: libc.so.6: failed to map segment from shared object - 设置文件锁的最大数量。
不懂,以后更新
如何永久设置ulimit
参考红帽的手册
总结
ulimit工具在linux这样多用户的操作系统中十分有用,能帮助我们调优性能。